[nautilus] undo: pass in a GtkWindow for undo operations



commit f76844a3208033a97532222ce531bd9a04205871
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Mon Jan 16 22:47:03 2012 -0500

    undo: pass in a GtkWindow for undo operations
    
    So that dialogs triggered by the file operations can correctly be
    parented.

 libnautilus-private/nautilus-file-undo-manager.c   |   11 +-
 libnautilus-private/nautilus-file-undo-manager.h   |    4 +-
 .../nautilus-file-undo-operations.c                |   71 ++++++-----
 libnautilus-private/nautilus-file-undo-types.h     |    7 +-
 src/nautilus-view.c                                |  130 +++++++++++---------
 5 files changed, 122 insertions(+), 101 deletions(-)
---
diff --git a/libnautilus-private/nautilus-file-undo-manager.c b/libnautilus-private/nautilus-file-undo-manager.c
index 81a451d..8a53490 100644
--- a/libnautilus-private/nautilus-file-undo-manager.c
+++ b/libnautilus-private/nautilus-file-undo-manager.c
@@ -453,6 +453,7 @@ get_redo_description (NautilusFileUndoData *action)
 
 static void
 do_undo_redo (NautilusFileUndoManager *self,
+	      GtkWindow *parent_window,
 	      gboolean undo,
 	      NautilusFileUndoFinishCallback callback,
 	      gpointer user_data)
@@ -482,9 +483,9 @@ do_undo_redo (NautilusFileUndoManager *self,
 		priv->undo_redo_flag = TRUE;
 
 		if (undo) {
-			action->undo_func (action);
+			action->undo_func (action, parent_window);
 		} else {
-			action->redo_func (action);
+			action->redo_func (action, parent_window);
 		}
 	}
 
@@ -495,18 +496,20 @@ do_undo_redo (NautilusFileUndoManager *self,
 
 void
 nautilus_file_undo_manager_redo (NautilusFileUndoManager        *manager,
+				 GtkWindow                      *parent_window,
                                   NautilusFileUndoFinishCallback  callback,
                                   gpointer                         user_data)
 {
-	do_undo_redo (manager, FALSE, callback, user_data);
+	do_undo_redo (manager, parent_window, FALSE, callback, user_data);
 }
 
 void
 nautilus_file_undo_manager_undo (NautilusFileUndoManager        *manager,
+				 GtkWindow                      *parent_window,
 				  NautilusFileUndoFinishCallback  callback,
 				  gpointer                         user_data)
 {
-	do_undo_redo (manager, TRUE, callback, user_data);
+	do_undo_redo (manager, parent_window, TRUE, callback, user_data);
 }
 
 void
diff --git a/libnautilus-private/nautilus-file-undo-manager.h b/libnautilus-private/nautilus-file-undo-manager.h
index f6a63a9..e88b8ce 100644
--- a/libnautilus-private/nautilus-file-undo-manager.h
+++ b/libnautilus-private/nautilus-file-undo-manager.h
@@ -70,9 +70,11 @@ NautilusFileUndoManager * nautilus_file_undo_manager_get (void);
 void nautilus_file_undo_manager_add_action (NautilusFileUndoManager *manager,
 					     NautilusFileUndoData *action);
 void nautilus_file_undo_manager_undo (NautilusFileUndoManager *manager,
+				      GtkWindow *parent_window,
 				       NautilusFileUndoFinishCallback callback,
 				       gpointer user_data);
-void nautilus_file_undo_manager_redo (NautilusFileUndoManager *manager, 
+void nautilus_file_undo_manager_redo (NautilusFileUndoManager *manager,
+				      GtkWindow *parent_window,
 				       NautilusFileUndoFinishCallback callback,
 				       gpointer user_data);
 
diff --git a/libnautilus-private/nautilus-file-undo-operations.c b/libnautilus-private/nautilus-file-undo-operations.c
index f2d61c9..7b87229 100644
--- a/libnautilus-private/nautilus-file-undo-operations.c
+++ b/libnautilus-private/nautilus-file-undo-operations.c
@@ -193,27 +193,29 @@ undo_redo_op_callback (gpointer callback_data)
 
 static void
 delete_files (NautilusFileUndoManager *self,
+	      GtkWindow *parent_window,
 	      GList *files,
 	      NautilusFileUndoData *action)
 {
-	nautilus_file_operations_delete (files, NULL,
+	nautilus_file_operations_delete (files, parent_window,
 					 undo_redo_done_delete_callback, action);
 }
 
 static void
-create_undo_func (NautilusFileUndoData *action)
+create_undo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	GList *files = NULL;
 	NautilusFileUndoDataCreate* eaction = (NautilusFileUndoDataCreate*) action;
 
 	files = g_list_append (files, g_object_ref (eaction->target_file));
-	delete_files (action->manager, files, action);
+	delete_files (action->manager, parent_window,
+		      files, action);
 
 	g_list_free_full (files, g_object_unref);
 }
 
 static void
-copy_or_link_undo_func (NautilusFileUndoData *action)
+copy_or_link_undo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	GList *files;
 	NautilusFileUndoDataExt* eaction = (NautilusFileUndoDataExt*) action;
@@ -221,21 +223,22 @@ copy_or_link_undo_func (NautilusFileUndoData *action)
 	files = g_list_copy (eaction->destinations);
 	files = g_list_reverse (files); /* Deleting must be done in reverse */
 
-	delete_files (action->manager, files, action);
+	delete_files (action->manager, parent_window,
+		      files, action);
 
 	g_list_free (files);
 }
 
 static void
-restore_undo_func (NautilusFileUndoData *action)
+restore_undo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	NautilusFileUndoDataExt* eaction = (NautilusFileUndoDataExt*) action;
-	nautilus_file_operations_trash_or_delete (eaction->destinations, NULL,
+	nautilus_file_operations_trash_or_delete (eaction->destinations, parent_window,
 						  undo_redo_done_delete_callback, action);
 }
 
 static void
-trash_undo_func (NautilusFileUndoData *action)
+trash_undo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	NautilusFileUndoManagerPrivate *priv = action->manager->priv;
 	GHashTable *files_to_restore;
@@ -275,16 +278,16 @@ trash_undo_func (NautilusFileUndoData *action)
 }
 
 static void
