[gnome-disk-utility] Prompt to stop jobs when closing



commit 9a9a214f6f5d554d64bb397ef84ab5e9924685c6
Author: Kai Lüke <kailueke riseup net>
Date:   Mon May 15 17:53:16 2017 +0200

    Prompt to stop jobs when closing
    
    Closing Disks used to silently discontinue running
    jobs like restoring or creating disk images.
    
    Now a message dialog warns that closing Disk will
    also stop the jobs.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=732567

 src/disks/gduapplication.c |   33 ++++++++++++++++++++++++++++++++-
 src/disks/gduapplication.h |    2 ++
 src/disks/gduwindow.c      |   14 ++++++++++++++
 3 files changed, 48 insertions(+), 1 deletions(-)
---
diff --git a/src/disks/gduapplication.c b/src/disks/gduapplication.c
index 7b67740..61b1f44 100644
--- a/src/disks/gduapplication.c
+++ b/src/disks/gduapplication.c
@@ -76,6 +76,35 @@ gdu_application_finalize (GObject *object)
   G_OBJECT_CLASS (gdu_application_parent_class)->finalize (object);
 }
 
+
+gboolean
+gdu_application_should_exit (GduApplication *app)
+{
+  GtkWidget *dialog;
+  gint response;
+
+  if (app->local_jobs != NULL && g_hash_table_size (app->local_jobs) != 0)
+    {
+      dialog = gtk_message_dialog_new (GTK_WINDOW (app->window),
+                                       GTK_DIALOG_DESTROY_WITH_PARENT,
+                                       GTK_MESSAGE_WARNING,
+                                       GTK_BUTTONS_OK_CANCEL,
+                                       _("Stop running jobs?"));
+      gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+                                                _("Closing now stops the running jobs and leads to a corrupt 
result."));
+
+      response = gtk_dialog_run (GTK_DIALOG (dialog));
+      gtk_widget_destroy (dialog);
+
+      if (response != GTK_RESPONSE_OK)
+        return FALSE;
+
+    }
+
+  return TRUE;
+}
+
+
 /* ---------------------------------------------------------------------------------------------------- */
 
 static void
@@ -326,7 +355,9 @@ quit_activated (GSimpleAction *action,
                 gpointer       user_data)
 {
   GduApplication *app = GDU_APPLICATION (user_data);
-  gtk_widget_destroy (GTK_WIDGET (app->window));
+
+  if (gdu_application_should_exit (app))
+    gtk_widget_destroy (GTK_WIDGET (app->window));
 }
 
 static void
diff --git a/src/disks/gduapplication.h b/src/disks/gduapplication.h
index 9df33e5..fb3911a 100644
--- a/src/disks/gduapplication.h
+++ b/src/disks/gduapplication.h
@@ -27,6 +27,8 @@ GObject      *gdu_application_new_widget (GduApplication  *application,
                                           const gchar     *name,
                                           GtkBuilder     **out_builder);
 
+gboolean      gdu_application_should_exit       (GduApplication *application);
+
 GduLocalJob  *gdu_application_create_local_job  (GduApplication *application,
                                                  UDisksObject   *object);
 void          gdu_application_destroy_local_job (GduApplication *application,
diff --git a/src/disks/gduwindow.c b/src/disks/gduwindow.c
index c264fd6..7f7dc0a 100644
--- a/src/disks/gduwindow.c
+++ b/src/disks/gduwindow.c
@@ -348,6 +348,15 @@ gdu_window_init (GduWindow *window)
 static void on_client_changed (UDisksClient  *client,
                                gpointer       user_data);
 
+static
+gboolean
+on_delete_event (GtkWidget *widget,
+                 GdkEvent  *event,
+                 gpointer user_data)
+{
+  return !gdu_application_should_exit (GDU_WINDOW (widget)->application);
+}
+
 static void
 gdu_window_finalize (GObject *object)
 {
@@ -1347,6 +1356,11 @@ gdu_window_constructed (GObject *object)
                     G_CALLBACK (on_activate_link),
                     window);
 
+  g_signal_connect (window,
+                    "delete-event",
+                    G_CALLBACK (on_delete_event),
+                    NULL);
+
   ensure_something_selected (window);
   gtk_widget_grab_focus (window->device_tree_treeview);
   update_all (window);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]