Dominique Leuenberger
e9670224ab
Supersede, use correct bug tags... -- This sr fixes missing notifications when mounting usb harddrives OBS-URL: https://build.opensuse.org/request/show/146727 OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/nautilus?expand=0&rev=181
276 lines
9.3 KiB
Diff
276 lines
9.3 KiB
Diff
From 463e8d1b1922474e4cf591a3029ea813804bd3e7 Mon Sep 17 00:00:00 2001
|
|
From: Cosimo Cecchi <cosimoc@gnome.org>
|
|
Date: Tue, 11 Dec 2012 16:25:45 +0000
|
|
Subject: 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
|
|
---
|
|
diff --git a/libnautilus-private/nautilus-file-operations.c b/libnautilus-private/nautilus-file-operations.c
|
|
index 85d5a6f..d955331 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 af42102..84be583 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 adf07fb..224a2da 100644
|
|
--- a/src/nautilus-places-sidebar.c
|
|
+++ b/src/nautilus-places-sidebar.c
|
|
@@ -1975,13 +1975,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);
|
|
}
|
|
}
|
|
|
|
@@ -2013,30 +2055,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)
|
|
@@ -2126,9 +2144,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));
|
|
@@ -2140,10 +2157,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);
|
|
}
|
|
|
|
@@ -2381,9 +2394,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);
|
|
--
|
|
cgit v0.9.0.2
|
|
|