-move_undo_func (NautilusFileUndoData *action)
+move_undo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	NautilusFileUndoDataExt* eaction = (NautilusFileUndoDataExt*) action;
 	nautilus_file_operations_move (eaction->destinations, NULL,
-				       eaction->src_dir, NULL,
+				       eaction->src_dir, parent_window,
 				       undo_redo_done_transfer_callback, action);
 }
 
 static void
-rename_undo_func (NautilusFileUndoData *action)
+rename_undo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	gchar *new_name;
 	NautilusFile *file;
@@ -301,7 +304,7 @@ rename_undo_func (NautilusFileUndoData *action)
 }
 
 static void
-set_permissions_undo_func (NautilusFileUndoData *action)
+set_permissions_undo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	NautilusFile *file;
 	NautilusFileUndoDataPermissions* eaction = (NautilusFileUndoDataPermissions*) action;
@@ -316,7 +319,7 @@ set_permissions_undo_func (NautilusFileUndoData *action)
 }
 
 static void
-recursive_permissions_undo_func (NautilusFileUndoData *action)
+recursive_permissions_undo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	NautilusFileUndoManagerPrivate *priv = action->manager->priv;
 	NautilusFileUndoDataRecursivePermissions* eaction = (NautilusFileUndoDataRecursivePermissions*) action;
@@ -349,7 +352,7 @@ recursive_permissions_undo_func (NautilusFileUndoData *action)
 }
 
 static void
-change_group_undo_func (NautilusFileUndoData *action)
+change_group_undo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	NautilusFile *file;
 	NautilusFileUndoDataOwnership* eaction = (NautilusFileUndoDataOwnership*) action;
@@ -364,7 +367,7 @@ change_group_undo_func (NautilusFileUndoData *action)
 }
 
 static void
