Blob Blame Raw
From 76f5e0e98a86e5a91f636ae2fb74c5b6663208ab Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Wed, 8 Jan 2014 19:25:03 -0500
Subject: [PATCH 2/2] Make dialog work with --xid again

When triggering an async operation from a GApplicationCommandline,
we must use g_application_hold/release to ensure the application
instance stays around until the operation is done.

https://bugzilla.gnome.org/show_bug.cgi?id=721278
---
 src/disks/gduapplication.c        |  4 +++-
 src/disks/gduformatvolumedialog.c | 19 +++++++++++++++----
 src/disks/gduformatvolumedialog.h |  4 +++-
 3 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/src/disks/gduapplication.c b/src/disks/gduapplication.c
index 1334d28..78d6272 100644
--- a/src/disks/gduapplication.c
+++ b/src/disks/gduapplication.c
@@ -251,7 +251,9 @@ gdu_application_command_line (GApplication            *_app,
     }
   else if (opt_format)
     {
-      gdu_format_volume_dialog_show_for_xid (app->client, opt_xid, object_to_select);
+      g_application_hold (_app);
+      gdu_format_volume_dialog_show_for_xid (app->client, opt_xid, object_to_select,
+                                             (GCallback)g_application_release, _app);
     }
 
 
diff --git a/src/disks/gduformatvolumedialog.c b/src/disks/gduformatvolumedialog.c
index f741ade..2e0ca79 100644
--- a/src/disks/gduformatvolumedialog.c
+++ b/src/disks/gduformatvolumedialog.c
@@ -33,11 +33,16 @@ typedef struct
 
   GtkWidget *contents_box;
   GtkWidget *create_filesystem_widget;
+
+  GCallback finished_cb;
+  gpointer  cb_data;
 } FormatVolumeData;
 
 static void
 format_volume_data_free (FormatVolumeData *data)
 {
+  if (data->finished_cb)
+    ((GDestroyNotify) data->finished_cb) (data->cb_data);
   g_clear_object (&data->parent_window);
   g_object_unref (data->object);
   g_object_unref (data->block);
@@ -144,13 +149,17 @@ static void
 gdu_format_volume_dialog_show_internal (UDisksClient *client,
                                         GtkWindow    *parent_window,
                                         gint          parent_xid,
-                                        UDisksObject *object)
+                                        UDisksObject *object,
+                                        GCallback     finished_cb,
+                                        gpointer      cb_data)
 {
   GduApplication *app = GDU_APPLICATION (g_application_get_default ());
   FormatVolumeData *data;
   gint response;
 
   data = g_new0 (FormatVolumeData, 1);
+  data->finished_cb = finished_cb;
+  data->cb_data = cb_data;
   data->parent_window = (parent_window != NULL) ? g_object_ref (parent_window) : NULL;
   data->object = g_object_ref (object);
   data->block = udisks_object_get_block (object);
@@ -250,9 +259,11 @@ gdu_format_volume_dialog_show_internal (UDisksClient *client,
 void
 gdu_format_volume_dialog_show_for_xid (UDisksClient *client,
                                        gint          xid,
-                                       UDisksObject *object)
+                                       UDisksObject *object,
+                                       GCallback     finished_cb,
+                                       gpointer      cb_data)
 {
-  gdu_format_volume_dialog_show_internal (client, NULL, xid, object);
+  gdu_format_volume_dialog_show_internal (client, NULL, xid, object, finished_cb, cb_data);
 }
 
 void
@@ -260,5 +271,5 @@ gdu_format_volume_dialog_show (GduWindow    *window,
                                UDisksObject *object)
 {
   gdu_format_volume_dialog_show_internal (gdu_window_get_client (window), GTK_WINDOW (window),
-                                          -1, object);
+                                          -1, object, NULL, NULL);
 }
diff --git a/src/disks/gduformatvolumedialog.h b/src/disks/gduformatvolumedialog.h
index 62a43ef..3721fbb 100644
--- a/src/disks/gduformatvolumedialog.h
+++ b/src/disks/gduformatvolumedialog.h
@@ -19,7 +19,9 @@ void     gdu_format_volume_dialog_show         (GduWindow    *window,
                                                 UDisksObject *object);
 void     gdu_format_volume_dialog_show_for_xid (UDisksClient *client,
                                                 gint          xid,
-                                                UDisksObject *object);
+                                                UDisksObject *object,
+                                                GCallback     finished_cb,
+                                                gpointer      cb_data);
 
 G_END_DECLS
 
-- 
1.8.4.2