[nautilus/undo-manager] undostack: get rid of forawrd declarations



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]