-change_owner_undo_func (NautilusFileUndoData *action)
+change_owner_undo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	NautilusFile *file;
 	NautilusFileUndoDataOwnership* eaction = (NautilusFileUndoDataOwnership*) action;
@@ -381,19 +384,19 @@ change_owner_undo_func (NautilusFileUndoData *action)
 /* redo helpers */
 
 static void
-copy_redo_func (NautilusFileUndoData *action)
+copy_redo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	GList *locations;
 	NautilusFileUndoDataExt* eaction = (NautilusFileUndoDataExt*) action;
 
 	locations = eaction->sources;
 	nautilus_file_operations_copy (locations, NULL,
-				       eaction->dest_dir, NULL,
+				       eaction->dest_dir, parent_window,
 				       undo_redo_done_transfer_callback, action);
 }
 
 static void
-create_from_template_redo_func (NautilusFileUndoData *action)
+create_from_template_redo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	GFile *parent;
 	gchar *parent_uri, *new_name;
@@ -413,7 +416,7 @@ create_from_template_redo_func (NautilusFileUndoData *action)
 }
 
 static void
-duplicate_redo_func (NautilusFileUndoData *action)
+duplicate_redo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	GList *locations;
 	NautilusFileUndoDataExt* eaction = (NautilusFileUndoDataExt*) action;
@@ -424,7 +427,7 @@ duplicate_redo_func (NautilusFileUndoData *action)
 }
 
 static void
-move_restore_redo_func (NautilusFileUndoData *action)
+move_restore_redo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	GList *locations;
 	NautilusFileUndoDataExt* eaction = (NautilusFileUndoDataExt*) action;
@@ -436,7 +439,7 @@ move_restore_redo_func (NautilusFileUndoData *action)
 }
 
 static void
-rename_redo_func (NautilusFileUndoData *action)
+rename_redo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	gchar *new_name;
 	NautilusFile *file;
@@ -452,7 +455,7 @@ rename_redo_func (NautilusFileUndoData *action)
 }
 
 static void
-create_empty_redo_func (NautilusFileUndoData *action)
+create_empty_redo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	GFile *parent;
 	gchar *parent_uri;
@@ -473,7 +476,7 @@ create_empty_redo_func (NautilusFileUndoData *action)
 }
 
 static void
-create_folder_redo_func (NautilusFileUndoData *action)
+create_folder_redo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	GFile *parent;
 	gchar *parent_uri;
@@ -489,7 +492,7 @@ create_folder_redo_func (NautilusFileUndoData *action)
 }
 
 static void
-trash_redo_func (NautilusFileUndoData *action)
+trash_redo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	NautilusFileUndoDataTrash* eaction = (NautilusFileUndoDataTrash*) action;
 	
@@ -498,7 +501,7 @@ trash_redo_func (NautilusFileUndoData *action)
 
 		uri_to_trash = g_hash_table_get_keys (eaction->trashed);
 		locations = uri_list_to_gfile_list (uri_to_trash);
-		nautilus_file_operations_trash_or_delete (locations, NULL,
+		nautilus_file_operations_trash_or_delete (locations, parent_window,
 							  undo_redo_done_delete_callback, action);
 		g_list_free (uri_to_trash);
 		g_list_free_full (locations, g_object_unref);
@@ -506,19 +509,19 @@ trash_redo_func (NautilusFileUndoData *action)
 }
 
 static void
-create_link_redo_func (NautilusFileUndoData *action)
+create_link_redo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	GList *locations;
 	NautilusFileUndoDataExt* eaction = (NautilusFileUndoDataExt*) action;
 
 	locations = eaction->sources;
 	nautilus_file_operations_link (locations, NULL,
-				       eaction->dest_dir, NULL,
+				       eaction->dest_dir, parent_window,
 				       undo_redo_done_transfer_callback, action);
 }
 
 static void
-set_permissions_redo_func (NautilusFileUndoData *action)
+set_permissions_redo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	NautilusFile *file;
 	NautilusFileUndoDataPermissions* eaction = (NautilusFileUndoDataPermissions*) action;
