static void _delete_trash_file (GFile *file, gboolean del_file, gboolean del_children) { GFileInfo *info; GFile *child; GFileEnumerator *enumerator; if (del_children) { enumerator = g_file_enumerate_children (file, G_FILE_ATTRIBUTE_STANDARD_NAME "," G_FILE_ATTRIBUTE_STANDARD_TYPE, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, NULL); if (enumerator) { while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) { child = g_file_get_child (file, g_file_info_get_name (info)); _delete_trash_file (child, TRUE, g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY); g_object_unref (child); g_object_unref (info); } g_file_enumerator_close (enumerator, NULL, NULL); g_object_unref (enumerator); } } if (del_file) { g_file_delete (file, NULL, NULL); } }
static void _empty_trash_job(gpointer data, gpointer user_data) { (void)user_data; GList* trash_list = (GList*)data; GList* l; for (l = trash_list; l != NULL; l = l->next) _delete_trash_file (l->data, FALSE, TRUE); g_list_free_full(trash_list, g_object_unref); }
static gboolean _empty_trash_job (GIOSchedulerJob *io_job, GCancellable* cancellable, gpointer user_data) { GList* trash_list = (GList*) user_data; GList* l; for (l = trash_list; l != NULL; l = l->next) _delete_trash_file (l->data, FALSE, TRUE); g_io_scheduler_job_send_to_mainloop_async (io_job, _empty_trash_job_done, user_data, NULL); return FALSE; }