summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDebarshi Ray <debarshir@gnome.org>2015-09-09 17:24:25 +0200
committerDebarshi Ray <debarshir@gnome.org>2015-09-09 17:29:25 +0200
commitd7f84d5d2420bb0408323047aa1f60fa84ec7381 (patch)
treefd3236ed0be20b601c5e7e47229442a29f99b09f
parent082cbf36bcd968d9ff24e83d04c48b93ab85b404 (diff)
downloadnautilus-d7f84d5d2420bb0408323047aa1f60fa84ec7381.tar.gz
file, file-undo-operations: Let renames on Google Drive be undone
We really should be using standard::display-name when renaming files - g_file_get_basename is simply not the right thing to use. Moreover, in case of Google Drive, the URI might not change with the display name and we can not get the old display name from the old GFile. Therefore, let's explicitly keep track of the old and new display names to address these issues. https://bugzilla.gnome.org/show_bug.cgi?id=754785
-rw-r--r--libnautilus-private/nautilus-file-undo-operations.c29
-rw-r--r--libnautilus-private/nautilus-file-undo-operations.h9
-rw-r--r--libnautilus-private/nautilus-file.c9
3 files changed, 31 insertions, 16 deletions
diff --git a/libnautilus-private/nautilus-file-undo-operations.c b/libnautilus-private/nautilus-file-undo-operations.c
index 25a49f249..6a47223d5 100644
--- a/libnautilus-private/nautilus-file-undo-operations.c
+++ b/libnautilus-private/nautilus-file-undo-operations.c
@@ -852,6 +852,8 @@ G_DEFINE_TYPE (NautilusFileUndoInfoRename, nautilus_file_undo_info_rename, NAUTI
struct _NautilusFileUndoInfoRenameDetails {
GFile *old_file;
GFile *new_file;
+ gchar *old_display_name;
+ gchar *new_display_name;
};
static void
@@ -882,16 +884,13 @@ rename_redo_func (NautilusFileUndoInfo *info,
GtkWindow *parent_window)
{
NautilusFileUndoInfoRename *self = NAUTILUS_FILE_UNDO_INFO_RENAME (info);
- gchar *new_name;
NautilusFile *file;
- new_name = g_file_get_basename (self->priv->new_file);
file = nautilus_file_get (self->priv->old_file);
- nautilus_file_rename (file, new_name,
+ nautilus_file_rename (file, self->priv->new_display_name,
file_undo_info_operation_callback, self);
nautilus_file_unref (file);
- g_free (new_name);
}
static void
@@ -899,16 +898,13 @@ rename_undo_func (NautilusFileUndoInfo *info,
GtkWindow *parent_window)
{
NautilusFileUndoInfoRename *self = NAUTILUS_FILE_UNDO_INFO_RENAME (info);
- gchar *new_name;
NautilusFile *file;
- new_name = g_file_get_basename (self->priv->old_file);
file = nautilus_file_get (self->priv->new_file);
- nautilus_file_rename (file, new_name,
+ nautilus_file_rename (file, self->priv->old_display_name,
file_undo_info_operation_callback, self);
nautilus_file_unref (file);
- g_free (new_name);
}
static void
@@ -924,6 +920,8 @@ nautilus_file_undo_info_rename_finalize (GObject *obj)
NautilusFileUndoInfoRename *self = NAUTILUS_FILE_UNDO_INFO_RENAME (obj);
g_clear_object (&self->priv->old_file);
g_clear_object (&self->priv->new_file);
+ g_free (self->priv->old_display_name);
+ g_free (self->priv->new_display_name);
G_OBJECT_CLASS (nautilus_file_undo_info_rename_parent_class)->finalize (obj);
}
@@ -953,11 +951,20 @@ nautilus_file_undo_info_rename_new (void)
}
void
-nautilus_file_undo_info_rename_set_data (NautilusFileUndoInfoRename *self,
- GFile *old_file,
- GFile *new_file)
+nautilus_file_undo_info_rename_set_data_pre (NautilusFileUndoInfoRename *self,
+ GFile *old_file,
+ gchar *old_display_name,
+ gchar *new_display_name)
{
self->priv->old_file = g_object_ref (old_file);
+ self->priv->old_display_name = g_strdup (old_display_name);
+ self->priv->new_display_name = g_strdup (new_display_name);
+}
+
+void
+nautilus_file_undo_info_rename_set_data_post (NautilusFileUndoInfoRename *self,
+ GFile *new_file)
+{
self->priv->new_file = g_object_ref (new_file);
}
diff --git a/libnautilus-private/nautilus-file-undo-operations.h b/libnautilus-private/nautilus-file-undo-operations.h
index 498c7662f..ffc1fa2db 100644
--- a/libnautilus-private/nautilus-file-undo-operations.h
+++ b/libnautilus-private/nautilus-file-undo-operations.h
@@ -179,9 +179,12 @@ struct _NautilusFileUndoInfoRenameClass {
GType nautilus_file_undo_info_rename_get_type (void) G_GNUC_CONST;
NautilusFileUndoInfo *nautilus_file_undo_info_rename_new (void);
-void nautilus_file_undo_info_rename_set_data (NautilusFileUndoInfoRename *self,
- GFile *old_file,
- GFile *new_file);
+void nautilus_file_undo_info_rename_set_data_pre (NautilusFileUndoInfoRename *self,
+ GFile *old_file,
+ gchar *old_display_name,
+ gchar *new_display_name);
+void nautilus_file_undo_info_rename_set_data_post (NautilusFileUndoInfoRename *self,
+ GFile *new_file);
/* trash */
#define NAUTILUS_TYPE_FILE_UNDO_INFO_TRASH (nautilus_file_undo_info_trash_get_type ())
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index 6807cad3b..7b2f91c19 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -1791,8 +1791,8 @@ rename_callback (GObject *source_object,
if (new_file != NULL) {
if (op->undo_info != NULL) {
- nautilus_file_undo_info_rename_set_data (NAUTILUS_FILE_UNDO_INFO_RENAME (op->undo_info),
- G_FILE (source_object), new_file);
+ nautilus_file_undo_info_rename_set_data_post (NAUTILUS_FILE_UNDO_INFO_RENAME (op->undo_info),
+ new_file);
}
g_file_query_info_async (new_file,
@@ -1970,6 +1970,11 @@ nautilus_file_rename (NautilusFile *file,
/* Tell the undo manager a rename is taking place */
if (!nautilus_file_undo_manager_pop_flag ()) {
op->undo_info = nautilus_file_undo_info_rename_new ();
+
+ old_name = nautilus_file_get_display_name (file);
+ nautilus_file_undo_info_rename_set_data_pre (NAUTILUS_FILE_UNDO_INFO_RENAME (op->undo_info),
+ location, old_name, new_file_name);
+ g_free (old_name);
}
/* Do the renaming. */