[nautilus/gnome-3-6] places-sidebar: make sure to always notify when unmounting



commit 0e796d23d782592971591781bdd7d9194701fb4c
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Tue Dec 11 11:25:45 2012 -0500

    places-sidebar: make sure to always notify when unmounting
    
    When unmounting from the sidebar with an operation other than eject, we
    still need to set up the progress notification, as some drives return
    FALSE for can_eject.
    
    https://bugzilla.redhat.com/show_bug.cgi?id=885133

 libnautilus-private/nautilus-file-operations.c |   42 ++++++++-----
 libnautilus-private/nautilus-file-operations.h |    1 +
 libnautilus-private/nautilus-file.c            |    4 +-
 src/nautilus-places-sidebar.c                  |   79 +++++++++++++----------
 4 files changed, 74 insertions(+), 52 deletions(-)
---
diff --git a/libnautilus-private/nautilus-file-operations.c b/libnautilus-private/nautilus-file-operations.c
index 811ff86..8012b3c 100644
--- a/libnautilus-private/nautilus-file-operations.c
+++ b/libnautilus-private/nautilus-file-operations.c
@@ -2028,12 +2028,26 @@ nautilus_file_operations_delete (GList                  *files,
 typedef struct {
 	gboolean eject;
 	GMount *mount;
+	GMountOperation *mount_operation;
 	GtkWindow *parent_window;
 	NautilusUnmountCallback callback;
 	gpointer callback_data;
 } UnmountData;
 
 static void
+unmount_data_free (UnmountData *data)
+{
+	if (data->parent_window) {
+		g_object_remove_weak_pointer (G_OBJECT (data->parent_window),
+					      (gpointer *) &data->parent_window);
+	}
+
+	g_clear_object (&data->mount_operation);
+	g_object_unref (data->mount);
+	g_free (data);
+}
+
+static void
 unmount_mount_callback (GObject *source_object,
 			GAsyncResult *res,
 			gpointer user_data)
@@ -2073,14 +2087,8 @@ unmount_mount_callback (GObject *source_object,
 	if (error != NULL) {
 		g_error_free (error);
 	}
-	
-	if (data->parent_window) {
-		g_object_remove_weak_pointer (G_OBJECT (data->parent_window),
-					      (gpointer *) &data->parent_window);
-	}
 
-	g_object_unref (data->mount);
-	g_free (data);
+	unmount_data_free (data);
 }
 
 static void
@@ -2088,7 +2096,11 @@ do_unmount (UnmountData *data)
 {
 	GMountOperation *mount_op;
 
-	mount_op = gtk_mount_operation_new (data->parent_window);
+	if (data->mount_operation) {
+		mount_op = g_object_ref (data->mount_operation);
+	} else {
+		mount_op = gtk_mount_operation_new (data->parent_window);
+	}
 	if (data->eject) {
 		g_mount_eject_with_operation (data->mount,
 					      0,
@@ -2260,6 +2272,7 @@ empty_trash_for_unmount_done (gboolean success,
 void
 nautilus_file_operations_unmount_mount_full (GtkWindow                      *parent_window,
 					     GMount                         *mount,
+					     GMountOperation                *mount_operation,
 					     gboolean                        eject,
 					     gboolean                        check_trash,
 					     NautilusUnmountCallback         callback,
@@ -2277,6 +2290,9 @@ nautilus_file_operations_unmount_mount_full (GtkWindow                      *par
 					   (gpointer *) &data->parent_window);
 		
 	}
+	if (mount_operation) {
+		data->mount_operation = g_object_ref (mount_operation);
+	}
 	data->eject = eject;
 	data->mount = g_object_ref (mount);
 
@@ -2302,13 +2318,7 @@ nautilus_file_operations_unmount_mount_full (GtkWindow                      *par
 				callback (callback_data);
 			}
 
-			if (data->parent_window) {
-				g_object_remove_weak_pointer (G_OBJECT (data->parent_window),
-							      (gpointer *) &data->parent_window);
-			}
-
-			g_object_unref (data->mount);
-			g_free (data);
+			unmount_data_free (data);
 			return;
 		}
 	}
@@ -2322,7 +2332,7 @@ nautilus_file_operations_unmount_mount (GtkWindow                      *parent_w
 					gboolean                        eject,
 					gboolean                        check_trash)
 {
-	nautilus_file_operations_unmount_mount_full (parent_window, mount, eject,
+	nautilus_file_operations_unmount_mount_full (parent_window, mount, NULL, eject,
 						     check_trash, NULL, NULL);
 }
 
diff --git a/libnautilus-private/nautilus-file-operations.h b/libnautilus-private/nautilus-file-operations.h
index 55f7479..e0af100 100644
--- a/libnautilus-private/nautilus-file-operations.h
+++ b/libnautilus-private/nautilus-file-operations.h
@@ -107,6 +107,7 @@ void nautilus_file_operations_unmount_mount (GtkWindow                      *par
 					     gboolean                        check_trash);
 void nautilus_file_operations_unmount_mount_full (GtkWindow                 *parent_window,
 						  GMount                    *mount,
+						  GMountOperation           *mount_operation,
 						  gboolean                   eject,
 						  gboolean                   check_trash,
 						  NautilusUnmountCallback    callback,
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index d554376..fd16e6f 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -1262,7 +1262,7 @@ nautilus_file_unmount (NautilusFile                   *file,
 		data->file = nautilus_file_ref (file);
 		data->callback = callback;
 		data->callback_data = callback_data;
-		nautilus_file_operations_unmount_mount_full (NULL, file->details->mount, FALSE, TRUE, unmount_done, data);
+		nautilus_file_operations_unmount_mount_full (NULL, file->details->mount, NULL, FALSE, TRUE, unmount_done, data);
 	} else if (callback) {
 		callback (file, NULL, NULL, callback_data);
 	}
@@ -1296,7 +1296,7 @@ nautilus_file_eject (NautilusFile                   *file,
 		data->file = nautilus_file_ref (file);
 		data->callback = callback;
 		data->callback_data = callback_data;
-		nautilus_file_operations_unmount_mount_full (NULL, file->details->mount, TRUE, TRUE, unmount_done, data);
+		nautilus_file_operations_unmount_mount_full (NULL, file->details->mount, NULL, TRUE, TRUE, unmount_done, data);
 	} else if (callback) {
 		callback (file, NULL, NULL, callback_data);
 	}
diff --git a/src/nautilus-places-sidebar.c b/src/nautilus-places-sidebar.c
index b6fda4d..02601b7 100644
--- a/src/nautilus-places-sidebar.c
+++ b/src/nautilus-places-sidebar.c
@@ -2011,13 +2011,55 @@ unmount_done (gpointer data)
 }
 
 static void
+show_unmount_progress_cb (GMountOperation *op,
+			  const gchar *message,
+			  gint64 time_left,
+			  gint64 bytes_left,
+			  gpointer user_data)
+{
+	NautilusApplication *app = NAUTILUS_APPLICATION (g_application_get_default ());
+
+	if (bytes_left == 0) {
+		nautilus_application_notify_unmount_done (app, message);
+	} else {
+		nautilus_application_notify_unmount_show (app, message);
+	}
+}
+
+static void
+show_unmount_progress_aborted_cb (GMountOperation *op,
+				  gpointer user_data)
+{
+	NautilusApplication *app = NAUTILUS_APPLICATION (g_application_get_default ());
+	nautilus_application_notify_unmount_done (app, NULL);
+}
+
+static GMountOperation *
+get_unmount_operation (NautilusPlacesSidebar *sidebar)
+{
+	GMountOperation *mount_op;
+
+	mount_op = gtk_mount_operation_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (sidebar))));
+	g_signal_connect (mount_op, "show-unmount-progress",
+			  G_CALLBACK (show_unmount_progress_cb), sidebar);
+	g_signal_connect (mount_op, "aborted",
+			  G_CALLBACK (show_unmount_progress_aborted_cb), sidebar);
+
+	return mount_op;
+}
+
+static void
 do_unmount (GMount *mount,
 	    NautilusPlacesSidebar *sidebar)
 {
+	GMountOperation *mount_op;
+
 	if (mount != NULL) {
-		nautilus_file_operations_unmount_mount_full (NULL, mount, FALSE, TRUE,
+		mount_op = get_unmount_operation (sidebar);
+		nautilus_file_operations_unmount_mount_full (NULL, mount, mount_op, FALSE, TRUE,
 							     unmount_done,
 							     g_object_ref (sidebar->window));
+		g_object_unref (mount_op);
 	}
 }
 
@@ -2049,30 +2091,6 @@ unmount_shortcut_cb (GtkMenuItem           *item,
 }
 
 static void
-show_unmount_progress_cb (GMountOperation *op,
-			  const gchar *message,
-			  gint64 time_left,
-			  gint64 bytes_left,
-			  gpointer user_data)
-{
-	NautilusApplication *app = NAUTILUS_APPLICATION (g_application_get_default ());
-
-	if (bytes_left == 0) {
-		nautilus_application_notify_unmount_done (app, message);
-	} else {
-		nautilus_application_notify_unmount_show (app, message);
-	}
-}
-
-static void
-show_unmount_progress_aborted_cb (GMountOperation *op,
-				  gpointer user_data)
-{
-	NautilusApplication *app = NAUTILUS_APPLICATION (g_application_get_default ());
-	nautilus_application_notify_unmount_done (app, NULL);
-}
-
-static void
 drive_eject_cb (GObject *source_object,
 		GAsyncResult *res,
 		gpointer user_data)
@@ -2162,9 +2180,8 @@ do_eject (GMount *mount,
 	  GDrive *drive,
 	  NautilusPlacesSidebar *sidebar)
 {
-	GMountOperation *mount_op;
+	GMountOperation *mount_op = get_unmount_operation (sidebar);
 
-	mount_op = gtk_mount_operation_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (sidebar))));
 	if (mount != NULL) {
 		g_mount_eject_with_operation (mount, 0, mount_op, NULL, mount_eject_cb,
 					      g_object_ref (sidebar->window));
@@ -2176,10 +2193,6 @@ do_eject (GMount *mount,
 					      g_object_ref (sidebar->window));
 	}
 
-	g_signal_connect (mount_op, "show-unmount-progress",
-			  G_CALLBACK (show_unmount_progress_cb), sidebar);
-	g_signal_connect (mount_op, "aborted",
-			  G_CALLBACK (show_unmount_progress_aborted_cb), sidebar);
 	g_object_unref (mount_op);
 }
 
@@ -2417,9 +2430,7 @@ stop_shortcut_cb (GtkMenuItem           *item,
 			    -1);
 
 	if (drive != NULL) {
-		GMountOperation *mount_op;
-
-		mount_op = gtk_mount_operation_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (sidebar))));
+		GMountOperation *mount_op = get_unmount_operation (sidebar);
 		g_drive_stop (drive, G_MOUNT_UNMOUNT_NONE, mount_op, NULL, drive_stop_cb,
 			      g_object_ref (sidebar->window));
 		g_object_unref (mount_op);



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