Author: jannis Date: 2009-05-11 23:23:08 +0000 (Mon, 11 May 2009) New Revision: 29949
Modified: thunar/branches/migration-to-gio/ChangeLog thunar/branches/migration-to-gio/configure.in.in thunar/branches/migration-to-gio/thunar/thunar-dialogs.c thunar/branches/migration-to-gio/thunar/thunar-dialogs.h thunar/branches/migration-to-gio/thunar/thunar-file.c thunar/branches/migration-to-gio/thunar/thunar-file.h thunar/branches/migration-to-gio/thunar/thunar-io-jobs.c thunar/branches/migration-to-gio/thunar/thunar-io-jobs.h thunar/branches/migration-to-gio/thunar/thunar-properties-dialog.c thunar/branches/migration-to-gio/thunar/thunar-renamer-progress.c thunar/branches/migration-to-gio/thunar/thunar-simple-job.c thunar/branches/migration-to-gio/thunar/thunar-simple-job.h thunar/branches/migration-to-gio/thunar/thunar-standard-view.c thunar/branches/migration-to-gio/thunar/thunar-tree-view.c Log: * configure.in.in: Depend on libexo-0.3.101svn-r29948 for exo_job_send_to_mainloop(). * thunar/thunar-dialogs.{c,h}, thunar/thunar-io-jobs.{c,h}, thunar/thunar-dialogs.{c,h}, thunar/thunar-properties-dialog.c, thunar/thunar-standard-view.c, thunar/thunar-tree-view.c: Add new simple job thunar_io_jobs_rename_file() which renames a ThunarFile asynchronously. Make us of it in thunar_dialogs_show_rename_file() which now launches and returns the rename job instead of calling thunar_file_rename() directly. Update ThunarPropertiesDialog, ThunarStandardView and ThunarTreeView to handle the error/finished signals and destroy the job when it's finished. * thunar/thunar-file.{c,h}: Add a GCancellable parameter and a boolean parameter called "called_from_job". The latter is used to disable the thunarx_file_info_renamed() and thunar_file_changed() calls. The rename job is responsible to call these in the mainloop of the application after the rename has succeeded. * thunar/thunar-simple-job.{c,h}: Add new function thunar_simple_job_get_param_values() which returns the GValueArray created from the parameters passed to thunar_simple_job_launch(). Modified: thunar/branches/migration-to-gio/ChangeLog =================================================================== --- thunar/branches/migration-to-gio/ChangeLog 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/ChangeLog 2009-05-11 23:23:08 UTC (rev 29949) @@ -1,3 +1,25 @@ +2009-05-12 Jannis Pohlmann <jan...@xfce.org> + + * configure.in.in: Depend on libexo-0.3.101svn-r29948 for + exo_job_send_to_mainloop(). + * thunar/thunar-dialogs.{c,h}, thunar/thunar-io-jobs.{c,h}, + thunar/thunar-dialogs.{c,h}, thunar/thunar-properties-dialog.c, + thunar/thunar-standard-view.c, thunar/thunar-tree-view.c: Add new + simple job thunar_io_jobs_rename_file() which renames a ThunarFile + asynchronously. Make us of it in thunar_dialogs_show_rename_file() + which now launches and returns the rename job instead of calling + thunar_file_rename() directly. Update ThunarPropertiesDialog, + ThunarStandardView and ThunarTreeView to handle the error/finished + signals and destroy the job when it's finished. + * thunar/thunar-file.{c,h}: Add a GCancellable parameter and a boolean + parameter called "called_from_job". The latter is used to disable + the thunarx_file_info_renamed() and thunar_file_changed() calls. The + rename job is responsible to call these in the mainloop of the + application after the rename has succeeded. + * thunar/thunar-simple-job.{c,h}: Add new function + thunar_simple_job_get_param_values() which returns the GValueArray + created from the parameters passed to thunar_simple_job_launch(). + 2009-05-11 Jannis Pohlmann <jan...@xfce.org> * thunar/Makefile.am, thunar/thunar-exec.{c,h}: Import thunar_exec_*() Modified: thunar/branches/migration-to-gio/configure.in.in =================================================================== --- thunar/branches/migration-to-gio/configure.in.in 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/configure.in.in 2009-05-11 23:23:08 UTC (rev 29949) @@ -159,7 +159,7 @@ dnl *********************************** dnl *** Check for required packages *** dnl *********************************** -XDT_CHECK_PACKAGE([EXO], [exo-0.3], [0.3.101svn-r29926]) +XDT_CHECK_PACKAGE([EXO], [exo-0.3], [0.3.101svn-r29948]) XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.16.0]) XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.16.0]) XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.16.0]) Modified: thunar/branches/migration-to-gio/thunar/thunar-dialogs.c =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-dialogs.c 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/thunar/thunar-dialogs.c 2009-05-11 23:23:08 UTC (rev 29949) @@ -34,6 +34,8 @@ #include <thunar/thunar-dialogs.h> #include <thunar/thunar-icon-factory.h> +#include <thunar/thunar-io-jobs.h> +#include <thunar/thunar-job.h> #include <thunar/thunar-pango-extensions.h> #include <thunar/thunar-preferences.h> #include <thunar/thunar-private.h> @@ -48,11 +50,10 @@ * * Displays the Thunar rename dialog for a single file rename. * - * Return value: returns %TRUE if the file has been successfully renamed. - * Note that it also returns %FALSE if no rename was required - * and thus there is no need for visible updates. + * Return value: The #ThunarJob responsible for renaming the file or + * %NULL if there was no renaming required. **/ -gboolean +ThunarJob * thunar_dialogs_show_rename_file (GtkWindow *parent, ThunarFile *file) { @@ -60,24 +61,20 @@ GtkIconTheme *icon_theme; const gchar *filename; const gchar *text; + ThunarJob *job = NULL; GtkWidget *dialog; GtkWidget *entry; GtkWidget *label; GtkWidget *image; GtkWidget *table; GdkPixbuf *icon; - GError *error = NULL; glong offset; gchar *title; gint response; - gboolean succeed = FALSE; _thunar_return_val_if_fail (GTK_IS_WINDOW (parent), FALSE); _thunar_return_val_if_fail (THUNAR_IS_FILE (file), FALSE); - /* take an extra reference on the file */ - g_object_ref (G_OBJECT (file)); - /* get the filename of the file */ filename = thunar_file_get_display_name (file); @@ -138,7 +135,7 @@ /* select the text prior to the dot */ if (G_LIKELY (offset > 0)) - gtk_entry_select_region (GTK_ENTRY (entry), 0, offset); + gtk_editable_select_region (GTK_EDITABLE (entry), 0, offset); } } @@ -156,27 +153,14 @@ if (G_LIKELY (!exo_str_is_equal (filename, text))) { /* try to rename the file */ - if (!thunar_file_rename (file, text, &error)) - { - /* display an error message */ - thunar_dialogs_show_error (GTK_WIDGET (parent), error, _("Failed to rename \"%s\""), filename); - - /* release the error */ - g_error_free (error); - } - else - { - /* we've succeeded */ - succeed = TRUE; - } + job = thunar_io_jobs_rename_file (file, text); } } /* cleanup */ - g_object_unref (G_OBJECT (file)); gtk_widget_destroy (dialog); - return succeed; + return job; } Modified: thunar/branches/migration-to-gio/thunar/thunar-dialogs.h =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-dialogs.h 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/thunar/thunar-dialogs.h 2009-05-11 23:23:08 UTC (rev 29949) @@ -22,10 +22,11 @@ #include <thunar/thunar-enum-types.h> #include <thunar/thunar-file.h> +#include <thunar/thunar-job.h> G_BEGIN_DECLS; -gboolean thunar_dialogs_show_rename_file (GtkWindow *parent, +ThunarJob *thunar_dialogs_show_rename_file (GtkWindow *parent, ThunarFile *file) G_GNUC_INTERNAL; void thunar_dialogs_show_about (GtkWindow *parent, Modified: thunar/branches/migration-to-gio/thunar/thunar-file.c =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-file.c 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/thunar/thunar-file.c 2009-05-11 23:23:08 UTC (rev 29949) @@ -777,7 +777,6 @@ /* determine the basename */ file->basename = g_file_get_basename (file->gfile); - _thunar_assert (file->basename != NULL); /* determine the custom icon name for .desktop files */ @@ -1151,20 +1150,26 @@ * Return value: %TRUE on success, else %FALSE. **/ gboolean -thunar_file_rename (ThunarFile *file, - const gchar *name, - GError **error) +thunar_file_rename (ThunarFile *file, + const gchar *name, + GCancellable *cancellable, + gboolean called_from_job, + GError **error) { GFile *previous_file; GFile *renamed_file; gint watch_count; + _thunar_return_val_if_fail (THUNAR_IS_FILE (file), FALSE); + _thunar_return_val_if_fail (g_utf8_validate (name, -1, NULL), FALSE); + _thunar_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); + _thunar_return_val_if_fail (error == NULL || *error == NULL, FALSE); + /* remember the previous file */ - previous_file = file->gfile; + previous_file = g_object_ref (file->gfile); /* try to rename the file */ - /* TODO Make this asynchronous */ - renamed_file = g_file_set_display_name (file->gfile, name, NULL, error); + renamed_file = g_file_set_display_name (file->gfile, name, cancellable, error); /* check if we succeeded */ if (renamed_file != NULL) @@ -1172,6 +1177,9 @@ /* set the new file */ file->gfile = renamed_file; + /* reload file information */ + thunar_file_load (file, NULL, NULL); + /* need to re-register the monitor handle for the new uri */ watch_count = THUNAR_FILE_GET_WATCH_COUNT (file); if (G_LIKELY (watch_count > 0)) @@ -1202,16 +1210,21 @@ G_UNLOCK (file_cache_mutex); - /* tell the associated folder that the file was renamed */ - thunarx_file_info_renamed (THUNARX_FILE_INFO (file)); + if (!called_from_job) + { + /* tell the associated folder that the file was renamed */ + thunarx_file_info_renamed (THUNARX_FILE_INFO (file)); - /* emit the file changed signal */ - thunar_file_changed (file); - + /* emit the file changed signal */ + thunar_file_changed (file); + } + return TRUE; } else { + g_object_unref (previous_file); + return FALSE; } } Modified: thunar/branches/migration-to-gio/thunar/thunar-file.h =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-file.h 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/thunar/thunar-file.h 2009-05-11 23:23:08 UTC (rev 29949) @@ -150,6 +150,8 @@ gboolean thunar_file_rename (ThunarFile *file, const gchar *name, + GCancellable *cancellable, + gboolean called_from_job, GError **error); GdkDragAction thunar_file_accepts_drop (ThunarFile *file, Modified: thunar/branches/migration-to-gio/thunar/thunar-io-jobs.c =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-io-jobs.c 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/thunar/thunar-io-jobs.c 2009-05-11 23:23:08 UTC (rev 29949) @@ -60,7 +60,7 @@ } /* check if we failed */ - if (G_UNLIKELY (err != NULL || exo_job_is_cancelled (EXO_JOB (job)))) + if (err != NULL || exo_job_is_cancelled (EXO_JOB (job))) { if (exo_job_set_error_if_cancelled (EXO_JOB (job), error)) g_error_free (err); @@ -161,7 +161,7 @@ display_name); /* check if we should overwrite */ - if (G_UNLIKELY (response == THUNAR_JOB_RESPONSE_YES)) + if (response == THUNAR_JOB_RESPONSE_YES) { /* try to remove the file. fail if not possible */ if (g_file_delete (lp->data, exo_job_get_cancellable (EXO_JOB (job)), &err)) @@ -187,7 +187,7 @@ g_clear_error (&err); /* go back to the beginning if the user wants to retry */ - if (G_UNLIKELY (response == THUNAR_JOB_RESPONSE_RETRY)) + if (response == THUNAR_JOB_RESPONSE_RETRY) goto again; } } @@ -196,14 +196,14 @@ } /* check if we have failed */ - if (G_UNLIKELY (err != NULL)) + if (err != NULL) { g_propagate_error (error, err); return FALSE; } /* check if the job was cancelled */ - if (G_UNLIKELY (exo_job_is_cancelled (EXO_JOB (job)))) + if (exo_job_is_cancelled (EXO_JOB (job))) return FALSE; /* emit the "new-files" signal with the given file list */ @@ -298,7 +298,7 @@ display_name); /* check if we should overwrite it */ - if (G_UNLIKELY (response == THUNAR_JOB_RESPONSE_YES)) + if (response == THUNAR_JOB_RESPONSE_YES) { /* try to remove the file, fail if not possible */ if (g_file_delete (lp->data, exo_job_get_cancellable (EXO_JOB (job)), &err)) @@ -325,21 +325,21 @@ err = NULL; /* go back to the beginning if the user wants to retry */ - if (G_UNLIKELY (response == THUNAR_JOB_RESPONSE_RETRY)) + if (response == THUNAR_JOB_RESPONSE_RETRY) goto again; } } } /* check if we have failed */ - if (G_UNLIKELY (err != NULL)) + if (err != NULL) { g_propagate_error (error, err); return FALSE; } /* check if the job was cancelled */ - if (G_UNLIKELY (exo_job_is_cancelled (EXO_JOB (job)))) + if (exo_job_is_cancelled (EXO_JOB (job))) return FALSE; /* emit the "new-files" signal with the given file list */ @@ -407,12 +407,12 @@ g_assert (G_IS_FILE (lp->data)); /* skip root folders which cannot be deleted anyway */ - if (G_UNLIKELY (g_file_is_root (lp->data))) + if (g_file_is_root (lp->data)) continue; again: /* try to delete the file */ - if (G_UNLIKELY (!g_file_delete (lp->data, exo_job_get_cancellable (EXO_JOB (job)), &err))) + if (!g_file_delete (lp->data, exo_job_get_cancellable (EXO_JOB (job)), &err)) { /* query the file info for the display name */ info = g_file_query_info (lp->data, @@ -451,7 +451,7 @@ g_clear_error (&err); /* check whether to retry */ - if (G_UNLIKELY (response == THUNAR_JOB_RESPONSE_RETRY)) + if (response == THUNAR_JOB_RESPONSE_RETRY) goto again; } } @@ -729,7 +729,7 @@ else file_list = g_file_list_copy (file_list); - if (G_UNLIKELY (err != NULL)) + if (err != NULL) { g_propagate_error (error, err); return FALSE; @@ -751,7 +751,7 @@ exo_job_get_cancellable (EXO_JOB (job)), &err); - if (G_UNLIKELY (err != NULL)) + if (err != NULL) break; retry_chown: @@ -775,7 +775,7 @@ } /* check if there was a recoverable error */ - if (G_UNLIKELY (err != NULL && !exo_job_is_cancelled (EXO_JOB (job)))) + if (err != NULL && !exo_job_is_cancelled (EXO_JOB (job))) { /* generate a useful error message */ message = G_LIKELY (uid >= 0) ? _("Failed to change the owner of \"%s\": %s") @@ -790,7 +790,7 @@ g_clear_error (&err); /* check whether to retry */ - if (G_UNLIKELY (response == THUNAR_JOB_RESPONSE_RETRY)) + if (response == THUNAR_JOB_RESPONSE_RETRY) goto retry_chown; } @@ -801,7 +801,7 @@ /* release the file list */ g_file_list_free (file_list); - if (G_UNLIKELY (err != NULL)) + if (err != NULL) { g_propagate_error (error, err); return FALSE; @@ -876,7 +876,7 @@ else file_list = g_file_list_copy (file_list); - if (G_UNLIKELY (err != NULL)) + if (err != NULL) { g_propagate_error (error, err); return FALSE; @@ -900,7 +900,7 @@ exo_job_get_cancellable (EXO_JOB (job)), &err); - if (G_UNLIKELY (err != NULL)) + if (err != NULL) break; retry_chown: @@ -931,7 +931,7 @@ &err); /* check if there was a recoverable error */ - if (G_UNLIKELY (err != NULL && !exo_job_is_cancelled (EXO_JOB (job)))) + if (err != NULL && !exo_job_is_cancelled (EXO_JOB (job))) { /* ask the user whether to skip/retry this file */ response = thunar_job_ask_skip (job, @@ -943,7 +943,7 @@ g_clear_error (&err); /* check whether to retry */ - if (G_UNLIKELY (response == THUNAR_JOB_RESPONSE_RETRY)) + if (response == THUNAR_JOB_RESPONSE_RETRY) goto retry_chown; } @@ -954,7 +954,7 @@ /* release the file list */ g_file_list_free (file_list); - if (G_UNLIKELY (err != NULL)) + if (err != NULL) { g_propagate_error (error, err); return FALSE; @@ -1042,12 +1042,12 @@ g_file_list_free (path_list); /* abort on errors or cancellation */ - if (G_UNLIKELY (err != NULL)) + if (err != NULL) { g_propagate_error (error, err); return FALSE; } - else if (G_UNLIKELY (exo_job_set_error_if_cancelled (EXO_JOB (job), &err))) + else if (exo_job_set_error_if_cancelled (EXO_JOB (job), &err)) { g_propagate_error (error, err); return FALSE; @@ -1087,3 +1087,76 @@ return thunar_simple_job_launch (_thunar_io_jobs_ls, 1, G_TYPE_FILE, directory); } + + + +gboolean +_thunar_io_jobs_rename_notify (ThunarFile *file) +{ + _thunar_return_val_if_fail (THUNAR_IS_FILE (file), FALSE); + + /* tell the associated folder that the file was renamed */ + thunarx_file_info_renamed (THUNARX_FILE_INFO (file)); + + /* emit the file changed signal */ + thunar_file_changed (file); + + return FALSE; +} + + + +gboolean +_thunar_io_jobs_rename (ThunarJob *job, + GValueArray *param_values, + GError **error) +{ + const gchar *display_name; + ThunarFile *file; + GError *err = NULL; + + _thunar_return_val_if_fail (THUNAR_IS_JOB (job), FALSE); + _thunar_return_val_if_fail (param_values != NULL, FALSE); + _thunar_return_val_if_fail (param_values->n_values == 2, FALSE); + _thunar_return_val_if_fail (G_VALUE_HOLDS (¶m_values->values[0], THUNAR_TYPE_FILE), FALSE); + _thunar_return_val_if_fail (G_VALUE_HOLDS_STRING (¶m_values->values[1]), FALSE); + _thunar_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + if (exo_job_set_error_if_cancelled (EXO_JOB (job), error)) + return FALSE; + + /* determine the file and display name */ + file = g_value_get_object (g_value_array_get_nth (param_values, 0)); + display_name = g_value_get_string (g_value_array_get_nth (param_values, 1)); + + /* try to rename the file */ + if (thunar_file_rename (file, display_name, exo_job_get_cancellable (EXO_JOB (job)), TRUE, &err)) + { + exo_job_send_to_mainloop (EXO_JOB (job), + (GSourceFunc) _thunar_io_jobs_rename_notify, + g_object_ref (file), g_object_unref); + } + + /* abort on errors or cancellation */ + if (err != NULL) + { + g_propagate_error (error, err); + return FALSE; + } + + return TRUE; +} + + + +ThunarJob * +thunar_io_jobs_rename_file (ThunarFile *file, + const gchar *display_name) +{ + _thunar_return_val_if_fail (THUNAR_IS_FILE (file), NULL); + _thunar_return_val_if_fail (g_utf8_validate (display_name, -1, NULL), NULL); + + return thunar_simple_job_launch (_thunar_io_jobs_rename, 2, + THUNAR_TYPE_FILE, file, + G_TYPE_STRING, display_name); +} Modified: thunar/branches/migration-to-gio/thunar/thunar-io-jobs.h =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-io-jobs.h 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/thunar/thunar-io-jobs.h 2009-05-11 23:23:08 UTC (rev 29949) @@ -48,6 +48,8 @@ ThunarFileMode file_mode, gboolean recursive) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; ThunarJob *thunar_io_jobs_list_directory (GFile *directory) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; +ThunarJob *thunar_io_jobs_rename_file (ThunarFile *file, + const gchar *display_name) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; G_END_DECLS Modified: thunar/branches/migration-to-gio/thunar/thunar-properties-dialog.c =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-properties-dialog.c 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/thunar/thunar-properties-dialog.c 2009-05-11 23:23:08 UTC (rev 29949) @@ -31,6 +31,8 @@ #include <gdk/gdkkeysyms.h> +#include <exo/exo.h> + #include <thunar/thunar-abstract-dialog.h> #include <thunar/thunar-chooser-button.h> #include <thunar/thunar-dialogs.h> @@ -39,6 +41,8 @@ #include <thunar/thunar-gobject-extensions.h> #include <thunar/thunar-gtk-extensions.h> #include <thunar/thunar-icon-factory.h> +#include <thunar/thunar-io-jobs.h> +#include <thunar/thunar-job.h> #include <thunar/thunar-marshal.h> #include <thunar/thunar-pango-extensions.h> #include <thunar/thunar-permissions-chooser.h> @@ -89,8 +93,6 @@ ThunarPropertiesDialog *dialog); static void thunar_properties_dialog_update (ThunarPropertiesDialog *dialog); static void thunar_properties_dialog_update_providers (ThunarPropertiesDialog *dialog); -static gboolean thunar_properties_dialog_rename_idle (gpointer user_data); -static void thunar_properties_dialog_rename_idle_destroy (gpointer user_data); @@ -130,7 +132,6 @@ GtkWidget *volume_label; GtkWidget *permissions_chooser; - guint rename_idle_id; }; @@ -553,10 +554,6 @@ /* drop the reference on the provider factory */ g_object_unref (dialog->provider_factory); - /* be sure to cancel any pending rename idle source */ - if (G_UNLIKELY (dialog->rename_idle_id != 0)) - g_source_remove (dialog->rename_idle_id); - (*G_OBJECT_CLASS (thunar_properties_dialog_parent_class)->finalize) (object); } @@ -648,13 +645,65 @@ static void +thunar_properties_dialog_rename_error (ExoJob *job, + GError *error, + ThunarPropertiesDialog *dialog) +{ + _thunar_return_if_fail (EXO_IS_JOB (job)); + _thunar_return_if_fail (error != NULL); + _thunar_return_if_fail (THUNAR_IS_PROPERTIES_DIALOG (dialog)); + + /* display an error message */ + thunar_dialogs_show_error (GTK_WIDGET (dialog), error, _("Failed to rename \"%s\""), + thunar_file_get_display_name (dialog->file)); +} + + + +static void +thunar_properties_dialog_rename_finished (ExoJob *job, + ThunarPropertiesDialog *dialog) +{ + const gchar *new_name; + + _thunar_return_if_fail (EXO_IS_JOB (job)); + _thunar_return_if_fail (THUNAR_IS_PROPERTIES_DIALOG (dialog)); + + /* determine the new display name */ + new_name = thunar_file_get_display_name (dialog->file); + + /* reset the entry widget to the new name */ + gtk_entry_set_text (GTK_ENTRY (dialog->name_entry), new_name); + + g_signal_handlers_disconnect_matched (job, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, dialog); + g_object_unref (job); +} + + + +static void thunar_properties_dialog_activate (GtkWidget *entry, ThunarPropertiesDialog *dialog) { - if (G_LIKELY (dialog->rename_idle_id == 0)) + const gchar *old_name; + ThunarJob *job; + gchar *new_name; + + /* check if we still have a valid file and if the user is allowed to rename */ + if (G_UNLIKELY (dialog->file == NULL || !GTK_WIDGET_SENSITIVE (dialog->name_entry))) + return; + + /* determine new and old name */ + new_name = gtk_editable_get_chars (GTK_EDITABLE (dialog->name_entry), 0, -1); + old_name = thunar_file_get_display_name (dialog->file); + if (g_utf8_collate (new_name, old_name) != 0) { - dialog->rename_idle_id = g_idle_add_full (G_PRIORITY_DEFAULT, thunar_properties_dialog_rename_idle, - dialog, thunar_properties_dialog_rename_idle_destroy); + job = thunar_io_jobs_rename_file (dialog->file, new_name); + if (job != NULL) + { + g_signal_connect (job, "error", G_CALLBACK (thunar_properties_dialog_rename_error), dialog); + g_signal_connect (job, "finished", G_CALLBACK (thunar_properties_dialog_rename_finished), dialog); + } } } @@ -977,55 +1026,6 @@ -static gboolean -thunar_properties_dialog_rename_idle (gpointer user_data) -{ - ThunarPropertiesDialog *dialog = THUNAR_PROPERTIES_DIALOG (user_data); - const gchar *old_name; - GError *error = NULL; - gchar *new_name; - - /* check if we still have a valid file and if the user is allowed to rename */ - if (G_UNLIKELY (dialog->file == NULL || !GTK_WIDGET_SENSITIVE (dialog->name_entry))) - return FALSE; - - GDK_THREADS_ENTER (); - - /* determine new and old name */ - new_name = gtk_editable_get_chars (GTK_EDITABLE (dialog->name_entry), 0, -1); - old_name = thunar_file_get_display_name (dialog->file); - if (g_utf8_collate (new_name, old_name) != 0) - { - /* try to rename the file to the new name */ - if (!thunar_file_rename (dialog->file, new_name, &error)) - { - /* reset the entry widget to the old name */ - gtk_entry_set_text (GTK_ENTRY (dialog->name_entry), old_name); - - /* display an error message */ - thunar_dialogs_show_error (GTK_WIDGET (dialog), error, _("Failed to rename \"%s\""), old_name); - - /* release the error */ - g_error_free (error); - } - } - g_free (new_name); - - GDK_THREADS_LEAVE (); - - return FALSE; -} - - - -static void -thunar_properties_dialog_rename_idle_destroy (gpointer user_data) -{ - THUNAR_PROPERTIES_DIALOG (user_data)->rename_idle_id = 0; -} - - - /** * thunar_properties_dialog_new: * Modified: thunar/branches/migration-to-gio/thunar/thunar-renamer-progress.c =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-renamer-progress.c 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/thunar/thunar-renamer-progress.c 2009-05-11 23:23:08 UTC (rev 29949) @@ -200,7 +200,7 @@ oldname = g_strdup (thunar_file_get_display_name (pair->file)); /* try to rename the file */ - if (!thunar_file_rename (pair->file, pair->name, &error)) + if (!thunar_file_rename (pair->file, pair->name, NULL, FALSE, &error)) { /* determine the toplevel widget */ toplevel = (GtkWindow *) gtk_widget_get_toplevel (GTK_WIDGET (renamer_progress)); Modified: thunar/branches/migration-to-gio/thunar/thunar-simple-job.c =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-simple-job.c 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/thunar/thunar-simple-job.c 2009-05-11 23:23:08 UTC (rev 29949) @@ -221,3 +221,12 @@ /* launch the job */ return THUNAR_JOB (exo_job_launch (EXO_JOB (simple_job))); } + + + +GValueArray * +thunar_simple_job_get_param_values (ThunarSimpleJob *job) +{ + _thunar_return_val_if_fail (THUNAR_IS_SIMPLE_JOB (job), NULL); + return job->param_values; +} Modified: thunar/branches/migration-to-gio/thunar/thunar-simple-job.h =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-simple-job.h 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/thunar/thunar-simple-job.h 2009-05-11 23:23:08 UTC (rev 29949) @@ -52,11 +52,12 @@ #define THUNAR_IS_SIMPLE_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), THUNAR_TYPE_SIMPLE_JOB)) #define THUNAR_SIMPLE_JOB_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), THUNAR_TYPE_SIMPLE_JOB, ThunarSimpleJobClass)) -GType thunar_simple_job_get_type (void) G_GNUC_CONST; +GType thunar_simple_job_get_type (void) G_GNUC_CONST; -ThunarJob *thunar_simple_job_launch (ThunarSimpleJobFunc func, - guint n_param_values, - ...) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; +ThunarJob *thunar_simple_job_launch (ThunarSimpleJobFunc func, + guint n_param_values, + ...) G_GNUC_MALLOC G_GNUC_WARN_UNUSED_RESULT; +GValueArray *thunar_simple_job_get_param_values (ThunarSimpleJob *job); G_END_DECLS Modified: thunar/branches/migration-to-gio/thunar/thunar-standard-view.c =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-standard-view.c 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/thunar/thunar-standard-view.c 2009-05-11 23:23:08 UTC (rev 29949) @@ -44,6 +44,7 @@ #include <thunar/thunar-private.h> #include <thunar/thunar-properties-dialog.h> #include <thunar/thunar-renamer-dialog.h> +#include <thunar/thunar-simple-job.h> #include <thunar/thunar-standard-view.h> #include <thunar/thunar-standard-view-ui.h> #include <thunar/thunar-templates-action.h> @@ -2197,11 +2198,63 @@ static void +thunar_standard_view_rename_error (ExoJob *job, + GError *error, + ThunarStandardView *standard_view) +{ + GValueArray *param_values; + ThunarFile *file; + + _thunar_return_if_fail (EXO_IS_JOB (job)); + _thunar_return_if_fail (error != NULL); + _thunar_return_if_fail (THUNAR_IS_STANDARD_VIEW (standard_view)); + + param_values = thunar_simple_job_get_param_values (THUNAR_SIMPLE_JOB (job)); + file = g_value_get_object (g_value_array_get_nth (param_values, 0)); + + /* display an error message */ + thunar_dialogs_show_error (GTK_WIDGET (standard_view), error, + _("Failed to rename \"%s\""), + thunar_file_get_display_name (file)); +} + + + +static void +thunar_standard_view_rename_finished (ExoJob *job, + ThunarStandardView *standard_view) +{ + GValueArray *param_values; + ThunarFile *file; + + _thunar_return_if_fail (EXO_IS_JOB (job)); + _thunar_return_if_fail (THUNAR_IS_STANDARD_VIEW (standard_view)); + + param_values = thunar_simple_job_get_param_values (THUNAR_SIMPLE_JOB (job)); + file = g_value_get_object (g_value_array_get_nth (param_values, 0)); + + /* make sure the file is still visible */ + thunar_view_scroll_to_file (THUNAR_VIEW (standard_view), file, TRUE, FALSE, 0.0f, 0.0f); + + /* update the selection, so we get updated actions, statusbar, + * etc. with the new file name and probably new mime type. + */ + thunar_standard_view_selection_changed (standard_view); + + /* destroy the job */ + g_signal_handlers_disconnect_matched (job, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, standard_view); + g_object_unref (job); +} + + + +static void thunar_standard_view_action_rename (GtkAction *action, ThunarStandardView *standard_view) { ThunarFile *file; GtkWidget *window; + ThunarJob *job; _thunar_return_if_fail (GTK_IS_ACTION (action)); _thunar_return_if_fail (THUNAR_IS_STANDARD_VIEW (standard_view)); @@ -2216,15 +2269,11 @@ file = THUNAR_FILE (standard_view->selected_files->data); /* run the rename dialog */ - if (thunar_dialogs_show_rename_file (GTK_WINDOW (window), file)) + job = thunar_dialogs_show_rename_file (GTK_WINDOW (window), file); + if (G_LIKELY (job != NULL)) { - /* make sure the file is still visible */ - thunar_view_scroll_to_file (THUNAR_VIEW (standard_view), file, TRUE, FALSE, 0.0f, 0.0f); - - /* update the selection, so we get updated actions, statusbar, - * etc. with the new file name and probably new mime type. - */ - thunar_standard_view_selection_changed (standard_view); + g_signal_connect (job, "error", G_CALLBACK (thunar_standard_view_rename_error), standard_view); + g_signal_connect (job, "finished", G_CALLBACK (thunar_standard_view_rename_finished), standard_view); } } else if (g_list_length (standard_view->selected_files) > 1) Modified: thunar/branches/migration-to-gio/thunar/thunar-tree-view.c =================================================================== --- thunar/branches/migration-to-gio/thunar/thunar-tree-view.c 2009-05-11 22:48:08 UTC (rev 29948) +++ thunar/branches/migration-to-gio/thunar/thunar-tree-view.c 2009-05-11 23:23:08 UTC (rev 29949) @@ -37,6 +37,7 @@ #include <thunar/thunar-private.h> #include <thunar/thunar-properties-dialog.h> #include <thunar/thunar-shortcuts-icon-renderer.h> +#include <thunar/thunar-simple-job.h> #include <thunar/thunar-tree-model.h> #include <thunar/thunar-tree-view.h> @@ -1650,10 +1651,47 @@ static void +thunar_tree_view_rename_error (ExoJob *job, + GError *error, + ThunarTreeView *view) +{ + GValueArray *param_values; + ThunarFile *file; + + _thunar_return_if_fail (EXO_IS_JOB (job)); + _thunar_return_if_fail (error != NULL); + _thunar_return_if_fail (THUNAR_IS_TREE_VIEW (view)); + + param_values = thunar_simple_job_get_param_values (THUNAR_SIMPLE_JOB (job)); + file = g_value_get_object (g_value_array_get_nth (param_values, 0)); + + /* display an error message */ + thunar_dialogs_show_error (GTK_WIDGET (view), error, _("Failed to rename \"%s\""), + thunar_file_get_display_name (file)); +} + + + +static void +thunar_tree_view_rename_finished (ExoJob *job, + ThunarTreeView *view) +{ + _thunar_return_if_fail (EXO_IS_JOB (job)); + _thunar_return_if_fail (THUNAR_IS_TREE_VIEW (view)); + + /* destroy the job */ + g_signal_handlers_disconnect_matched (job, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, view); + g_object_unref (job); +} + + + +static void thunar_tree_view_action_rename (ThunarTreeView *view) { ThunarFile *file; GtkWidget *window; + ThunarJob *job; _thunar_return_if_fail (THUNAR_IS_TREE_VIEW (view)); @@ -1665,10 +1703,15 @@ window = gtk_widget_get_toplevel (GTK_WIDGET (view)); /* run the rename dialog */ - thunar_dialogs_show_rename_file (GTK_WINDOW (window), file); + job = thunar_dialogs_show_rename_file (GTK_WINDOW (window), file); + if (G_LIKELY (job != NULL)) + { + g_signal_connect (job, "error", G_CALLBACK (thunar_tree_view_rename_error), view); + g_signal_connect (job, "finished", G_CALLBACK (thunar_tree_view_rename_finished), view); + } /* release the file */ - g_object_unref (G_OBJECT (file)); + g_object_unref (file); } } _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits