diff --git a/thunar/thunar-launcher.c b/thunar/thunar-launcher.c index 59eeb790558b5299ed811c762ee5fa85d915f851..5810fede111b682791e678603075196df59bee3a 100644 --- a/thunar/thunar-launcher.c +++ b/thunar/thunar-launcher.c @@ -93,6 +93,7 @@ enum { DEVICE_OPERATION_STARTED, DEVICE_OPERATION_FINISHED, + NEW_FILES_CREATED, LAST_SIGNAL, }; @@ -103,7 +104,6 @@ enum PROP_CURRENT_DIRECTORY, PROP_SELECTED_FILES, PROP_WIDGET, - PROP_SELECT_FILES_CLOSURE, PROP_SELECTED_DEVICE, PROP_SELECTED_LOCATION, N_PROPERTIES @@ -202,6 +202,8 @@ static void thunar_launcher_action_create_folder (Thuna static void thunar_launcher_action_create_document (ThunarLauncher *launcher, GtkWidget *menu_item); static GtkWidget *thunar_launcher_create_document_submenu_new(ThunarLauncher *launcher); +static void thunar_launcher_new_files_created (ThunarLauncher *launcher, + GList *new_thunar_files); @@ -231,7 +233,8 @@ struct _ThunarLauncher ThunarFile *single_folder; ThunarFile *parent_folder; - GClosure *select_files_closure; + /* closure invoked whenever launcher creates new files (create, paste, rename, etc) */ + GClosure *new_files_created_closure; ThunarPreferences *preferences; @@ -354,6 +357,21 @@ thunar_launcher_class_init (ThunarLauncherClass *klass) g_cclosure_marshal_generic, G_TYPE_NONE, 1, THUNAR_TYPE_DEVICE); + /** + * ThunarLauncher::new-files-created: + * @launcher : a #ThunarLauncher + * @files : a GList of #ThunarFiles which were created + * + * This signal is emitted by the @launcher whenever new files were created (e.g. via "rename", "create" or "paste") + **/ + launcher_signals[NEW_FILES_CREATED] = + g_signal_new (I_("new-files-created"), + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_NO_HOOKS, 0, + NULL, NULL, + g_cclosure_marshal_generic, + G_TYPE_NONE, 1, G_TYPE_POINTER); + /** * ThunarLauncher:widget: * @@ -366,18 +384,6 @@ thunar_launcher_class_init (ThunarLauncherClass *klass) GTK_TYPE_WIDGET, EXO_PARAM_WRITABLE); - /** - * ThunarLauncher:select-files-closure: - * - * The #GClosure which will be called if the selected file should be updated after a launcher operation - **/ - launcher_props[PROP_SELECT_FILES_CLOSURE] = - g_param_spec_pointer ("select-files-closure", - "select-files-closure", - "select-files-closure", - G_PARAM_WRITABLE - | G_PARAM_CONSTRUCT_ONLY); - /** * ThunarLauncher:select-device: * @@ -440,12 +446,16 @@ static void thunar_launcher_init (ThunarLauncher *launcher) { launcher->files_to_process = NULL; - launcher->select_files_closure = NULL; launcher->device_to_process = NULL; launcher->location_to_process = NULL; /* grab a reference on the preferences */ launcher->preferences = thunar_preferences_get (); + + /* initialize the new_files_created_closure */ + launcher->new_files_created_closure = g_cclosure_new_swap (G_CALLBACK (thunar_launcher_new_files_created), launcher, NULL); + g_closure_ref (launcher->new_files_created_closure); + g_closure_sink (launcher->new_files_created_closure); } @@ -477,6 +487,9 @@ thunar_launcher_finalize (GObject *object) { ThunarLauncher *launcher = THUNAR_LAUNCHER (object); + g_closure_invalidate (launcher->new_files_created_closure); + g_closure_unref (launcher->new_files_created_closure); + /* release the preferences reference */ g_object_unref (launcher->preferences); @@ -531,10 +544,6 @@ thunar_launcher_set_property (GObject *object, thunar_launcher_set_widget (launcher, g_value_get_object (value)); break; - case PROP_SELECT_FILES_CLOSURE: - launcher->select_files_closure = g_value_get_pointer (value); - break; - case PROP_SELECTED_DEVICE: thunar_launcher_set_selection (launcher, NULL, g_value_get_pointer (value), NULL); break; @@ -2053,7 +2062,7 @@ thunar_launcher_action_make_link (ThunarLauncher *launcher) */ application = thunar_application_get (); thunar_application_link_into (application, launcher->widget, g_files, - thunar_file_get_file (launcher->current_directory), launcher->select_files_closure); + thunar_file_get_file (launcher->current_directory), launcher->new_files_created_closure); g_object_unref (G_OBJECT (application)); g_list_free (g_files); } @@ -2082,7 +2091,7 @@ thunar_launcher_action_duplicate (ThunarLauncher *launcher) */ application = thunar_application_get (); thunar_application_copy_into (application, launcher->widget, files_to_process, - thunar_file_get_file (launcher->current_directory), launcher->select_files_closure); + thunar_file_get_file (launcher->current_directory), launcher->new_files_created_closure); g_object_unref (G_OBJECT (application)); /* clean up */ @@ -2402,7 +2411,7 @@ thunar_launcher_action_create_folder (ThunarLauncher *launcher) /* launch the operation */ application = thunar_application_get (); - thunar_application_mkdir (application, launcher->widget, &path_list, launcher->select_files_closure); + thunar_application_mkdir (application, launcher->widget, &path_list, launcher->new_files_created_closure); g_object_unref (G_OBJECT (application)); /* release the path */ @@ -2471,7 +2480,7 @@ thunar_launcher_action_create_document (ThunarLauncher *launcher, application = thunar_application_get (); thunar_application_creat (application, launcher->widget, &target_path_list, template_file != NULL ? thunar_file_get_file (template_file) : NULL, - launcher->select_files_closure); + launcher->new_files_created_closure); g_object_unref (G_OBJECT (application)); /* release the target path */ @@ -2718,7 +2727,7 @@ thunar_launcher_action_paste (ThunarLauncher *launcher) _thunar_return_if_fail (THUNAR_IS_LAUNCHER (launcher)); clipboard = thunar_clipboard_manager_get_for_display (gtk_widget_get_display (launcher->widget)); - thunar_clipboard_manager_paste_files (clipboard, thunar_file_get_file (launcher->current_directory), launcher->widget, launcher->select_files_closure); + thunar_clipboard_manager_paste_files (clipboard, thunar_file_get_file (launcher->current_directory), launcher->widget, launcher->new_files_created_closure); g_object_unref (G_OBJECT (clipboard)); } @@ -2735,7 +2744,7 @@ thunar_launcher_action_paste_into_folder (ThunarLauncher *launcher) return; clipboard = thunar_clipboard_manager_get_for_display (gtk_widget_get_display (launcher->widget)); - thunar_clipboard_manager_paste_files (clipboard, thunar_file_get_file (launcher->single_folder), launcher->widget, launcher->select_files_closure); + thunar_clipboard_manager_paste_files (clipboard, thunar_file_get_file (launcher->single_folder), launcher->widget, launcher->new_files_created_closure); g_object_unref (G_OBJECT (clipboard)); } @@ -3068,3 +3077,14 @@ thunar_launcher_set_selection (ThunarLauncher *launcher, /* for selected files things are a bit more conmplicated */ thunar_launcher_set_selected_files (THUNAR_COMPONENT (launcher), selected_thunar_files); } + + + +static void +thunar_launcher_new_files_created (ThunarLauncher *launcher, + GList *new_thunar_files) +{ + _thunar_return_if_fail (THUNAR_IS_LAUNCHER (launcher)); + + g_signal_emit (launcher, launcher_signals[NEW_FILES_CREATED], 0, new_thunar_files); +} diff --git a/thunar/thunar-tree-view.c b/thunar/thunar-tree-view.c index 306c2b73f2ce94bd0b238a132b3ccd4952f3093a..f16d1aed049ad7111145476c4df6f2969664d462 100644 --- a/thunar/thunar-tree-view.c +++ b/thunar/thunar-tree-view.c @@ -194,11 +194,6 @@ struct _ThunarTreeView guint drop_occurred : 1; GList *drop_file_list; /* the list of URIs that are contained in the drop data */ - /* the "new-files" closure, which is used to - * open newly created directories once done. - */ - GClosure *new_files_closure; - /* sometimes we want to keep the cursor on a certain item to allow * more intuitive navigation, even though the main view shows another path */ @@ -407,15 +402,11 @@ thunar_tree_view_init (ThunarTreeView *view) gtk_drag_dest_set (GTK_WIDGET (view), 0, drop_targets, G_N_ELEMENTS (drop_targets), GDK_ACTION_COPY | GDK_ACTION_LINK | GDK_ACTION_MOVE); - view->new_files_closure = g_cclosure_new_swap (G_CALLBACK (thunar_tree_view_select_files), view, NULL); - g_closure_ref (view->new_files_closure); - g_closure_sink (view->new_files_closure); - - view->launcher = g_object_new (THUNAR_TYPE_LAUNCHER, "widget", GTK_WIDGET (view), - "select-files-closure", view->new_files_closure, NULL); + view->launcher = g_object_new (THUNAR_TYPE_LAUNCHER, "widget", GTK_WIDGET (view), NULL); g_signal_connect_swapped (G_OBJECT (view->launcher), "change-directory", G_CALLBACK (thunar_tree_view_action_open), view); g_signal_connect_swapped (G_OBJECT (view->launcher), "open-new-tab", G_CALLBACK (thunar_navigator_open_new_tab), view); + g_signal_connect_swapped (G_OBJECT (view->launcher), "new-files-created", G_CALLBACK (thunar_tree_view_select_files), view); exo_binding_new (G_OBJECT (view), "current-directory", G_OBJECT (view->launcher), "current-directory"); } @@ -460,13 +451,6 @@ thunar_tree_view_finalize (GObject *object) /* free the tree model */ g_object_unref (G_OBJECT (view->model)); - /* drop any existing "new-files" closure */ - if (G_UNLIKELY (view->new_files_closure != NULL)) - { - g_closure_invalidate (view->new_files_closure); - g_closure_unref (view->new_files_closure); - } - (*G_OBJECT_CLASS (thunar_tree_view_parent_class)->finalize) (object); } diff --git a/thunar/thunar-window.c b/thunar/thunar-window.c index 20ef3e2dda651846358d4a6d24f1fe79b4fe2034..82301e5a3ae1c065f96e9970a501c9d2c39acc7f 100644 --- a/thunar/thunar-window.c +++ b/thunar/thunar-window.c @@ -369,9 +369,6 @@ struct _ThunarWindow * see the toggle_sidepane() function. */ GType toggle_sidepane_type; - - /* Takes care to select a file after e.g. rename/create */ - GClosure *select_files_closure; }; @@ -708,16 +705,12 @@ thunar_window_init (ThunarWindow *window) g_signal_connect (window, "key-press-event", G_CALLBACK (thunar_window_propagate_key_event), NULL); g_signal_connect (window, "key-release-event", G_CALLBACK (thunar_window_propagate_key_event), NULL); - - window->select_files_closure = g_cclosure_new_swap (G_CALLBACK (thunar_window_select_files), window, NULL); - g_closure_ref (window->select_files_closure); - g_closure_sink (window->select_files_closure); - window->launcher = g_object_new (THUNAR_TYPE_LAUNCHER, "widget", GTK_WIDGET (window), - "select-files-closure", window->select_files_closure, NULL); + window->launcher = g_object_new (THUNAR_TYPE_LAUNCHER, "widget", GTK_WIDGET (window), NULL); exo_binding_new (G_OBJECT (window), "current-directory", G_OBJECT (window->launcher), "current-directory"); g_signal_connect_swapped (G_OBJECT (window->launcher), "change-directory", G_CALLBACK (thunar_window_set_current_directory), window); g_signal_connect_swapped (G_OBJECT (window->launcher), "open-new-tab", G_CALLBACK (thunar_window_notebook_open_new_tab), window); + g_signal_connect_swapped (G_OBJECT (window->launcher), "new-files-created", G_CALLBACK (thunar_window_select_files), window); thunar_launcher_append_accelerators (window->launcher, window->accel_group); /* determine the default window size from the preferences */ @@ -1266,9 +1259,6 @@ thunar_window_finalize (GObject *object) /* release the preferences reference */ g_object_unref (window->preferences); - g_closure_invalidate (window->select_files_closure); - g_closure_unref (window->select_files_closure); - (*G_OBJECT_CLASS (thunar_window_parent_class)->finalize) (object); }