[nautilus] file-operations: first pass at passing on success information



commit 44b695b9af6a26fbf2979a19fd638cc3682c89bb
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Wed Jan 18 15:42:47 2012 -0500

    file-operations: first pass at passing on success information
    
    We want to know if a file operation failed for some reason, so that we
    don't add it in the redo queue.

 libnautilus-private/nautilus-file-operations.c     |   31 +++-
 libnautilus-private/nautilus-file-operations.h     |    6 +-
 libnautilus-private/nautilus-file-undo-manager.c   |   60 ++++---
 libnautilus-private/nautilus-file-undo-manager.h   |    8 +-
 .../nautilus-file-undo-operations.c                |  208 ++++++++++++++++----
 .../nautilus-file-undo-operations.h                |   76 +++++---
 libnautilus-private/nautilus-file-undo-types.h     |   38 +----
 src/nautilus-places-sidebar.c                      |    1 +
 src/nautilus-properties-window.c                   |    3 +-
 src/nautilus-tree-sidebar.c                        |    4 +-
 src/nautilus-view.c                                |   20 +--
 test/test-copy.c                                   |    4 +-
 12 files changed, 302 insertions(+), 157 deletions(-)
---
diff --git a/libnautilus-private/nautilus-file-operations.c b/libnautilus-private/nautilus-file-operations.c
index 87b3554..5e84b66 100644
--- a/libnautilus-private/nautilus-file-operations.c
+++ b/libnautilus-private/nautilus-file-operations.c
@@ -2319,7 +2319,9 @@ volume_mount_cb (GObject *source_object,
 	GError *error;
 	char *primary;
 	char *name;
+	gboolean success;
 
+	success = TRUE;
 	error = NULL;
 	if (!g_volume_mount_finish (G_VOLUME (source_object), res, &error)) {
 		if (error->code != G_IO_ERROR_FAILED_HANDLED &&
@@ -2327,6 +2329,7 @@ volume_mount_cb (GObject *source_object,
 			name = g_volume_get_name (G_VOLUME (source_object));
 			primary = g_strdup_printf (_("Unable to mount %s"), name);
 			g_free (name);
+			success = FALSE;
 			eel_show_error_dialog (primary,
 					       error->message,
 					       NULL);
@@ -2342,6 +2345,7 @@ volume_mount_cb (GObject *source_object,
 
 	if (mount_callback != NULL) {
 		(* mount_callback) (G_VOLUME (source_object),
+				    success,
 				    mount_callback_data_object);
 
 	    	if (mount_callback_data_object != NULL) {
@@ -4464,7 +4468,9 @@ copy_job_done (gpointer user_data)
 
 	job = user_data;
 	if (job->done_callback) {
-		job->done_callback (job->debuting_files, job->done_callback_data);
+		job->done_callback (job->debuting_files, 
+				    !job_aborted ((CommonJob *) job),
+				    job->done_callback_data);
 	}
 
 	g_list_free_full (job->files, g_object_unref);
@@ -5025,7 +5031,9 @@ move_job_done (gpointer user_data)
 
 	job = user_data;
 	if (job->done_callback) {
-		job->done_callback (job->debuting_files, job->done_callback_data);
+		job->done_callback (job->debuting_files,
+				    !job_aborted ((CommonJob *) job),
+				    job->done_callback_data);
 	}
 
 	g_list_free_full (job->files, g_object_unref);
@@ -5364,7 +5372,9 @@ link_job_done (gpointer user_data)
 
 	job = user_data;
 	if (job->done_callback) {
-		job->done_callback (job->debuting_files, job->done_callback_data);
+		job->done_callback (job->debuting_files,
+				    !job_aborted ((CommonJob *) job),
+				    job->done_callback_data);
 	}
 
 	g_list_free_full (job->files, g_object_unref);
@@ -5541,7 +5551,8 @@ set_permissions_job_done (gpointer user_data)
 	g_object_unref (job->file);
 
 	if (job->done_callback) {
-		job->done_callback (job->done_callback_data);
+		job->done_callback (!job_aborted ((CommonJob *) job),
+				    job->done_callback_data);
 	}
 	
 	finalize_common ((CommonJob *)job);
@@ -5724,7 +5735,7 @@ callback_for_move_to_trash (GHashTable *debuting_uris,
 			    MoveTrashCBData *data)
 {
 	if (data->real_callback)
-		data->real_callback (debuting_uris, data->real_data);
+		data->real_callback (debuting_uris, !user_cancelled, data->real_data);
 	g_slice_free (MoveTrashCBData, data);
 }
 
@@ -5838,7 +5849,9 @@ create_job_done (gpointer user_data)
 
 	job = user_data;
 	if (job->done_callback) {
-		job->done_callback (job->created_file, job->done_callback_data);
+		job->done_callback (job->created_file,
+				    !job_aborted ((CommonJob *) job),
+				    job->done_callback_data);
 	}
 
 	g_object_unref (job->dest_dir);
@@ -6314,7 +6327,8 @@ empty_trash_job_done (gpointer user_data)
 	g_list_free_full (job->trash_dirs, g_object_unref);
 
 	if (job->done_callback) {
-		job->done_callback (job->done_callback_data);
+		job->done_callback (!job_aborted ((CommonJob *) job),
+				    job->done_callback_data);
 	}
 
 	nautilus_file_undo_manager_trash_has_emptied (nautilus_file_undo_manager_get ());
@@ -6392,7 +6406,8 @@ mark_trusted_job_done (gpointer user_data)
 	g_object_unref (job->file);
 
 	if (job->done_callback) {
-		job->done_callback (job->done_callback_data);
+		job->done_callback (!job_aborted ((CommonJob *) job),
+				    job->done_callback_data);
 	}
 	
 	finalize_common ((CommonJob *)job);
diff --git a/libnautilus-private/nautilus-file-operations.h b/libnautilus-private/nautilus-file-operations.h
index 96e908b..55f7479 100644
--- a/libnautilus-private/nautilus-file-operations.h
+++ b/libnautilus-private/nautilus-file-operations.h
@@ -31,14 +31,18 @@
 #include <gio/gio.h>
 
 typedef void (* NautilusCopyCallback)      (GHashTable *debuting_uris,
+					    gboolean    success,
 					    gpointer    callback_data);
 typedef void (* NautilusCreateCallback)    (GFile      *new_file,
+					    gboolean    success,
+					    gpointer    callback_data);
+typedef void (* NautilusOpCallback)        (gboolean    success,
 					    gpointer    callback_data);
-typedef void (* NautilusOpCallback)        (gpointer    callback_data);
 typedef void (* NautilusDeleteCallback)    (GHashTable *debuting_uris,
 					    gboolean    user_cancel,
 					    gpointer    callback_data);
 typedef void (* NautilusMountCallback)     (GVolume    *volume,
+					    gboolean    success,
 					    GObject    *callback_data_object);
 typedef void (* NautilusUnmountCallback)   (gpointer    callback_data);
 
diff --git a/libnautilus-private/nautilus-file-undo-manager.c b/libnautilus-private/nautilus-file-undo-manager.c
index 8a53490..7366f51 100644
--- a/libnautilus-private/nautilus-file-undo-manager.c
+++ b/libnautilus-private/nautilus-file-undo-manager.c
@@ -452,11 +452,35 @@ get_redo_description (NautilusFileUndoData *action)
 }
 
 static void
+do_undo_redo_finish (NautilusFileUndoData *data,
+		     gboolean success,
+		     gpointer user_data)
+{
+	NautilusFileUndoManager *self = user_data;
+
+	self->priv->undo_redo_flag = FALSE;
+
+	/* If the action needed to be freed but was locked, free now */
+	if (data->freed) {
+		nautilus_file_undo_data_free (data);
+		return;
+	}
+
+	g_print ("success %d\n\n", success);
+
+	data->locked = FALSE;
+
+	if (!success) {
+		nautilus_file_undo_manager_add_action (self, data);
+	}
+
+	g_signal_emit (self, signals[SIGNAL_UNDO_CHANGED], 0);
+}
+
+static void
 do_undo_redo (NautilusFileUndoManager *self,
 	      GtkWindow *parent_window,
-	      gboolean undo,
-	      NautilusFileUndoFinishCallback callback,
-	      gpointer user_data)
+	      gboolean undo)
 {
 	NautilusFileUndoManagerPrivate *priv = self->priv;
 	NautilusFileUndoData *action;
@@ -481,6 +505,9 @@ do_undo_redo (NautilusFileUndoManager *self,
 
 	if (action != NULL) {
 		priv->undo_redo_flag = TRUE;
+		
+		action->callback = do_undo_redo_finish;
+		action->callback_user_data = self;
 
 		if (undo) {
 			action->undo_func (action, parent_window);
@@ -488,28 +515,20 @@ do_undo_redo (NautilusFileUndoManager *self,
 			action->redo_func (action, parent_window);
 		}
 	}
-
-	if (callback != NULL) {
-		callback (user_data);
-	}
 }
 
 void
 nautilus_file_undo_manager_redo (NautilusFileUndoManager        *manager,
-				 GtkWindow                      *parent_window,
-                                  NautilusFileUndoFinishCallback  callback,
-                                  gpointer                         user_data)
+				 GtkWindow                      *parent_window)
 {
-	do_undo_redo (manager, parent_window, FALSE, callback, user_data);
+	do_undo_redo (manager, parent_window, FALSE);
 }
 
 void
 nautilus_file_undo_manager_undo (NautilusFileUndoManager        *manager,
-				 GtkWindow                      *parent_window,
-				  NautilusFileUndoFinishCallback  callback,
-				  gpointer                         user_data)
+				 GtkWindow                      *parent_window)
 {
-	do_undo_redo (manager, parent_window, TRUE, callback, user_data);
+	do_undo_redo (manager, parent_window, TRUE);
 }
 
 void
@@ -540,16 +559,9 @@ nautilus_file_undo_manager_add_action (NautilusFileUndoManager    *self,
 gboolean
 nautilus_file_undo_manager_is_undo_redo (NautilusFileUndoManager *manager)
 {
-	NautilusFileUndoManagerPrivate *priv;
-
-	priv = manager->priv;
-
-	if (priv->undo_redo_flag) {
-		priv->undo_redo_flag = FALSE;
-		return TRUE;
-	}
+	NautilusFileUndoManagerPrivate *priv = manager->priv;
 
-	return FALSE;
+	return priv->undo_redo_flag;
 }
 
 NautilusFileUndoManager *
diff --git a/libnautilus-private/nautilus-file-undo-manager.h b/libnautilus-private/nautilus-file-undo-manager.h
index e88b8ce..bcd4414 100644
--- a/libnautilus-private/nautilus-file-undo-manager.h
+++ b/libnautilus-private/nautilus-file-undo-manager.h
@@ -70,13 +70,9 @@ 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);
+				      GtkWindow *parent_window);
 void nautilus_file_undo_manager_redo (NautilusFileUndoManager *manager,
-				      GtkWindow *parent_window,
-				       NautilusFileUndoFinishCallback callback,
-				       gpointer user_data);
+				      GtkWindow *parent_window);
 
 gboolean nautilus_file_undo_manager_is_undo_redo (NautilusFileUndoManager *manager);
 void nautilus_file_undo_manager_trash_has_emptied (NautilusFileUndoManager *manager);
diff --git a/libnautilus-private/nautilus-file-undo-operations.c b/libnautilus-private/nautilus-file-undo-operations.c
index 7b87229..4c358b8 100644
--- a/libnautilus-private/nautilus-file-undo-operations.c
+++ b/libnautilus-private/nautilus-file-undo-operations.c
@@ -36,6 +36,48 @@
 #include "nautilus-file-undo-manager.h"
 #include "nautilus-file-undo-types.h"
 
+G_DEFINE_TYPE (NautilusFileUndoInfo, nautilus_file_undo_info, G_TYPE_OBJECT)
+
+enum {
+	PROP_TYPE = 1,
+	PROP_ITEM_COUNT,
+	N_PROPERTIES
+};
+
+static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+
+struct _NautilusFileUndoInfoDetails {
+	NautilusFileUndoData *undo_data;
+
+	NautilusFileUndoDataType type;
+
+	NautilusFileUndoFinishCallback callback;
+	gpointer callback_user_data;
+
+	NautilusFileUndoManager *manager;
+	guint is_valid : 1;
+	guint locked : 1;	/* True if the action is being undone/redone */
+	guint freed : 1;	/* True if the action must be freed after undo/redo */
+	guint count;		/* Number of items */
+
+	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,
+			       gchar **descriptions);
+
+	void (* finalize_func) (NautilusFileUndoData *data);
+
+	gchar *undo_label;
+	gchar *redo_label;
+	gchar *undo_description;
+	gchar *redo_description;
+};
+
 void
 nautilus_file_undo_data_free (NautilusFileUndoData *action)
 {
@@ -143,20 +185,12 @@ retrieve_files_to_restore (GHashTable * trashed)
 
 static void
 undo_redo_done_transfer_callback (GHashTable * debuting_uris,
+				  gboolean success,
                                   gpointer data)
 {
 	NautilusFileUndoData *action = data;
-	NautilusFileUndoManager *manager = action->manager;
-
-	/* If the action needed to be freed but was locked, free now */
-	if (action->freed) {
-		nautilus_file_undo_data_free (action);
-	} else {
-		action->locked = FALSE;
-	}
 
-	/* Update menus */
-	g_signal_emit_by_name (manager, "undo-changed", 0);
+	action->callback (action, success, action->callback_user_data);
 }
 
 static void
@@ -165,14 +199,15 @@ undo_redo_done_rename_callback (NautilusFile * file,
 				GError * error,
 				gpointer callback_data)
 {
-	undo_redo_done_transfer_callback (NULL, callback_data);
+	undo_redo_done_transfer_callback (NULL, (error != NULL), callback_data);
 }
 
 static void
 undo_redo_done_create_callback (GFile * new_file,
+				gboolean success,
 				gpointer callback_data)
 {
-	undo_redo_done_transfer_callback (NULL, callback_data);
+	undo_redo_done_transfer_callback (NULL, success, callback_data);
 }
 
 static void
@@ -180,13 +215,14 @@ undo_redo_done_delete_callback (GHashTable *debuting_uris,
                                 gboolean user_cancel,
                                 gpointer callback_data)
 {
-	undo_redo_done_transfer_callback (debuting_uris, callback_data);
+	undo_redo_done_transfer_callback (debuting_uris, !user_cancel, callback_data);
 }
 
 static void
-undo_redo_op_callback (gpointer callback_data)
+undo_redo_recursive_permissions_callback (gboolean success,
+					  gpointer callback_data)
 {
-	undo_redo_done_transfer_callback (NULL, callback_data);
+	undo_redo_done_transfer_callback (NULL, success, callback_data);
 }
 
 /* undo helpers */
@@ -274,7 +310,7 @@ trash_undo_func (NautilusFileUndoData *action, GtkWindow *parent_window)
 	g_hash_table_destroy (files_to_restore);
 
 	/* Here we must do what's necessary for the callback */
-	undo_redo_done_transfer_callback (NULL, action);
+	undo_redo_done_transfer_callback (NULL, TRUE, action);
 }
 
 static void
@@ -347,7 +383,7 @@ recursive_permissions_undo_func (NautilusFileUndoData *action, GtkWindow *parent
 
 		g_list_free (gfiles_list);
 		/* Here we must do what's necessary for the callback */
-		undo_redo_done_transfer_callback (NULL, action);
+		undo_redo_done_transfer_callback (NULL, TRUE, action);
 	}
 }
 
@@ -545,7 +581,7 @@ recursive_permissions_redo_func (NautilusFileUndoData *action, GtkWindow *parent
 						 eaction->file_mask,
 						 eaction->dir_permissions,
 						 eaction->dir_mask,
-						 undo_redo_op_callback,
+						 undo_redo_recursive_permissions_callback,
 						 action);
 	g_free (parent_uri);
 }
