diff options
author | Debarshi Ray <debarshir@gnome.org> | 2015-09-09 17:24:25 +0200 |
---|---|---|
committer | Debarshi Ray <debarshir@gnome.org> | 2015-09-09 17:29:25 +0200 |
commit | d7f84d5d2420bb0408323047aa1f60fa84ec7381 (patch) | |
tree | fd3236ed0be20b601c5e7e47229442a29f99b09f | |
parent | 082cbf36bcd968d9ff24e83d04c48b93ab85b404 (diff) | |
download | nautilus-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.c | 29 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file-undo-operations.h | 9 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file.c | 9 |
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. */ |