summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorey Berla <corey@berla.me>2023-01-20 10:27:33 -0800
committerCorey Berla <corey@berla.me>2023-04-07 20:39:14 -0700
commitc4b52e3460853b7126f705b97e4f29c77c7000cf (patch)
tree39afd24de49f277ca811697b5b18ad908178c672
parentfbedaee75cfa4a730d49c030a49b17a790768d7e (diff)
downloadnautilus-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.c8
-rw-r--r--src/nautilus-list-base.c11
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;