From 9ac9fe914f2f9535154bd5785b9ea401365e14d6 Mon Sep 17 00:00:00 2001
From: Přemysl Janouch <p.janouch@gmail.com>
Date: Mon, 23 Nov 2015 02:43:00 +0100
Subject: Allow retrying on errors

The GUI code stinks and it's not really worth my time.
---
 sensei-raw-ctl-gui.c | 69 +++++++++++++++++++++++++++++++++-------------------
 1 file changed, 44 insertions(+), 25 deletions(-)

diff --git a/sensei-raw-ctl-gui.c b/sensei-raw-ctl-gui.c
index 146e051..6c4ee99 100644
--- a/sensei-raw-ctl-gui.c
+++ b/sensei-raw-ctl-gui.c
@@ -64,17 +64,22 @@ enum
 
 // ----- User interface -------------------------------------------------------
 
-static void
-fatal (GtkWidget *parent, const gchar *message)
+static gboolean
+user_wants_to_retry_critical_op (GtkWidget *parent, const gchar *message)
 {
 	GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
 		GTK_DIALOG_DESTROY_WITH_PARENT,
-		GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("Fatal error"));
+		GTK_MESSAGE_ERROR, GTK_BUTTONS_NONE, _("Error"));
+	gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+		_("_Retry"), TRUE, _("_Close"), FALSE, NULL);
 	gtk_message_dialog_format_secondary_text
 		(GTK_MESSAGE_DIALOG (dialog), "%s", message);
-	gtk_dialog_run (GTK_DIALOG (dialog));
+
+	gboolean success = gtk_dialog_run (GTK_DIALOG (dialog));
 	gtk_widget_destroy (dialog);
-	gtk_main_quit ();
+	if (!success)
+		gtk_main_quit ();
+	return success;
 }
 
 static void
@@ -88,29 +93,37 @@ set_page (GtkBuilder *builder, gint page)
 static gboolean
 spawn_ctl (gchar **argv, gchar **out, GtkBuilder *builder)
 {
-	GError *error = NULL;
-	gint status;
-	gchar *err;
-
 	GtkWidget *win = GTK_WIDGET (gtk_builder_get_object (builder, "win"));
-	if (!g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
-		out, &err, &status, &error))
+	gboolean trying = TRUE;
+	while (trying)
 	{
-		fatal (win, error->message);
-		g_error_free (error);
-		return FALSE;
-	}
+		GError *error = NULL;
+		gchar *err = NULL;
+		gint status;
+
+		if (!g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL,
+			out, &err, &status, &error))
+		{
+			trying = user_wants_to_retry_critical_op (win, error->message);
+			g_error_free (error);
+			continue;
+		}
 
-	if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
-		return TRUE;
+		if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
+		{
+			g_free (err);
+			return TRUE;
+		}
 
-	if (strstr (err, "no suitable device"))
-		set_page (builder, PAGE_NO_DEVICE);
-	else
-		fatal (win, err);
+		trying = FALSE;
+		if (strstr (err, "no suitable device"))
+			set_page (builder, PAGE_NO_DEVICE);
+		else
+			trying = user_wants_to_retry_critical_op (win, err);
 
-	g_clear_pointer (out, g_free);
-	g_free (err);
+		g_clear_pointer (out, g_free);
+		g_free (err);
+	}
 	return FALSE;
 }
 
@@ -199,8 +212,14 @@ out:
 	g_free (out);
 
 	if (line != OUT_COUNT)
-		fatal (GTK_WIDGET (gtk_builder_get_object (builder, "win")),
-			_("Internal error"));
+	{
+		GtkWidget *dialog = gtk_message_dialog_new (
+			GTK_WINDOW (gtk_builder_get_object (builder, "win")),
+			GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR,
+			GTK_BUTTONS_CLOSE, _("Internal error: backend mismatch"));
+		gtk_dialog_run (GTK_DIALOG (dialog));
+		gtk_widget_destroy (dialog);
+	}
 }
 
 static void
-- 
cgit v1.2.3-70-g09d2