[nautilus] undo: pass in a GtkWindow for undo operations
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus] undo: pass in a GtkWindow for undo operations
- Date: Sat, 21 Jan 2012 03:18:44 +0000 (UTC)
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]