@@ -531,7 +534,7 @@ set_permissions_redo_func (NautilusFileUndoData *action)
 }
 
 static void
-recursive_permissions_redo_func (NautilusFileUndoData *action)
+recursive_permissions_redo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	gchar *parent_uri;
 	NautilusFileUndoDataRecursivePermissions* eaction = (NautilusFileUndoDataRecursivePermissions*) action;
@@ -548,7 +551,7 @@ recursive_permissions_redo_func (NautilusFileUndoData *action)
 }
 
 static void
-change_group_redo_func (NautilusFileUndoData *action)
+change_group_redo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	NautilusFile *file;
 	NautilusFileUndoDataOwnership* eaction = (NautilusFileUndoDataOwnership*) action;
@@ -564,7 +567,7 @@ change_group_redo_func (NautilusFileUndoData *action)
 }
 
 static void
-change_owner_redo_func (NautilusFileUndoData *action)
+change_owner_redo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 {
 	NautilusFile *file;
 	NautilusFileUndoDataOwnership* eaction = (NautilusFileUndoDataOwnership*) action;
@@ -1035,8 +1038,10 @@ static NautilusFileUndoData *
 create_from_type (NautilusFileUndoDataType type)
 {
 	struct {
-		void (* undo_func)               (NautilusFileUndoData *data);
-		void (* redo_func)               (NautilusFileUndoData *data);
+		void (* undo_func)               (NautilusFileUndoData *data,
+						  GtkWindow            *parent_window);
+		void (* redo_func)               (NautilusFileUndoData *data,
+						  GtkWindow            *parent_window);
 		void (* strings_func)            (NautilusFileUndoData *data,
 						  guint count,
 						  gchar **labels,
diff --git a/libnautilus-private/nautilus-file-undo-types.h b/libnautilus-private/nautilus-file-undo-types.h
index b582d6d..36cf769 100644
--- a/libnautilus-private/nautilus-file-undo-types.h
+++ b/libnautilus-private/nautilus-file-undo-types.h
@@ -30,6 +30,7 @@
 
 #include <glib.h>
 #include <gio/gio.h>
+#include <gtk/gtk.h>
 
 typedef struct _NautilusFileUndoManager NautilusFileUndoManager;
 typedef void (* NautilusFileUndoFinishCallback) (gpointer data);
@@ -65,8 +66,10 @@ struct _NautilusFileUndoData
 {
 	NautilusFileUndoDataType type;
 
-	void (* undo_func) (NautilusFileUndoData *data);
-	void (* redo_func) (NautilusFileUndoData *data);
+	void (* undo_func) (NautilusFileUndoData *data,
+			    GtkWindow            *parent_window);
+	void (* redo_func) (NautilusFileUndoData *data,
+			    GtkWindow            *parent_window);
 
 	NautilusFileUndoFinishCallback callback;
 	gpointer callback_user_data;
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index 1470bb3..bfda541 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -2353,10 +2353,68 @@ nautilus_view_get_selection_count (NautilusView *view)
 }
 
 static void
+update_undo_actions (NautilusView *view,
+		     gboolean invalidate)
+{
+	NautilusFileUndoManager *manager;
+	NautilusFileUndoMenuData *menu_data;
+	GtkAction *action;
+	const gchar *label, *tooltip;
+	gboolean available;
+	gboolean undo_active, redo_active;
+
+	manager = nautilus_file_undo_manager_get ();
+	menu_data = nautilus_file_undo_manager_get_menu_data (manager);
+
+	undo_active = menu_data->undo_label != NULL && !invalidate;
+	redo_active = menu_data->redo_label != NULL && !invalidate;
+
+	/* Update undo entry */
+	action = gtk_action_group_get_action (view->details->dir_action_group,
+					      "Undo");
+	available = undo_active;
+	if (available) {
+		label = menu_data->undo_label;
+		tooltip = menu_data->undo_description;
+	} else {
+		/* Reset to default info */
+		label = _("Undo");
+		tooltip = _("Undo the last action");
+	}
+
+	g_object_set (action,
+		      "label", label,
+		      "tooltip", tooltip,
+		      NULL);
+	gtk_action_set_sensitive (action, available);
+
+	/* Update redo entry */
+	action = gtk_action_group_get_action (view->details->dir_action_group,
+					      "Redo");
+	available = redo_active;
+	if (available) {
+		label = menu_data->redo_label;
+		tooltip = menu_data->redo_description;
+	} else {
+		/* Reset to default info */
+		label = _("Redo");
+		tooltip = _("Redo the last undone action");
+	}
+
+	g_object_set (action,
+		      "label", label,
+		      "tooltip", tooltip,
+		      NULL);
+	gtk_action_set_sensitive (action, available);
+
+	nautilus_file_undo_menu_data_free (menu_data);
+}
+
+static void
 undo_manager_changed_cb (NautilusFileUndoManager* manager,
 			 NautilusView *view)
 {
-	schedule_update_menus (view);
+	update_undo_actions (view, FALSE);
 }
 
 void
@@ -6004,87 +6062,37 @@ invoke_external_bulk_rename_utility (NautilusView *view,
 }
 
 static void
-update_undo_actions (NautilusView *view,
-		     gboolean invalidate)
-{
-	NautilusFileUndoManager *manager;
-	NautilusFileUndoMenuData *menu_data;
-	GtkAction *action;
-	const gchar *label, *tooltip;
-	gboolean available;
-	gboolean undo_active, redo_active;
-
-	manager = nautilus_file_undo_manager_get ();
-	menu_data = nautilus_file_undo_manager_get_menu_data (manager);
-
-	undo_active = menu_data->undo_label != NULL && !invalidate;
-	redo_active = menu_data->redo_label != NULL && !invalidate;
-
-	/* Update undo entry */
-	action = gtk_action_group_get_action (view->details->dir_action_group,
-					      "Undo");
-	available = undo_active;
-	if (available) {
-		label = menu_data->undo_label;
-		tooltip = menu_data->undo_description;
-	} else {
-		/* Reset to default info */
-		label = _("Undo");
-		tooltip = _("Undo the last action");
-	}
-
-	g_object_set (action,
-		      "label", label,
-		      "tooltip", tooltip,
-		      NULL);
-	gtk_action_set_sensitive (action, available);
-
-	/* Update redo entry */
-	action = gtk_action_group_get_action (view->details->dir_action_group,
-					      "Redo");
-	available = redo_active;
-	if (available) {
-		label = menu_data->redo_label;
-		tooltip = menu_data->redo_description;
-	} else {
-		/* Reset to default info */
-		label = _("Redo");
-		tooltip = _("Redo the last undone action");
-	}
-
-	g_object_set (action,
-		      "label", label,
-		      "tooltip", tooltip,
-		      NULL);
-	gtk_action_set_sensitive (action, available);
-
-	nautilus_file_undo_menu_data_free (menu_data);
-}
-
-static void
 real_action_undo (NautilusView *view)
 {
 	NautilusFileUndoManager *manager;
+	GtkWidget *toplevel;
 
 	manager = nautilus_file_undo_manager_get ();
+	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (view));
 
 	/* Disable menus because they are in an untrustworthy status */
 	update_undo_actions (view, TRUE);
 
-	nautilus_file_undo_manager_undo (manager, NULL, NULL);
+	nautilus_file_undo_manager_undo (manager, 
+					 GTK_WINDOW (toplevel),
+					 NULL, NULL);
 }
 
 static void
 real_action_redo (NautilusView *view)
 {
 	NautilusFileUndoManager *manager;
+	GtkWidget *toplevel;
 
 	manager = nautilus_file_undo_manager_get ();
+	toplevel = gtk_widget_get_toplevel (GTK_WIDGET (view));
 
 	/* Disable menus because they are in an untrustworthy status */
 	update_undo_actions (view, TRUE);
 
-	nautilus_file_undo_manager_redo (manager, NULL, NULL);
+	nautilus_file_undo_manager_redo (manager, 
+					 GTK_WINDOW (toplevel),
+					 NULL, NULL);
 }
 
 static void



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