summaryrefslogtreecommitdiff
path: root/src/nautilus-files-view.c
diff options
context:
space:
mode:
authorCorey Berla <corey@berla.me>2023-01-20 10:36:59 -0800
committerCorey Berla <corey@berla.me>2023-04-07 20:46:45 -0700
commitcb406e31a41511b0450ab9a714813de335afd445 (patch)
tree63161b1ddfe18eecd5aebc9fa99a66a7d49abdb2 /src/nautilus-files-view.c
parent65f420907b0541a371a0815399c8834ceb72a62f (diff)
downloadnautilus-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.c35
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),