@@ -1121,7 +1157,7 @@ create_from_type (NautilusFileUndoDataType type)
 /* functions to manipulate the action data */
 NautilusFileUndoData *
 nautilus_file_undo_data_new (NautilusFileUndoDataType type,
-                                     gint                        items_count)
+			     gint                     items_count)
 {
 	NautilusFileUndoData *data;
 
@@ -1132,9 +1168,97 @@ nautilus_file_undo_data_new (NautilusFileUndoDataType type,
 	return data;
 }
 
+static void
+nautilus_file_undo_info_init (NautilusFileUndoInfo *self)
+{
+	self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, NAUTILUS_TYPE_FILE_UNDO_INFO,
+						  NautilusFileUndoInfoDetails);
+}
+
+static void
+nautilus_file_undo_info_get_property (GObject *object,
+				      guint property_id,
+				      GValue *value,
+				      GParamSpec *pspec)
+{
+
+}
+
+static void
+nautilus_file_undo_info_set_property (GObject *object,
+				      guint property_id,
+				      const GValue *value,
+				      GParamSpec *pspec)
+{
+
+}
+
+static void
+nautilus_file_undo_info_constructed (GObject *obj)
+{
+	NautilusFileUndoInfo *self = NAUTILUS_FILE_UNDO_INFO (obj);
+}
+
+static void
+nautilus_file_undo_info_finalize (GObject *obj)
+{
+	NautilusFileUndoInfo *self = NAUTILUS_FILE_UNDO_INFO (obj);
+
+	if (self->priv->undo_data != NULL) {
+		nautilus_file_undo_data_free (self->priv->undo_data);
+		self->priv->undo_data = NULL;
+	}
+
+	G_OBJECT_CLASS (nautilus_file_undo_info_parent_class)->finalize (obj);
+}
+
+static void
+nautilus_file_undo_info_class_init (NautilusFileUndoInfoClass *klass)
+{
+	GObjectClass *oclass = G_OBJECT_CLASS (klass);
+
+	oclass->finalize = nautilus_file_undo_info_finalize;
+	oclass->constructed = nautilus_file_undo_info_constructed;
+	oclass->get_property = nautilus_file_undo_info_get_property;
+	oclass->set_property = nautilus_file_undo_info_set_property;
+
+	properties[PROP_TYPE] =
+		g_param_spec_int ("type",
+				  "Undo info type",
+				  "Type of undo operation",
+				  0, NAUTILUS_FILE_UNDO_NUM_TYPES - 1, 0,
+				  G_PARAM_READWRITE |
+				  G_PARAM_CONSTRUCT_ONLY);
+	properties[PROP_ITEM_COUNT] =
+		g_param_spec_int ("item-count",
+				  "Number of items",
+				  "Number of items",
+				  0, G_MAXINT, 0,
+				  G_PARAM_READWRITE |
+				  G_PARAM_CONSTRUCT_ONLY);
+
+	g_type_class_add_private (klass, sizeof (NautilusFileUndoInfoDetails));
+	g_object_class_install_properties (oclass, N_PROPERTIES, properties);
+}
+
+NautilusFileUndoInfo *
+nautilus_file_undo_info_new (NautilusFileUndoDataType type,
+			     gint item_count)
+{
+	NautilusFileUndoInfo *retval;
+	NautilusFileUndoData *data;
+
+	retval = g_object_new (NAUTILUS_TYPE_FILE_UNDO_INFO, 
+			       "type", type,
+			       "item-count", item_count,
+			       NULL);
+
+	return retval;
+}
+
 void
 nautilus_file_undo_data_set_src_dir (NautilusFileUndoData        *action_data,
-                                             GFile                       *src)
+				     GFile                       *src)
 {
 	NautilusFileUndoDataExt* eaction_data = (NautilusFileUndoDataExt*) action_data;
 	eaction_data->src_dir = g_object_ref (src);
@@ -1142,7 +1266,7 @@ nautilus_file_undo_data_set_src_dir (NautilusFileUndoData        *action_data,
 
 void
 nautilus_file_undo_data_set_dest_dir (NautilusFileUndoData        *action_data,
-                                              GFile                       *dest)
+				      GFile                       *dest)
 {
 	NautilusFileUndoDataExt* eaction_data = (NautilusFileUndoDataExt*) action_data;
 	eaction_data->dest_dir = g_object_ref (dest);
@@ -1150,8 +1274,8 @@ nautilus_file_undo_data_set_dest_dir (NautilusFileUndoData        *action_data,
 
 void
 nautilus_file_undo_data_add_origin_target_pair (NautilusFileUndoData        *action_data,
-                                                        GFile                       *origin,
-                                                        GFile                       *target)
+						GFile                       *origin,
+						GFile                       *target)
 {
 	NautilusFileUndoDataExt* eaction_data = (NautilusFileUndoDataExt*) action_data;
 	eaction_data->sources =
@@ -1164,8 +1288,8 @@ nautilus_file_undo_data_add_origin_target_pair (NautilusFileUndoData        *act
 
 void
 nautilus_file_undo_data_add_trashed_file (NautilusFileUndoData        *action_data,
-                                                  GFile                       *file,
-                                                  guint64                      mtime)
+					  GFile                       *file,
+					  guint64                      mtime)
 {
 	guint64 *modification_time;
 	char *original_uri;
@@ -1189,8 +1313,8 @@ nautilus_file_undo_data_add_trashed_file (NautilusFileUndoData        *action_da
 
 void
 nautilus_file_undo_data_add_file_permissions (NautilusFileUndoData        *action_data,
-                                                      GFile                       *file,
-                                                      guint32                      permission)
+					      GFile                       *file,
+					      guint32                      permission)
 {
 	guint32 *current_permissions;
 	char *original_uri;
@@ -1213,9 +1337,9 @@ nautilus_file_undo_data_add_file_permissions (NautilusFileUndoData        *actio
 
 void
 nautilus_file_undo_data_set_file_permissions (NautilusFileUndoData        *action_data,
-                                                      GFile                       *file,
-                                                      guint32                      current_permissions,
-                                                      guint32                      new_permissions)
+					      GFile                       *file,
+					      guint32                      current_permissions,
+					      guint32                      new_permissions)
 {
 	NautilusFileUndoDataPermissions* eaction_data = (NautilusFileUndoDataPermissions*) action_data;
 	eaction_data->target_file = g_object_ref (file);
@@ -1227,9 +1351,9 @@ nautilus_file_undo_data_set_file_permissions (NautilusFileUndoData        *actio
 
 void
 nautilus_file_undo_data_set_owner_change_information (NautilusFileUndoData        *action_data,
-                                                              GFile                       *file,
-                                                              const char                  *current_user,
-                                                              const char                  *new_user)
+						      GFile                       *file,
+						      const char                  *current_user,
+						      const char                  *new_user)
 {
 	NautilusFileUndoDataOwnership* eaction_data = (NautilusFileUndoDataOwnership*) action_data;
 	eaction_data->target_file = g_object_ref (file);
@@ -1241,9 +1365,9 @@ nautilus_file_undo_data_set_owner_change_information (NautilusFileUndoData
 
 void
 nautilus_file_undo_data_set_group_change_information (NautilusFileUndoData        *action_data,
-                                                              GFile                       *file,
-                                                              const char                  *current_group,
-                                                              const char                  *new_group)
+						      GFile                       *file,
+						      const char                  *current_group,
+						      const char                  *new_group)
 {
 	NautilusFileUndoDataOwnership* eaction_data = (NautilusFileUndoDataOwnership*) action_data;
 	eaction_data->target_file = g_object_ref (file);
@@ -1255,10 +1379,10 @@ nautilus_file_undo_data_set_group_change_information (NautilusFileUndoData
 
 void
 nautilus_file_undo_data_set_recursive_permissions (NautilusFileUndoData         *action_data,
-                                                           guint32                      file_permissions,
-                                                           guint32                      file_mask,
-                                                           guint32                      dir_permissions,
-                                                           guint32                      dir_mask)
+						   guint32                      file_permissions,
+						   guint32                      file_mask,
+						   guint32                      dir_permissions,
+						   guint32                      dir_mask)
 {
 	NautilusFileUndoDataRecursivePermissions* eaction_data = (NautilusFileUndoDataRecursivePermissions*) action_data;
 	eaction_data->file_permissions = file_permissions;
@@ -1291,8 +1415,8 @@ nautilus_file_undo_data_set_create_data (NautilusFileUndoData        *action_dat
 
 void
 nautilus_file_undo_data_set_rename_information (NautilusFileUndoData        *action_data,
-                                                        GFile                       *old_file,
-                                                        GFile                       *new_file)
+						GFile                       *old_file,
+						GFile                       *new_file)
 {
 	NautilusFileUndoDataRename* eaction_data = (NautilusFileUndoDataRename*) action_data;
 	eaction_data->old_file = g_object_ref (old_file);
diff --git a/libnautilus-private/nautilus-file-undo-operations.h b/libnautilus-private/nautilus-file-undo-operations.h
index 69a79c2..b313e50 100644
--- a/libnautilus-private/nautilus-file-undo-operations.h
+++ b/libnautilus-private/nautilus-file-undo-operations.h
@@ -31,48 +31,70 @@
 #include <glib.h>
 #include <libnautilus-private/nautilus-file-undo-types.h>
 
+#define NAUTILUS_TYPE_FILE_UNDO_INFO         (nautilus_file_undo_info_get_type ())
+#define NAUTILUS_FILE_UNDO_INFO(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), NAUTILUS_TYPE_FILE_UNDO_INFO, NautilusFileUndoInfo))
+#define NAUTILUS_FILE_UNDO_INFO_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), NAUTILUS_TYPE_FILE_UNDO_INFO, NautilusFileUndoInfoClass))
+#define NAUTILUS_IS_FILE_UNDO_INFO(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), NAUTILUS_TYPE_FILE_UNDO_INFO))
+#define NAUTILUS_IS_FILE_UNDO_INFO_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), NAUTILUS_TYPE_FILE_UNDO_INFO))
+#define NAUTILUS_FILE_UNDO_INFO_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NAUTILUS_TYPE_FILE_UNDO_INFO, NautilusFileUndoInfoClass))
+
+typedef struct _NautilusFileUndoInfo      NautilusFileUndoInfo;
+typedef struct _NautilusFileUndoInfoClass NautilusFileUndoInfoClass;
+typedef struct _NautilusFileUndoInfoDetails NautilusFileUndoInfoDetails;
+
+struct _NautilusFileUndoInfo {
+	GObject parent;
+	NautilusFileUndoInfoDetails *priv;
+};
+
+struct _NautilusFileUndoInfoClass {
+	GObjectClass parent_class;
+};
+
+GType nautilus_file_undo_info_get_type (void) G_GNUC_CONST;
+
 NautilusFileUndoData *nautilus_file_undo_data_new (NautilusFileUndoDataType type,
-                                                                   gint items_count);
+						   gint items_count);
 void nautilus_file_undo_data_free (NautilusFileUndoData *action);
 
 void nautilus_file_undo_data_set_src_dir (NautilusFileUndoData *data, 
-                                                  GFile *src);
+					  GFile *src);
 void nautilus_file_undo_data_set_dest_dir (NautilusFileUndoData *data, 
-						   GFile *dest);
+					   GFile *dest);
 
 void nautilus_file_undo_data_add_origin_target_pair (NautilusFileUndoData *data, 
-							     GFile *origin, 
-							     GFile *target);
+						     GFile *origin, 
+						     GFile *target);
 void nautilus_file_undo_data_set_create_data (NautilusFileUndoData *data, 
-						      GFile *target_file,
-						      const char *template_uri);
+					      GFile *target_file,
+					      const char *template_uri);
 void nautilus_file_undo_data_set_rename_information (NautilusFileUndoData *data, 
-							     GFile *old_file, 
-							     GFile *new_file);
+						     GFile *old_file, 
+						     GFile *new_file);
 void nautilus_file_undo_data_add_trashed_file (NautilusFileUndoData *data, 
-						       GFile *file, 
-						       guint64 mtime);
+					       GFile *file, 
+					       guint64 mtime);
 void nautilus_file_undo_data_add_file_permissions (NautilusFileUndoData *data, 
-							   GFile *file, 
-							   guint32 permission);
+						   GFile *file, 
+						   guint32 permission);
 void nautilus_file_undo_data_set_recursive_permissions (NautilusFileUndoData *data, 
-								guint32 file_permissions, 
-								guint32 file_mask, 
-								guint32 dir_permissions, 
-								guint32 dir_mask);
+							guint32 file_permissions, 
+							guint32 file_mask, 
+							guint32 dir_permissions, 
+							guint32 dir_mask);
 void nautilus_file_undo_data_set_recursive_permissions_dest_dir (NautilusFileUndoData *data,
-                                GFile *dest);
+								 GFile *dest);
 void nautilus_file_undo_data_set_file_permissions (NautilusFileUndoData *data, 
-							   GFile *file,
-							   guint32 current_permissions,
-							   guint32 new_permissions);
+						   GFile *file,
+						   guint32 current_permissions,
+						   guint32 new_permissions);
 void nautilus_file_undo_data_set_owner_change_information (NautilusFileUndoData *data, 
-								   GFile *file,
-								   const char *current_user, 
-								   const char *new_user);
+							   GFile *file,
+							   const char *current_user, 
+							   const char *new_user);
 void nautilus_file_undo_data_set_group_change_information (NautilusFileUndoData *data, 
-								   GFile *file,
-								   const char *current_group, 
-								   const char *new_group);
+							   GFile *file,
+							   const char *current_group, 
+							   const char *new_group);
 
 #endif /* __NAUTILUS_FILE_UNDO_OPERATIONS_H__ */
