summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrong wang <wangrong@uniontech.com>2023-03-23 10:26:24 +0800
committerrong wang <wangrong@uniontech.com>2023-03-31 10:12:27 +0800
commit41862c0179f834d8bc3bd84ce78ee495050f2676 (patch)
tree198b6672e431c3d0039cb9e6d89c908505e5a8c5
parent01e792821a0ab8d72744bbb8a510000ff0cc9807 (diff)
downloadgvfs-41862c0179f834d8bc3bd84ce78ee495050f2676.tar.gz
trash: Sync trash dir items when files change
In the case of an application monitoring the trash can, delete a file on the mounted device to the trash can, and then unmount the device. At this time, if you check the status of the trash can, you will find that the number of files queried is inconsistent with the number of files obtained through the enumeration job. This is because the number of files queried includes some files that do not exist when the device is unmounted. The solution is to synchronize the status of the trash can in time to ensure that the trash can does not record files that do not exist.
-rw-r--r--daemon/trashlib/trashdir.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/daemon/trashlib/trashdir.c b/daemon/trashlib/trashdir.c
index c470d3bd..0d7d2b1b 100644
--- a/daemon/trashlib/trashdir.c
+++ b/daemon/trashlib/trashdir.c
@@ -163,10 +163,27 @@ trash_dir_changed (GFileMonitor *monitor,
TrashDir *dir = user_data;
if (event_type == G_FILE_MONITOR_EVENT_CREATED)
- trash_root_add_item (dir->root, file, dir->topdir, dir->is_homedir);
+ {
+ dir->items = g_slist_insert_sorted (dir->items,
+ g_object_ref (file),
+ (GCompareFunc) compare_basename);
+ trash_root_add_item (dir->root, file, dir->topdir, dir->is_homedir);
+ }
else if (event_type == G_FILE_MONITOR_EVENT_DELETED)
- trash_root_remove_item (dir->root, file, dir->is_homedir);
+ {
+ GSList *node;
+
+ node = g_slist_find_custom (dir->items,
+ file,
+ (GCompareFunc) compare_basename);
+ if (node)
+ {
+ g_object_unref (node->data);
+ dir->items = g_slist_delete_link (dir->items, node);
+ }
+ trash_root_remove_item (dir->root, file, dir->is_homedir);
+ }
else if (event_type == G_FILE_MONITOR_EVENT_PRE_UNMOUNT ||
event_type == G_FILE_MONITOR_EVENT_UNMOUNTED ||