diff options
author | rong wang <wangrong@uniontech.com> | 2023-03-23 10:26:24 +0800 |
---|---|---|
committer | rong wang <wangrong@uniontech.com> | 2023-03-31 10:12:27 +0800 |
commit | 41862c0179f834d8bc3bd84ce78ee495050f2676 (patch) | |
tree | 198b6672e431c3d0039cb9e6d89c908505e5a8c5 | |
parent | 01e792821a0ab8d72744bbb8a510000ff0cc9807 (diff) | |
download | gvfs-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.c | 21 |
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 || |