diff options
author | Corey Berla <corey@berla.me> | 2023-01-20 10:36:59 -0800 |
---|---|---|
committer | Corey Berla <corey@berla.me> | 2023-04-07 20:46:45 -0700 |
commit | cb406e31a41511b0450ab9a714813de335afd445 (patch) | |
tree | 63161b1ddfe18eecd5aebc9fa99a66a7d49abdb2 /src/nautilus-files-view.c | |
parent | 65f420907b0541a371a0815399c8834ceb72a62f (diff) | |
download | nautilus-cb406e31a41511b0450ab9a714813de335afd445.tar.gz |
files-view: Replace REMOVE_FILE with REMOVE_FILESwip/corey/performance-remove-files
Files are added in bulk to the view with ADD_FILES, but then removed
from the view with REMOVE_FILE, which takes a single file. This is very
inefficient in the case where a large number of items are deleted. In
other words, if you delete a folder with 1,000 items, the process
completes very quickly, but if you delete the 1,000 items, Nautilus will
hang for an extended period of time. This can be a common problem if
the view is current showing Trash, and the the trash is emptied.
Diffstat (limited to 'src/nautilus-files-view.c')
-rw-r--r-- | src/nautilus-files-view.c | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c index 01028dd58..aeefce69c 100644 --- a/src/nautilus-files-view.c +++ b/src/nautilus-files-view.c @@ -129,7 +129,7 @@ enum END_LOADING, FILE_CHANGED, MOVE_COPY_ITEMS, - REMOVE_FILE, + REMOVE_FILES, SELECTION_CHANGED, TRASH, DELETE, @@ -4336,6 +4336,8 @@ process_old_files (NautilusFilesView *view) if (files_added != NULL || files_changed != NULL) { + NautilusDirectory *prev_directory = NULL; + GList *files_removed = NULL; gboolean send_selection_change = FALSE; g_signal_emit (view, signals[BEGIN_FILE_CHANGES], 0); @@ -4365,9 +4367,22 @@ process_old_files (NautilusFilesView *view) gboolean should_show_file; pending = node->data; should_show_file = still_should_show_file (view, pending); - g_signal_emit (view, - signals[should_show_file ? FILE_CHANGED : REMOVE_FILE], 0, - pending->file, pending->directory); + if (should_show_file) + { + g_signal_emit (view, + signals[FILE_CHANGED], 0, pending->file, pending->directory); + } + else + { + if (prev_directory != NULL && prev_directory != pending->directory) + { + g_signal_emit (view, signals[REMOVE_FILES], 0, + files_removed, pending->directory); + g_clear_pointer (&files_removed, g_list_free); + } + + files_removed = g_list_prepend (files_removed, pending->file); + } /* Acknowledge the files that were pending to be revealed */ if (g_hash_table_contains (priv->pending_reveal, pending->file)) @@ -4386,6 +4401,12 @@ process_old_files (NautilusFilesView *view) } } + if (files_removed != NULL) + { + g_signal_emit (view, signals[REMOVE_FILES], 0, + files_removed, pending->directory); + g_clear_pointer (&files_removed, g_list_free); + } if (files_changed != NULL) { g_autolist (NautilusFile) selection = NULL; @@ -9570,14 +9591,14 @@ nautilus_files_view_class_init (NautilusFilesViewClass *klass) NULL, NULL, g_cclosure_marshal_generic, G_TYPE_NONE, 2, NAUTILUS_TYPE_FILE, NAUTILUS_TYPE_DIRECTORY); - signals[REMOVE_FILE] = + signals[REMOVE_FILES] = g_signal_new ("remove-file", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (NautilusFilesViewClass, remove_file), + G_STRUCT_OFFSET (NautilusFilesViewClass, remove_files), NULL, NULL, g_cclosure_marshal_generic, - G_TYPE_NONE, 2, NAUTILUS_TYPE_FILE, NAUTILUS_TYPE_DIRECTORY); + G_TYPE_NONE, 2, G_TYPE_POINTER, NAUTILUS_TYPE_DIRECTORY); signals[SELECTION_CHANGED] = g_signal_new ("selection-changed", G_TYPE_FROM_CLASS (klass), |