[nautilus/undo-manager] undostack: get rid of forawrd declarations
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/undo-manager] undostack: get rid of forawrd declarations
- Date: Mon, 29 Nov 2010 10:27:06 +0000 (UTC)
commit 78fc054bed0586baad27709bed616e4c62b16400
Author: Cosimo Cecchi <cosimoc gnome org>
Date: Mon Nov 29 11:25:43 2010 +0100
undostack: get rid of forawrd declarations
And move nautilus_undo_stack_action_data_* functions to
nautilus-undostack-actions.[ch].
No code changes, just shuffling around.
libnautilus-private/nautilus-file-operations.c | 1 +
libnautilus-private/nautilus-undostack-actions.c | 243 ++++++
libnautilus-private/nautilus-undostack-actions.h | 41 +-
libnautilus-private/nautilus-undostack-manager.c | 923 ++++++++--------------
libnautilus-private/nautilus-undostack-manager.h | 40 -
5 files changed, 616 insertions(+), 632 deletions(-)
---
diff --git a/libnautilus-private/nautilus-file-operations.c b/libnautilus-private/nautilus-file-operations.c
index 885f012..797fcf4 100644
--- a/libnautilus-private/nautilus-file-operations.c
+++ b/libnautilus-private/nautilus-file-operations.c
@@ -64,6 +64,7 @@
#include "nautilus-trash-monitor.h"
#include "nautilus-file-utilities.h"
#include "nautilus-file-conflict-dialog.h"
+#include "nautilus-undostack-actions.h"
#include "nautilus-undostack-manager.h"
/* TODO: TESTING!!! */
diff --git a/libnautilus-private/nautilus-undostack-actions.c b/libnautilus-private/nautilus-undostack-actions.c
index 8c81d5a..5dbd3fc 100644
--- a/libnautilus-private/nautilus-undostack-actions.c
+++ b/libnautilus-private/nautilus-undostack-actions.c
@@ -1066,3 +1066,246 @@ nautilus_undo_stack_action_data_new (NautilusUndoStackActionType type,
return data;
}
+/**
+ * nautilus_undo_stack_action_data_set_src_dir:
+ * @action_data:
+ * @src:
+ *
+ * Sets the source directory.
+ */
+void
+nautilus_undo_stack_action_data_set_src_dir (NautilusUndoStackActionData *action_data,
+ GFile *src)
+{
+ action_data->src_dir = src;
+}
+
+/**
+ * nautilus_undo_stack_action_data_set_dest_dir:
+ * @action_data:
+ * @dest:
+ *
+ * Sets the destination directory
+ */
+void
+nautilus_undo_stack_action_data_set_dest_dir (NautilusUndoStackActionData *action_data,
+ GFile *dest)
+{
+ action_data->dest_dir = dest;
+}
+
+/**
+ * nautilus_undo_stack_action_data_add_origin_pair_target:
+ * @action_data:
+ * @origin:
+ * @target:
+ *
+ * Pushes an origin, target pair in an existing undo data container
+ */
+void
+nautilus_undo_stack_action_data_add_origin_target_pair (NautilusUndoStackActionData *action_data,
+ GFile *origin,
+ GFile *target)
+{
+ char *src_relative;
+ char *dest_relative;
+
+ src_relative = g_file_get_relative_path (action_data->src_dir, origin);
+ action_data->sources = g_list_append (action_data->sources, src_relative);
+ dest_relative = g_file_get_relative_path (action_data->dest_dir, target);
+ action_data->destinations = g_list_append (action_data->destinations, dest_relative);
+
+ action_data->is_valid = TRUE;
+}
+
+/**
+ * nautilus_undo_stack_action_data_add_trashed_file:
+ * @action_data:
+ * @file:
+ * @mtime:
+ *
+ * Pushes an trashed file with modification time in an existing undo data container.
+ */
+void
+nautilus_undo_stack_action_data_add_trashed_file (NautilusUndoStackActionData *action_data,
+ GFile *file,
+ guint64 mtime)
+{
+ guint64 *modification_time;
+ char *original_uri;
+
+ if (action_data->trashed == NULL) {
+ action_data->trashed =
+ g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, g_free);
+ }
+
+ modification_time = g_new (guint64, 1);
+ *modification_time = mtime;
+
+ original_uri = g_file_get_uri (file);
+
+ g_hash_table_insert (action_data->trashed, original_uri, modification_time);
+
+ action_data->is_valid = TRUE;
+}
+
+/**
+ * nautilus_undo_stack_action_data_add_file_permissions:
+ * @action_data:
+ * @file:
+ * @permission:
+ *
+ * Pushes a recursive permission change data in an existing undo data container
+ */
+void
+nautilus_undo_stack_action_data_add_file_permissions (NautilusUndoStackActionData *action_data,
+ GFile *file,
+ guint32 permission)
+{
+ guint32 *current_permissions;
+ char *original_uri;
+
+ if (action_data->original_permissions == NULL) {
+ action_data->original_permissions =
+ g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+ }
+
+ current_permissions = g_new (guint32, 1);
+ *current_permissions = permission;
+
+ original_uri = g_file_get_uri (file);
+
+ g_hash_table_insert (action_data->original_permissions, original_uri, current_permissions);
+
+ action_data->is_valid = TRUE;
+}
+
+/**
+ * nautilus_undo_stack_action_data_set_file_permissions:
+ * @action_data:
+ * @uri:
+ * @current_permissions:
+ * @new_permissions:
+ *
+ * Sets the original file permission in an existing undo data container
+ */
+void
+nautilus_undo_stack_action_data_set_file_permissions (NautilusUndoStackActionData *action_data,
+ GFile *file,
+ guint32 current_permissions,
+ guint32 new_permissions)
+{
+ action_data->target_file = g_object_ref (file);
+ action_data->current_permissions = current_permissions;
+ action_data->new_permissions = new_permissions;
+
+ action_data->is_valid = TRUE;
+}
+
+/**
+ * nautilus_undo_stack_action_data_set_owner_change_information:
+ * @action_data:
+ * @uri:
+ * @current_user:
+ * @new_user:
+ *
+ * Sets the change owner information in an existing undo data container
+ */
+void
+nautilus_undo_stack_action_data_set_owner_change_information (NautilusUndoStackActionData *action_data,
+ GFile *file,
+ const char *current_user,
+ const char *new_user)
+{
+ action_data->target_file = g_object_ref (file);
+ action_data->original_name = g_strdup (current_user);
+ action_data->new_name = g_strdup (new_user);
+
+ action_data->is_valid = TRUE;
+}
+
+/**
+ * nautilus_undo_stack_action_data_set_group_change_information:
+ * @action_data:
+ * @uri:
+ * @current_group:
+ * @new_group:
+ *
+ * Sets the change group information in an existing undo data container
+ */
+void
+nautilus_undo_stack_action_data_set_group_change_information (NautilusUndoStackActionData *action_data,
+ GFile *file,
+ const char *current_group,
+ const char *new_group)
+{
+ action_data->target_file = g_object_ref (file);
+ action_data->original_name = g_strdup (current_group);
+ action_data->new_name = g_strdup (new_group);
+
+ action_data->is_valid = TRUE;
+}
+
+/**
+ * nautilus_undo_stack_action_data_set_recursive_permissions:
+ * @data:
+ * @file_permissions:
+ * @file_mask:
+ * @dir_permissions:
+ * @dir_mask:
+ *
+ * Sets the permission change mask
+ */
+void
+nautilus_undo_stack_action_data_set_recursive_permissions (NautilusUndoStackActionData *action_data,
+ guint32 file_permissions,
+ guint32 file_mask,
+ guint32 dir_permissions,
+ guint32 dir_mask)
+{
+ action_data->file_permissions = file_permissions;
+ action_data->file_mask = file_mask;
+ action_data->dir_permissions = dir_permissions;
+ action_data->dir_mask = dir_mask;
+
+ action_data->is_valid = TRUE;
+}
+
+/**
+ * nautilus_undo_stack_action_data_set_create_data:
+ * @action_data:
+ * @file:
+ * @template:
+ *
+ * Sets create file information
+ */
+void
+nautilus_undo_stack_action_data_set_create_data (NautilusUndoStackActionData *action_data,
+ GFile *file,
+ const char *template)
+{
+ action_data->target_file = g_object_ref (file);
+ action_data->template = g_strdup (template);
+
+ action_data->is_valid = TRUE;
+}
+
+/**
+ * nautilus_undo_stack_action_data_set_rename_information:
+ * @action_data: the undo action data instance
+ * @old_file: a #GFile containing the file's old location
+ * @new_file: a #GFile containing the file's new location
+ *
+ * Sets rename information.
+ */
+void
+nautilus_undo_stack_action_data_set_rename_information (NautilusUndoStackActionData *action_data,
+ GFile *old_file,
+ GFile *new_file)
+{
+ action_data->old_file = g_object_ref (old_file);
+ action_data->new_file = g_object_ref (new_file);
+
+ action_data->is_valid = TRUE;
+}
diff --git a/libnautilus-private/nautilus-undostack-actions.h b/libnautilus-private/nautilus-undostack-actions.h
index 4fa83e4..b7f786b 100644
--- a/libnautilus-private/nautilus-undostack-actions.h
+++ b/libnautilus-private/nautilus-undostack-actions.h
@@ -31,9 +31,46 @@
#include <glib.h>
#include <libnautilus-private/nautilus-undostack-types.h>
-NautilusUndoStackActionData * nautilus_undo_stack_action_data_new (NautilusUndoStackActionType type,
+NautilusUndoStackActionData *nautilus_undo_stack_action_data_new (NautilusUndoStackActionType type,
gint items_count);
-
void nautilus_undo_stack_action_data_free (NautilusUndoStackActionData *action);
+void nautilus_undo_stack_action_data_set_src_dir (NautilusUndoStackActionData *data,
+ GFile *src);
+void nautilus_undo_stack_action_data_set_dest_dir (NautilusUndoStackActionData *data,
+ GFile *dest);
+
+void nautilus_undo_stack_action_data_add_origin_target_pair (NautilusUndoStackActionData *data,
+ GFile *origin,
+ GFile *target);
+void nautilus_undo_stack_action_data_set_create_data (NautilusUndoStackActionData *data,
+ GFile *target_file,
+ const char *template_uri);
+void nautilus_undo_stack_action_data_set_rename_information (NautilusUndoStackActionData *data,
+ GFile *old_file,
+ GFile *new_file);
+void nautilus_undo_stack_action_data_add_trashed_file (NautilusUndoStackActionData *data,
+ GFile *file,
+ guint64 mtime);
+void nautilus_undo_stack_action_data_add_file_permissions (NautilusUndoStackActionData *data,
+ GFile *file,
+ guint32 permission);
+void nautilus_undo_stack_action_data_set_recursive_permissions (NautilusUndoStackActionData *data,
+ guint32 file_permissions,
+ guint32 file_mask,
+ guint32 dir_permissions,
+ guint32 dir_mask);
+void nautilus_undo_stack_action_data_set_file_permissions (NautilusUndoStackActionData *data,
+ GFile *file,
+ guint32 current_permissions,
+ guint32 new_permissions);
+void nautilus_undo_stack_action_data_set_owner_change_information (NautilusUndoStackActionData *data,
+ GFile *file,
+ const char *current_user,
+ const char *new_user);
+void nautilus_undo_stack_action_data_set_group_change_information (NautilusUndoStackActionData *data,
+ GFile *file,
+ const char *current_group,
+ const char *new_group);
+
#endif /* __NAUTILUS_UNDOSTACK_ACTIONS_H__ */
diff --git a/libnautilus-private/nautilus-undostack-manager.c b/libnautilus-private/nautilus-undostack-manager.c
index 4cb2d3c..76cc025 100644
--- a/libnautilus-private/nautilus-undostack-manager.c
+++ b/libnautilus-private/nautilus-undostack-manager.c
@@ -58,211 +58,54 @@ static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
G_DEFINE_TYPE (NautilusUndoStackManager, nautilus_undo_stack_manager, G_TYPE_OBJECT)
-static void stack_clear_n_oldest (GQueue * stack, guint n);
-static void stack_fix_size (NautilusUndoStackManagerPrivate *priv);
-static gboolean can_undo (NautilusUndoStackManagerPrivate *priv);
-static gboolean can_redo (NautilusUndoStackManagerPrivate *priv);
-static void stack_push_action (NautilusUndoStackManagerPrivate *priv, NautilusUndoStackActionData *action);
-static NautilusUndoStackActionData * stack_scroll_left (NautilusUndoStackManagerPrivate *priv);
-static NautilusUndoStackActionData * stack_scroll_right (NautilusUndoStackManagerPrivate *priv);
-static NautilusUndoStackActionData * get_next_redo_action (NautilusUndoStackManagerPrivate *priv);
-static NautilusUndoStackActionData * get_next_undo_action (NautilusUndoStackManagerPrivate *priv);
-
-static void do_menu_update (NautilusUndoStackManager * manager);
-static void clear_redo_actions (NautilusUndoStackManagerPrivate *priv);
-
static NautilusUndoStackManager *singleton = NULL;
-static void
-nautilus_undo_stack_manager_init (NautilusUndoStackManager * self)
-{
- NautilusUndoStackManagerPrivate *priv;
-
- priv = NAUTILUS_UNDO_STACK_MANAGER_GET_PRIVATE (self);
-
- self->priv = priv;
-
- /* Initialize private fields */
- priv->stack = g_queue_new ();
- priv->mutex = g_mutex_new ();
- priv->index = 0;
- priv->undo_redo_flag = FALSE;
- priv->confirm_delete = FALSE;
-}
-
-static void
-nautilus_undo_stack_manager_finalize (GObject * object)
-{
- NautilusUndoStackManager *self = NAUTILUS_UNDO_STACK_MANAGER (object);
- NautilusUndoStackManagerPrivate *priv = self->priv;
-
- g_mutex_lock (priv->mutex);
-
- g_queue_foreach (priv->stack, (GFunc) nautilus_undo_stack_action_data_free, NULL);
- g_queue_free (priv->stack);
-
- g_mutex_unlock (priv->mutex);
- g_mutex_free (priv->mutex);
-
- G_OBJECT_CLASS (nautilus_undo_stack_manager_parent_class)->finalize (object);
-}
-
-static void
-nautilus_undo_stack_manager_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec * pspec)
+static NautilusUndoStackActionData *
+get_next_redo_action (NautilusUndoStackManagerPrivate *priv)
{
- NautilusUndoStackManager *manager;
- NautilusUndoStackManagerPrivate *priv;
- guint new_undo_levels;
-
- g_return_if_fail (NAUTILUS_IS_UNDO_STACK_MANAGER (object));
-
- manager = NAUTILUS_UNDO_STACK_MANAGER (object);
- priv = manager->priv;
+ NautilusUndoStackActionData *action;
- switch (prop_id) {
- case PROP_UNDO_LEVELS:
- new_undo_levels = g_value_get_uint (value);
- if (new_undo_levels > 0 && (priv->undo_levels != new_undo_levels)) {
- priv->undo_levels = new_undo_levels;
- g_mutex_lock (priv->mutex);
- stack_fix_size (priv);
- g_mutex_unlock (priv->mutex);
- do_menu_update (manager);
- }
- break;
- case PROP_CONFIRM_DELETE:
- priv->confirm_delete = g_value_get_boolean (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
+ if (g_queue_is_empty (priv->stack)) {
+ return NULL;
}
-}
-
-static void
-nautilus_undo_stack_manager_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- NautilusUndoStackManager *manager;
- NautilusUndoStackManagerPrivate *priv;
-
- g_return_if_fail (NAUTILUS_IS_UNDO_STACK_MANAGER (object));
-
- manager = NAUTILUS_UNDO_STACK_MANAGER (object);
- priv = manager->priv;
- switch (prop_id) {
- case PROP_UNDO_LEVELS:
- g_value_set_uint (value, priv->undo_levels);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
+ if (priv->index == 0) {
+ /* ... no redo actions */
+ return NULL;
}
-}
-static GObject *
-nautilus_undo_stack_manager_constructor (GType type,
- guint n_construct_params,
- GObjectConstructParam *construct_params)
-{
- GObject *retval;
+ action = (NautilusUndoStackActionData *) g_queue_peek_nth (priv->stack, priv->index - 1);
- if (singleton != NULL) {
- return g_object_ref (singleton);
+ if (action->locked) {
+ return NULL;
+ } else {
+ return action;
}
-
- retval = G_OBJECT_CLASS (nautilus_undo_stack_manager_parent_class)->constructor
- (type, n_construct_params, construct_params);
-
- singleton = NAUTILUS_UNDO_STACK_MANAGER (retval);
- g_object_add_weak_pointer (retval, (gpointer) &singleton);
-
- return retval;
}
-static void
-nautilus_undo_stack_manager_class_init (NautilusUndoStackManagerClass *klass)
-{
- GObjectClass *oclass;
-
- oclass = G_OBJECT_CLASS (klass);
-
- oclass->constructor = nautilus_undo_stack_manager_constructor;
- oclass->finalize = nautilus_undo_stack_manager_finalize;
- oclass->set_property = nautilus_undo_stack_manager_set_property;
- oclass->get_property = nautilus_undo_stack_manager_get_property;
-
-
- /* Create properties */
- properties[PROP_UNDO_LEVELS] =
- g_param_spec_uint ("undo-levels",
- "undo levels",
- "Number of undo levels to be stored",
- 1, UINT_MAX, DEFAULT_UNDO_DEPTH,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
- properties[PROP_CONFIRM_DELETE] =
- g_param_spec_boolean ("confirm-delete",
- "confirm delete",
- "Always confirm file deletion",
- FALSE,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
-
- g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
-
- /* The UI menu needs to update its status */
- g_signal_new ("request-menu-update",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
- 0, NULL, NULL,
- g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER);
-
- g_type_class_add_private (klass, sizeof (NautilusUndoStackManagerPrivate));
-}
-
-/**
- * nautilus_undo_stack_manager_get:
- *
- * Gets the undo manager singleton.
- *
- * Returns: The #NautilusUndoStackManager singleton.
- */
-NautilusUndoStackManager *
-nautilus_undo_stack_manager_get (void)
+static NautilusUndoStackActionData *
+get_next_undo_action (NautilusUndoStackManagerPrivate *priv)
{
- NautilusUndoStackManager *manager;
+ NautilusUndoStackActionData *action;
+ guint stack_size;
- manager = g_object_new (NAUTILUS_TYPE_UNDO_STACK_MANAGER,
- "undo-levels", DEFAULT_UNDO_DEPTH,
- NULL);
+ if (g_queue_is_empty (priv->stack)) {
+ return NULL;
+ }
- return manager;
-}
+ stack_size = g_queue_get_length (priv->stack);
-/**
- * nautilus_undo_stack_manager_is_undo_redo:
- * @manager:
- *
- * Returns: %TRUE if undoing or redoing. TODO: Why does this clear the flag?
- */
-gboolean
-nautilus_undo_stack_manager_is_undo_redo (NautilusUndoStackManager *manager)
-{
- NautilusUndoStackManagerPrivate *priv;
+ if (priv->index == stack_size) {
+ return NULL;
+ }
- priv = manager->priv;
+ action = (NautilusUndoStackActionData *) g_queue_peek_nth (priv->stack, priv->index);
- if (priv->undo_redo_flag) {
- priv->undo_redo_flag = FALSE;
- return TRUE;
+ if (action->locked) {
+ return NULL;
+ } else {
+ return action;
}
-
- return FALSE;
}
static void
@@ -330,16 +173,111 @@ get_redo_description (UndoData *action)
return action->redo_description;
}
-/**
- * nautilus_undo_stack_manager_request_menu_update:
- * @manager:
- *
- *
- */
-void
-nautilus_undo_stack_manager_request_menu_update (NautilusUndoStackManager *manager)
+static void
+do_menu_update (NautilusUndoStackManager * manager)
{
- do_menu_update (manager);
+ NautilusUndoStackActionData *action;
+ NautilusUndoStackManagerPrivate *priv;
+ NautilusUndoStackMenuData *data;
+
+ g_return_if_fail (manager != NULL);
+
+ priv = manager->priv;
+ data = g_slice_new0 (NautilusUndoStackMenuData);
+
+ g_mutex_lock (priv->mutex);
+
+ action = get_next_undo_action (priv);
+
+ if (action != NULL) {
+ data->undo_label = get_undo_label (action);
+ data->undo_description = get_undo_description (action);
+ }
+
+ action = get_next_redo_action (priv);
+
+ if (action != NULL) {
+ data->redo_label = get_redo_label (action);
+ data->redo_description = get_redo_description (action);
+ }
+
+ g_mutex_unlock (priv->mutex);
+
+ /* Update menus */
+ g_signal_emit_by_name (manager, "request-menu-update", data);
+
+ /* Free the signal data */
+ /* Note: we do not own labels and descriptions, they are part of the action. */
+ g_slice_free (NautilusUndoStackMenuData, data);
+}
+
+static void
+clear_redo_actions (NautilusUndoStackManagerPrivate *priv)
+{
+ while (priv->index > 0) {
+ NautilusUndoStackActionData *head;
+ head = (NautilusUndoStackActionData *)g_queue_pop_head (priv->stack);
+ nautilus_undo_stack_action_data_free (head);
+ priv->index--;
+ }
+}
+
+static gboolean
+can_undo (NautilusUndoStackManagerPrivate *priv)
+{
+ return (get_next_undo_action (priv) != NULL);
+}
+
+static gboolean
+can_redo (NautilusUndoStackManagerPrivate *priv)
+{
+ return (get_next_redo_action (priv) != NULL);
+}
+
+static NautilusUndoStackActionData *
+stack_scroll_right (NautilusUndoStackManagerPrivate *priv)
+{
+ NautilusUndoStackActionData *data;
+
+ if (!can_undo (priv))
+ return NULL;
+
+ data = (NautilusUndoStackActionData *) g_queue_peek_nth (priv->stack, priv->index);
+ if (priv->index < g_queue_get_length (priv->stack)) {
+ priv->index++;
+ }
+
+ return data;
+}
+
+static NautilusUndoStackActionData *
+stack_scroll_left (NautilusUndoStackManagerPrivate *priv)
+{
+ NautilusUndoStackActionData *data;
+
+ if (!can_redo (priv))
+ return NULL;
+
+ priv->index--;
+ data = (NautilusUndoStackActionData *) g_queue_peek_nth (priv->stack, priv->index);
+
+ return data;
+}
+
+static void
+stack_clear_n_oldest (GQueue * stack, guint n)
+{
+ NautilusUndoStackActionData *action;
+ guint i;
+
+ for (i = 0; i < n; i++) {
+ action = (NautilusUndoStackActionData *) g_queue_pop_tail (stack);
+ if (action->locked) {
+ action->freed = TRUE;
+ } else {
+ nautilus_undo_stack_action_data_free (action);
+ }
+ }
}
static void
@@ -385,51 +323,6 @@ do_undo_redo (NautilusUndoStackManager *self,
}
-void
-nautilus_undo_stack_manager_redo (NautilusUndoStackManager *manager,
- NautilusUndoStackFinishCallback callback,
- gpointer user_data)
-{
- do_undo_redo (manager, FALSE, callback, user_data);
-}
-
-void
-nautilus_undo_stack_manager_undo (NautilusUndoStackManager *manager,
- NautilusUndoStackFinishCallback callback,
- gpointer user_data)
-{
- do_undo_redo (manager, TRUE, callback, user_data);
-}
-
-/**
- * nautilus_undo_stack_manager_add_action:
- * @manager:
- * @action:
- *
- * Pushes an undo action onto the top of the stack.
- */
-void
-nautilus_undo_stack_manager_add_action (NautilusUndoStackManager *manager,
- NautilusUndoStackActionData *action)
-{
- NautilusUndoStackManagerPrivate *priv;
-
- priv = manager->priv;
-
- if (!(action && action->is_valid)) {
- nautilus_undo_stack_action_data_free (action);
- return;
- }
-
- action->manager = manager;
-
- g_mutex_lock (priv->mutex);
- stack_push_action (priv, action);
- g_mutex_unlock (priv->mutex);
-
- do_menu_update (manager);
-}
-
/**
* nautilus_undo_stack_manager_trash_has_emptied:
* @manager:
@@ -498,434 +391,284 @@ nautilus_undo_stack_manager_get_file_modification_time (GFile * file)
return mtime;
}
-/**
- * nautilus_undo_stack_action_data_set_src_dir:
- * @action_data:
- * @src:
- *
- * Sets the source directory.
- */
-void
-nautilus_undo_stack_action_data_set_src_dir (NautilusUndoStackActionData *action_data,
- GFile *src)
-{
- action_data->src_dir = src;
-}
-
-/**
- * nautilus_undo_stack_action_data_set_dest_dir:
- * @action_data:
- * @dest:
- *
- * Sets the destination directory
- */
-void
-nautilus_undo_stack_action_data_set_dest_dir (NautilusUndoStackActionData *action_data,
- GFile *dest)
-{
- action_data->dest_dir = dest;
-}
-
-/**
- * nautilus_undo_stack_action_data_add_origin_pair_target:
- * @action_data:
- * @origin:
- * @target:
- *
- * Pushes an origin, target pair in an existing undo data container
- */
-void
-nautilus_undo_stack_action_data_add_origin_target_pair (NautilusUndoStackActionData *action_data,
- GFile *origin,
- GFile *target)
+static void
+stack_fix_size (NautilusUndoStackManagerPrivate *priv)
{
- char *src_relative;
- char *dest_relative;
+ guint length;
- src_relative = g_file_get_relative_path (action_data->src_dir, origin);
- action_data->sources = g_list_append (action_data->sources, src_relative);
- dest_relative = g_file_get_relative_path (action_data->dest_dir, target);
- action_data->destinations = g_list_append (action_data->destinations, dest_relative);
+ length = g_queue_get_length (priv->stack);
- action_data->is_valid = TRUE;
+ if (length > priv->undo_levels) {
+ if (priv->index > (priv->undo_levels + 1)) {
+ /* If the index will fall off the stack
+ * move it back to the maximum position */
+ priv->index = priv->undo_levels + 1;
+ }
+ stack_clear_n_oldest (priv->stack, length - (priv->undo_levels));
+ }
}
-/**
- * nautilus_undo_stack_action_data_add_trashed_file:
- * @action_data:
- * @file:
- * @mtime:
- *
- * Pushes an trashed file with modification time in an existing undo data container.
- */
-void
-nautilus_undo_stack_action_data_add_trashed_file (NautilusUndoStackActionData *action_data,
- GFile *file,
- guint64 mtime)
+static void
+stack_push_action (NautilusUndoStackManagerPrivate *priv,
+ NautilusUndoStackActionData *action)
{
- guint64 *modification_time;
- char *original_uri;
-
- if (action_data->trashed == NULL) {
- action_data->trashed =
- g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, g_free);
- }
-
- modification_time = g_new (guint64, 1);
- *modification_time = mtime;
+ guint length;
- original_uri = g_file_get_uri (file);
+ clear_redo_actions (priv);
- g_hash_table_insert (action_data->trashed, original_uri, modification_time);
+ g_queue_push_head (priv->stack, (gpointer) action);
+ length = g_queue_get_length (priv->stack);
- action_data->is_valid = TRUE;
+ if (length > priv->undo_levels) {
+ stack_fix_size (priv);
+ }
}
-/**
- * nautilus_undo_stack_action_data_add_file_permissions:
- * @action_data:
- * @file:
- * @permission:
- *
- * Pushes a recursive permission change data in an existing undo data container
- */
-void
-nautilus_undo_stack_action_data_add_file_permissions (NautilusUndoStackActionData *action_data,
- GFile *file,
- guint32 permission)
+static void
+nautilus_undo_stack_manager_init (NautilusUndoStackManager * self)
{
- guint32 *current_permissions;
- char *original_uri;
-
- if (action_data->original_permissions == NULL) {
- action_data->original_permissions =
- g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
- }
-
- current_permissions = g_new (guint32, 1);
- *current_permissions = permission;
+ NautilusUndoStackManagerPrivate *priv;
- original_uri = g_file_get_uri (file);
+ priv = NAUTILUS_UNDO_STACK_MANAGER_GET_PRIVATE (self);
- g_hash_table_insert (action_data->original_permissions, original_uri, current_permissions);
+ self->priv = priv;
- action_data->is_valid = TRUE;
+ /* Initialize private fields */
+ priv->stack = g_queue_new ();
+ priv->mutex = g_mutex_new ();
+ priv->index = 0;
+ priv->undo_redo_flag = FALSE;
+ priv->confirm_delete = FALSE;
}
-/**
- * nautilus_undo_stack_action_data_set_file_permissions:
- * @action_data:
- * @uri:
- * @current_permissions:
- * @new_permissions:
- *
- * Sets the original file permission in an existing undo data container
- */
-void
-nautilus_undo_stack_action_data_set_file_permissions (NautilusUndoStackActionData *action_data,
- GFile *file,
- guint32 current_permissions,
- guint32 new_permissions)
+static void
+nautilus_undo_stack_manager_finalize (GObject * object)
{
- action_data->target_file = g_object_ref (file);
- action_data->current_permissions = current_permissions;
- action_data->new_permissions = new_permissions;
+ NautilusUndoStackManager *self = NAUTILUS_UNDO_STACK_MANAGER (object);
+ NautilusUndoStackManagerPrivate *priv = self->priv;
- action_data->is_valid = TRUE;
-}
+ g_mutex_lock (priv->mutex);
+
+ g_queue_foreach (priv->stack, (GFunc) nautilus_undo_stack_action_data_free, NULL);
+ g_queue_free (priv->stack);
-/**
- * nautilus_undo_stack_action_data_set_owner_change_information:
- * @action_data:
- * @uri:
- * @current_user:
- * @new_user:
- *
- * Sets the change owner information in an existing undo data container
- */
-void
-nautilus_undo_stack_action_data_set_owner_change_information (NautilusUndoStackActionData *action_data,
- GFile *file,
- const char *current_user,
- const char *new_user)
-{
- action_data->target_file = g_object_ref (file);
- action_data->original_name = g_strdup (current_user);
- action_data->new_name = g_strdup (new_user);
+ g_mutex_unlock (priv->mutex);
+ g_mutex_free (priv->mutex);
- action_data->is_valid = TRUE;
+ G_OBJECT_CLASS (nautilus_undo_stack_manager_parent_class)->finalize (object);
}
-/**
- * nautilus_undo_stack_action_data_set_group_change_information:
- * @action_data:
- * @uri:
- * @current_group:
- * @new_group:
- *
- * Sets the change group information in an existing undo data container
- */
-void
-nautilus_undo_stack_action_data_set_group_change_information (NautilusUndoStackActionData *action_data,
- GFile *file,
- const char *current_group,
- const char *new_group)
+static void
+nautilus_undo_stack_manager_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec * pspec)
{
- action_data->target_file = g_object_ref (file);
- action_data->original_name = g_strdup (current_group);
- action_data->new_name = g_strdup (new_group);
-
- action_data->is_valid = TRUE;
-}
+ NautilusUndoStackManager *manager;
+ NautilusUndoStackManagerPrivate *priv;
+ guint new_undo_levels;
-/**
- * nautilus_undo_stack_action_data_set_recursive_permissions:
- * @data:
- * @file_permissions:
- * @file_mask:
- * @dir_permissions:
- * @dir_mask:
- *
- * Sets the permission change mask
- */
-void
-nautilus_undo_stack_action_data_set_recursive_permissions (NautilusUndoStackActionData *action_data,
- guint32 file_permissions,
- guint32 file_mask,
- guint32 dir_permissions,
- guint32 dir_mask)
-{
- action_data->file_permissions = file_permissions;
- action_data->file_mask = file_mask;
- action_data->dir_permissions = dir_permissions;
- action_data->dir_mask = dir_mask;
-
- action_data->is_valid = TRUE;
-}
+ g_return_if_fail (NAUTILUS_IS_UNDO_STACK_MANAGER (object));
-/**
- * nautilus_undo_stack_action_data_set_create_data:
- * @action_data:
- * @file:
- * @template:
- *
- * Sets create file information
- */
-void
-nautilus_undo_stack_action_data_set_create_data (NautilusUndoStackActionData *action_data,
- GFile *file,
- const char *template)
-{
- action_data->target_file = g_object_ref (file);
- action_data->template = g_strdup (template);
+ manager = NAUTILUS_UNDO_STACK_MANAGER (object);
+ priv = manager->priv;
- action_data->is_valid = TRUE;
+ switch (prop_id) {
+ case PROP_UNDO_LEVELS:
+ new_undo_levels = g_value_get_uint (value);
+ if (new_undo_levels > 0 && (priv->undo_levels != new_undo_levels)) {
+ priv->undo_levels = new_undo_levels;
+ g_mutex_lock (priv->mutex);
+ stack_fix_size (priv);
+ g_mutex_unlock (priv->mutex);
+ do_menu_update (manager);
+ }
+ break;
+ case PROP_CONFIRM_DELETE:
+ priv->confirm_delete = g_value_get_boolean (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
}
-/**
- * nautilus_undo_stack_action_data_set_rename_information:
- * @action_data: the undo action data instance
- * @old_file: a #GFile containing the file's old location
- * @new_file: a #GFile containing the file's new location
- *
- * Sets rename information.
- */
-void
-nautilus_undo_stack_action_data_set_rename_information (NautilusUndoStackActionData *action_data,
- GFile *old_file,
- GFile *new_file)
+static void
+nautilus_undo_stack_manager_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
{
- action_data->old_file = g_object_ref (old_file);
- action_data->new_file = g_object_ref (new_file);
-
- action_data->is_valid = TRUE;
-}
+ NautilusUndoStackManager *manager;
+ NautilusUndoStackManagerPrivate *priv;
-static NautilusUndoStackActionData *
-stack_scroll_right (NautilusUndoStackManagerPrivate *priv)
-{
- NautilusUndoStackActionData *data;
+ g_return_if_fail (NAUTILUS_IS_UNDO_STACK_MANAGER (object));
- if (!can_undo (priv))
- return NULL;
+ manager = NAUTILUS_UNDO_STACK_MANAGER (object);
+ priv = manager->priv;
- data = (NautilusUndoStackActionData *) g_queue_peek_nth (priv->stack, priv->index);
- if (priv->index < g_queue_get_length (priv->stack)) {
- priv->index++;
+ switch (prop_id) {
+ case PROP_UNDO_LEVELS:
+ g_value_set_uint (value, priv->undo_levels);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
}
-
- return data;
}
-static NautilusUndoStackActionData *
-stack_scroll_left (NautilusUndoStackManagerPrivate *priv)
+static GObject *
+nautilus_undo_stack_manager_constructor (GType type,
+ guint n_construct_params,
+ GObjectConstructParam *construct_params)
{
- NautilusUndoStackActionData *data;
+ GObject *retval;
- if (!can_redo (priv))
- return NULL;
+ if (singleton != NULL) {
+ return g_object_ref (singleton);
+ }
- priv->index--;
- data = (NautilusUndoStackActionData *) g_queue_peek_nth (priv->stack, priv->index);
+ retval = G_OBJECT_CLASS (nautilus_undo_stack_manager_parent_class)->constructor
+ (type, n_construct_params, construct_params);
- return data;
+ singleton = NAUTILUS_UNDO_STACK_MANAGER (retval);
+ g_object_add_weak_pointer (retval, (gpointer) &singleton);
+
+ return retval;
}
static void
-stack_clear_n_oldest (GQueue * stack, guint n)
+nautilus_undo_stack_manager_class_init (NautilusUndoStackManagerClass *klass)
{
- NautilusUndoStackActionData *action;
- guint i;
+ GObjectClass *oclass;
- for (i = 0; i < n; i++) {
- action = (NautilusUndoStackActionData *) g_queue_pop_tail (stack);
- if (action->locked) {
- action->freed = TRUE;
- } else {
- nautilus_undo_stack_action_data_free (action);
- }
- }
-}
+ oclass = G_OBJECT_CLASS (klass);
-static void
-stack_fix_size (NautilusUndoStackManagerPrivate *priv)
-{
- guint length;
+ oclass->constructor = nautilus_undo_stack_manager_constructor;
+ oclass->finalize = nautilus_undo_stack_manager_finalize;
+ oclass->set_property = nautilus_undo_stack_manager_set_property;
+ oclass->get_property = nautilus_undo_stack_manager_get_property;
- length = g_queue_get_length (priv->stack);
- if (length > priv->undo_levels) {
- if (priv->index > (priv->undo_levels + 1)) {
- /* If the index will fall off the stack
- * move it back to the maximum position */
- priv->index = priv->undo_levels + 1;
- }
- stack_clear_n_oldest (priv->stack, length - (priv->undo_levels));
- }
-}
+ /* Create properties */
+ properties[PROP_UNDO_LEVELS] =
+ g_param_spec_uint ("undo-levels",
+ "undo levels",
+ "Number of undo levels to be stored",
+ 1, UINT_MAX, DEFAULT_UNDO_DEPTH,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
+ properties[PROP_CONFIRM_DELETE] =
+ g_param_spec_boolean ("confirm-delete",
+ "confirm delete",
+ "Always confirm file deletion",
+ FALSE,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
-static void
-clear_redo_actions (NautilusUndoStackManagerPrivate *priv)
-{
- while (priv->index > 0) {
- NautilusUndoStackActionData *head;
- head = (NautilusUndoStackActionData *)g_queue_pop_head (priv->stack);
- nautilus_undo_stack_action_data_free (head);
- priv->index--;
- }
+ g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
+
+ /* The UI menu needs to update its status */
+ g_signal_new ("request-menu-update",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+ 0, NULL, NULL,
+ g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER);
+
+ g_type_class_add_private (klass, sizeof (NautilusUndoStackManagerPrivate));
}
-static void
-stack_push_action (NautilusUndoStackManagerPrivate *priv,
- NautilusUndoStackActionData *action)
+/**
+ * nautilus_undo_stack_manager_get:
+ *
+ * Gets the undo manager singleton.
+ *
+ * Returns: The #NautilusUndoStackManager singleton.
+ */
+NautilusUndoStackManager *
+nautilus_undo_stack_manager_get (void)
{
- guint length;
-
- clear_redo_actions (priv);
+ NautilusUndoStackManager *manager;
- g_queue_push_head (priv->stack, (gpointer) action);
- length = g_queue_get_length (priv->stack);
+ manager = g_object_new (NAUTILUS_TYPE_UNDO_STACK_MANAGER,
+ "undo-levels", DEFAULT_UNDO_DEPTH,
+ NULL);
- if (length > priv->undo_levels) {
- stack_fix_size (priv);
- }
+ return manager;
}
-static gboolean
-can_undo (NautilusUndoStackManagerPrivate *priv)
+/**
+ * nautilus_undo_stack_manager_request_menu_update:
+ * @manager:
+ *
+ *
+ */
+void
+nautilus_undo_stack_manager_request_menu_update (NautilusUndoStackManager *manager)
{
- return (get_next_undo_action (priv) != NULL);
+ do_menu_update (manager);
}
-static gboolean
-can_redo (NautilusUndoStackManagerPrivate *priv)
+void
+nautilus_undo_stack_manager_redo (NautilusUndoStackManager *manager,
+ NautilusUndoStackFinishCallback callback,
+ gpointer user_data)
{
- return (get_next_redo_action (priv) != NULL);
+ do_undo_redo (manager, FALSE, callback, user_data);
}
-static NautilusUndoStackActionData *
-get_next_redo_action (NautilusUndoStackManagerPrivate *priv)
+void
+nautilus_undo_stack_manager_undo (NautilusUndoStackManager *manager,
+ NautilusUndoStackFinishCallback callback,
+ gpointer user_data)
{
- NautilusUndoStackActionData *action;
-
- if (g_queue_is_empty (priv->stack)) {
- return NULL;
- }
-
- if (priv->index == 0) {
- /* ... no redo actions */
- return NULL;
- }
-
- action = (NautilusUndoStackActionData *) g_queue_peek_nth (priv->stack, priv->index - 1);
-
- if (action->locked) {
- return NULL;
- } else {
- return action;
- }
+ do_undo_redo (manager, TRUE, callback, user_data);
}
-static NautilusUndoStackActionData *
-get_next_undo_action (NautilusUndoStackManagerPrivate *priv)
+/**
+ * nautilus_undo_stack_manager_add_action:
+ * @manager:
+ * @action:
+ *
+ * Pushes an undo action onto the top of the stack.
+ */
+void
+nautilus_undo_stack_manager_add_action (NautilusUndoStackManager *manager,
+ NautilusUndoStackActionData *action)
{
- NautilusUndoStackActionData *action;
- guint stack_size;
-
- if (g_queue_is_empty (priv->stack)) {
- return NULL;
- }
+ NautilusUndoStackManagerPrivate *priv;
- stack_size = g_queue_get_length (priv->stack);
+ priv = manager->priv;
- if (priv->index == stack_size) {
- return NULL;
+ if (!(action && action->is_valid)) {
+ nautilus_undo_stack_action_data_free (action);
+ return;
}
- action = (NautilusUndoStackActionData *) g_queue_peek_nth (priv->stack, priv->index);
+ action->manager = manager;
- if (action->locked) {
- return NULL;
- } else {
- return action;
- }
+ g_mutex_lock (priv->mutex);
+ stack_push_action (priv, action);
+ g_mutex_unlock (priv->mutex);
+
+ do_menu_update (manager);
}
-static void
-do_menu_update (NautilusUndoStackManager * manager)
+/**
+ * nautilus_undo_stack_manager_is_undo_redo:
+ * @manager:
+ *
+ * Returns: %TRUE if undoing or redoing. TODO: Why does this clear the flag?
+ */
+gboolean
+nautilus_undo_stack_manager_is_undo_redo (NautilusUndoStackManager *manager)
{
- NautilusUndoStackActionData *action;
NautilusUndoStackManagerPrivate *priv;
- NautilusUndoStackMenuData *data;
-
- g_return_if_fail (manager != NULL);
priv = manager->priv;
- data = g_slice_new0 (NautilusUndoStackMenuData);
- g_mutex_lock (priv->mutex);
-
- action = get_next_undo_action (priv);
-
- if (action != NULL) {
- data->undo_label = get_undo_label (action);
- data->undo_description = get_undo_description (action);
- }
-
- action = get_next_redo_action (priv);
-
- if (action != NULL) {
- data->redo_label = get_redo_label (action);
- data->redo_description = get_redo_description (action);
+ if (priv->undo_redo_flag) {
+ priv->undo_redo_flag = FALSE;
+ return TRUE;
}
- g_mutex_unlock (priv->mutex);
-
- /* Update menus */
- g_signal_emit_by_name (manager, "request-menu-update", data);
-
- /* Free the signal data */
- /* Note: we do not own labels and descriptions, they are part of the action. */
- g_slice_free (NautilusUndoStackMenuData, data);
+ return FALSE;
}
diff --git a/libnautilus-private/nautilus-undostack-manager.h b/libnautilus-private/nautilus-undostack-manager.h
index 1cd035e..3384b09 100644
--- a/libnautilus-private/nautilus-undostack-manager.h
+++ b/libnautilus-private/nautilus-undostack-manager.h
@@ -80,44 +80,4 @@ void nautilus_undo_stack_manager_trash_has_emptied (NautilusUndoStackManager *ma
void nautilus_undo_stack_manager_request_menu_update (NautilusUndoStackManager *manager);
guint64 nautilus_undo_stack_manager_get_file_modification_time (GFile *file);
-NautilusUndoStackActionData * nautilus_undo_stack_action_data_new (NautilusUndoStackActionType type,
- gint items_count);
-
-void nautilus_undo_stack_action_data_set_src_dir (NautilusUndoStackActionData *data,
- GFile *src);
-void nautilus_undo_stack_action_data_set_dest_dir (NautilusUndoStackActionData *data,
- GFile *dest);
-void nautilus_undo_stack_action_data_add_origin_target_pair (NautilusUndoStackActionData *data,
- GFile *origin,
- GFile *target);
-void nautilus_undo_stack_action_data_set_create_data (NautilusUndoStackActionData *data,
- GFile *target_file,
- const char *template_uri);
-void nautilus_undo_stack_action_data_set_rename_information (NautilusUndoStackActionData *data,
- GFile *old_file,
- GFile *new_file);
-void nautilus_undo_stack_action_data_add_trashed_file (NautilusUndoStackActionData *data,
- GFile *file,
- guint64 mtime);
-void nautilus_undo_stack_action_data_add_file_permissions (NautilusUndoStackActionData *data,
- GFile *file,
- guint32 permission);
-void nautilus_undo_stack_action_data_set_recursive_permissions (NautilusUndoStackActionData *data,
- guint32 file_permissions,
- guint32 file_mask,
- guint32 dir_permissions,
- guint32 dir_mask);
-void nautilus_undo_stack_action_data_set_file_permissions (NautilusUndoStackActionData *data,
- GFile *file,
- guint32 current_permissions,
- guint32 new_permissions);
-void nautilus_undo_stack_action_data_set_owner_change_information (NautilusUndoStackActionData *data,
- GFile *file,
- const char *current_user,
- const char *new_user);
-void nautilus_undo_stack_action_data_set_group_change_information (NautilusUndoStackActionData *data,
- GFile *file,
- const char *current_group,
- const char *new_group);
-
#endif /* __NAUTILUS_UNDO_STACK_MANAGER_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]