diff options
-rw-r--r-- | libnautilus-private/nautilus-file-operations.c | 42 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file-operations.h | 1 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file.c | 4 | ||||
-rw-r--r-- | 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 811ff8661..8012b3c0c 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 55f747931..e0af1001c 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 d554376c6..fd16e6f30 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 b6fda4df6..02601b72c 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); |