diff --git a/libnautilus-private/nautilus-file-undo-types.h b/libnautilus-private/nautilus-file-undo-types.h
index 36cf769..f34c5b1 100644
--- a/libnautilus-private/nautilus-file-undo-types.h
+++ b/libnautilus-private/nautilus-file-undo-types.h
@@ -32,9 +32,6 @@
 #include <gio/gio.h>
 #include <gtk/gtk.h>
 
-typedef struct _NautilusFileUndoManager NautilusFileUndoManager;
-typedef void (* NautilusFileUndoFinishCallback) (gpointer data);
-
 typedef enum {
 	NAUTILUS_FILE_UNDO_COPY,
 	NAUTILUS_FILE_UNDO_DUPLICATE,
@@ -61,37 +58,10 @@ typedef struct {
 } NautilusFileUndoMenuData;
 
 typedef struct _NautilusFileUndoData NautilusFileUndoData;
-
-struct _NautilusFileUndoData
-{
-	NautilusFileUndoDataType type;
-
-	void (* undo_func) (NautilusFileUndoData *data,
-			    GtkWindow            *parent_window);
-	void (* redo_func) (NautilusFileUndoData *data,
-			    GtkWindow            *parent_window);
-
-	NautilusFileUndoFinishCallback callback;
-	gpointer callback_user_data;
-
-	NautilusFileUndoManager *manager;
-	guint is_valid : 1;
-	guint locked : 1;	/* True if the action is being undone/redone */
-	guint freed : 1;	/* True if the action must be freed after undo/redo */
-	guint count;		/* Number of items */
-
-	void    (* strings_func) (NautilusFileUndoData *data,
-				  guint count,
-				  gchar **labels,
-				  gchar **descriptions);
-
-	gchar *undo_label;
-	gchar *redo_label;
-	gchar *undo_description;
-	gchar *redo_description;
-	
-	void (* finalize_func) (NautilusFileUndoData *data);
-};
+typedef struct _NautilusFileUndoManager NautilusFileUndoManager;
+typedef void (* NautilusFileUndoFinishCallback) (NautilusFileUndoData *data,
+						 gboolean success,
+						 gpointer user_data);
 
 typedef struct 
 {
diff --git a/src/nautilus-places-sidebar.c b/src/nautilus-places-sidebar.c
index fc6a312..23fd751 100644
--- a/src/nautilus-places-sidebar.c
+++ b/src/nautilus-places-sidebar.c
@@ -1766,6 +1766,7 @@ bookmarks_selection_changed_cb (GtkTreeSelection      *selection,
 
 static void
 volume_mounted_cb (GVolume *volume,
+		   gboolean success,
 		   GObject *user_data)
 {
 	GMount *mount;
diff --git a/src/nautilus-properties-window.c b/src/nautilus-properties-window.c
index 45fea6b..28b0094 100644
--- a/src/nautilus-properties-window.c
+++ b/src/nautilus-properties-window.c
@@ -4337,7 +4337,8 @@ create_advanced_permissions (NautilusPropertiesWindow *window, GtkGrid *page_gri
 }
 
 static void
-set_recursive_permissions_done (gpointer callback_data)
+set_recursive_permissions_done (gboolean success,
+				gpointer callback_data)
 {
 	NautilusPropertiesWindow *window;
 
diff --git a/src/nautilus-tree-sidebar.c b/src/nautilus-tree-sidebar.c
index 5849efc7..fdefa2d 100644
--- a/src/nautilus-tree-sidebar.c
+++ b/src/nautilus-tree-sidebar.c
@@ -849,7 +849,9 @@ fm_tree_view_open_in_new_window_cb (GtkWidget *menu_item,
 }
 
 static void
-new_folder_done (GFile *new_folder, gpointer data)
+new_folder_done (GFile *new_folder, 
+		 gboolean success,
+		 gpointer data)
 {
 	GList *list;
 
diff --git a/src/nautilus-view.c b/src/nautilus-view.c
index bfda541..fd4adf6 100644
--- a/src/nautilus-view.c
+++ b/src/nautilus-view.c
@@ -1822,7 +1822,9 @@ track_newly_added_locations (NautilusView *view, NautilusFile *new_file,
 }
 
 static void
-new_folder_done (GFile *new_folder, gpointer user_data)
+new_folder_done (GFile *new_folder, 
+		 gboolean success,
+		 gpointer user_data)
 {
 	NautilusView *directory_view;
 	NautilusFile *file;
@@ -3160,7 +3162,9 @@ remove_not_really_moved_files (gpointer key,
  * up a signal handler to await their arrival.
  */
 static void
-copy_move_done_callback (GHashTable *debuting_files, gpointer data)
+copy_move_done_callback (GHashTable *debuting_files, 
+			 gboolean success,
+			 gpointer data)
 {
 	NautilusView  *directory_view;
 	CopyMoveDoneData *copy_move_done_data;
@@ -6070,12 +6074,8 @@ real_action_undo (NautilusView *view)
 	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, 
-					 GTK_WINDOW (toplevel),
-					 NULL, NULL);
+					 GTK_WINDOW (toplevel));
 }
 
 static void
@@ -6087,12 +6087,8 @@ real_action_redo (NautilusView *view)
 	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, 
-					 GTK_WINDOW (toplevel),
-					 NULL, NULL);
+					 GTK_WINDOW (toplevel));
 }
 
 static void
diff --git a/test/test-copy.c b/test/test-copy.c
index 94ed239..be8e7c4 100644
--- a/test/test-copy.c
+++ b/test/test-copy.c
@@ -5,7 +5,9 @@
 #include <libnautilus-private/nautilus-progress-info-manager.h>
 
 static void
-copy_done (GHashTable *debuting_uris, gpointer data)
+copy_done (GHashTable *debuting_uris, 
+           gboolean success,
+           gpointer data)
 {
 	g_print ("Copy done\n");
 }



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