diff options
author | Corey Berla <corey@berla.me> | 2023-01-20 10:27:33 -0800 |
---|---|---|
committer | Corey Berla <corey@berla.me> | 2023-04-07 20:39:14 -0700 |
commit | c4b52e3460853b7126f705b97e4f29c77c7000cf (patch) | |
tree | 39afd24de49f277ca811697b5b18ad908178c672 | |
parent | fbedaee75cfa4a730d49c030a49b17a790768d7e (diff) | |
download | nautilus-c4b52e3460853b7126f705b97e4f29c77c7000cf.tar.gz |
list-base: Block emission of ::selection-changed during file changes
Prevent the constant regeneration of menus during file changes. This is
especially painful if a very large number of items are selected.
It's reasonable to block during this period because it will either
finish very quickly, or if there are an extentisive amount of changes,
it would otherwise be a period of time that the program become
unresponsive.
-rw-r--r-- | src/nautilus-files-view.c | 8 | ||||
-rw-r--r-- | src/nautilus-list-base.c | 11 |
2 files changed, 15 insertions, 4 deletions
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c index f3737ef17..01028dd58 100644 --- a/src/nautilus-files-view.c +++ b/src/nautilus-files-view.c @@ -9719,10 +9719,10 @@ nautilus_files_view_init (NautilusFilesView *view) priv->toolbar_menu_sections = g_new0 (NautilusToolbarMenuSections, 1); priv->toolbar_menu_sections->sort_section = G_MENU_MODEL (g_object_ref (gtk_builder_get_object (builder, "sort_section"))); - g_signal_connect (view, - "end-file-changes", - G_CALLBACK (on_end_file_changes), - view); + g_signal_connect_after (view, + "end-file-changes", + G_CALLBACK (on_end_file_changes), + view); g_signal_connect (view, "notify::selection", G_CALLBACK (nautilus_files_view_preview_update), diff --git a/src/nautilus-list-base.c b/src/nautilus-list-base.c index c91ca7554..19f09ea5b 100644 --- a/src/nautilus-list-base.c +++ b/src/nautilus-list-base.c @@ -1139,12 +1139,22 @@ real_is_empty (NautilusFilesView *files_view) } static void +real_begin_file_changes (NautilusFilesView *files_view) +{ + NautilusListBase *self = NAUTILUS_LIST_BASE (files_view); + NautilusListBasePrivate *priv = nautilus_list_base_get_instance_private (self); + + g_signal_handlers_block_by_func (priv->model, nautilus_files_view_notify_selection_changed, files_view); +} + +static void real_end_file_changes (NautilusFilesView *files_view) { NautilusListBase *self = NAUTILUS_LIST_BASE (files_view); NautilusListBasePrivate *priv = nautilus_list_base_get_instance_private (self); nautilus_view_model_sort (priv->model); + g_signal_handlers_unblock_by_func (priv->model, nautilus_files_view_notify_selection_changed, files_view); } static void @@ -1793,6 +1803,7 @@ nautilus_list_base_class_init (NautilusListBaseClass *klass) widget_class->focus = nautilus_list_base_focus; files_view_class->add_files = real_add_files; + files_view_class->begin_file_changes = real_begin_file_changes; files_view_class->begin_loading = real_begin_loading; files_view_class->clear = real_clear; files_view_class->click_policy_changed = real_click_policy_changed; |