diff options
author | Sébastien Wilmet <[email protected]> | 2017-05-12 21:00:25 +0200 |
---|---|---|
committer | raveit65 <[email protected]> | 2017-05-25 20:13:59 +0200 |
commit | 91834ee958566d4edc2af9ecb90ac4440765c7d1 (patch) | |
tree | a4f6745a69ac211283cc337851d5a03d5b08015b | |
parent | 44d7761c90405c6bfbe3e306bab02397435ff44c (diff) | |
download | pluma-91834ee958566d4edc2af9ecb90ac4440765c7d1.tar.bz2 pluma-91834ee958566d4edc2af9ecb90ac4440765c7d1.tar.xz |
File browser: don't use GIOScheduler (deprecated)
The GIOScheduler was used because there was no async version of
g_file_delete() and g_file_trash(). Now that the async versions exist,
no need to use GIOScheduler or GTask.
gio >= 2.37.0 is required.
https://bugzilla.gnome.org/show_bug.cgi?id=693018
taken from:
https://git.gnome.org/browse/gedit/commit/?h=gnome-3-10&id=2d1eb80
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | plugins/filebrowser/pluma-file-browser-store.c | 138 |
2 files changed, 80 insertions, 60 deletions
diff --git a/configure.ac b/configure.ac index 848b76fd..8c79ce3c 100644 --- a/configure.ac +++ b/configure.ac @@ -157,7 +157,7 @@ PKG_CHECK_MODULES(PLUMA, [ glib-2.0 >= 2.36.0 $GMODULE_ADD gthread-2.0 >= 2.13.0 - gio-2.0 >= 2.26.0 + gio-2.0 >= 2.37.0 gtk+-3.0 >= $GTK_REQUIRED gtksourceview-3.0 >= $GTKSOURCEVIEW_REQUIRED libpeas-1.0 >= 1.2.0 diff --git a/plugins/filebrowser/pluma-file-browser-store.c b/plugins/filebrowser/pluma-file-browser-store.c index 5bf092e1..9ffc107a 100644 --- a/plugins/filebrowser/pluma-file-browser-store.c +++ b/plugins/filebrowser/pluma-file-browser-store.c @@ -194,6 +194,8 @@ static void model_check_dummy (PlumaFileBrowserSto static void next_files_async (GFileEnumerator * enumerator, AsyncNode * async); +static void delete_files (AsyncData *data); + G_DEFINE_DYNAMIC_TYPE_EXTENDED (PlumaFileBrowserStore, pluma_file_browser_store, G_TYPE_OBJECT, 0, @@ -3276,78 +3278,100 @@ emit_no_trash (AsyncData * data) return ret; } -typedef struct { - PlumaFileBrowserStore * model; - GFile * file; -} IdleDelete; - -static gboolean -file_deleted (IdleDelete * data) -{ - FileBrowserNode * node; - node = model_find_node (data->model, NULL, data->file); - - if (node != NULL) - model_remove_node (data->model, node, NULL, TRUE); - - return FALSE; -} - -static gboolean -delete_files (GIOSchedulerJob * job, - GCancellable * cancellable, - AsyncData * data) +static void +delete_file_finished (GFile *file, + GAsyncResult *res, + AsyncData *data) { - GFile * file; GError * error = NULL; - gboolean ret; - gint code; - IdleDelete delete; - - /* Check if our job is done */ - if (!data->iter) - return FALSE; - - /* Move a file to the trash */ - file = G_FILE (data->iter->data); + gboolean ok; if (data->trash) - ret = g_file_trash (file, cancellable, &error); + { + ok = g_file_trash_finish (file, res, &error); + } else - ret = g_file_delete (file, cancellable, &error); + { + ok = g_file_delete_finish (file, res, &error); + } + + if (ok) + { + /* Remove the file from the model */ + FileBrowserNode *node = model_find_node (data->model, NULL, file); - if (ret) { - delete.model = data->model; - delete.file = file; + if (node != NULL) + { + model_remove_node (data->model, node, NULL, TRUE); + } - /* Remove the file from the model in the main loop */ - g_io_scheduler_job_send_to_mainloop (job, (GSourceFunc)file_deleted, &delete, NULL); - } else if (!ret && error) { - code = error->code; + /* Process the next file */ + data->iter = data->iter->next; + } + else if (!ok && error != NULL) + { + gint code = error->code; g_error_free (error); if (data->trash && code == G_IO_ERROR_NOT_SUPPORTED) { - /* Trash is not supported on this system ... */ - if (g_io_scheduler_job_send_to_mainloop (job, (GSourceFunc)emit_no_trash, data, NULL)) + /* Trash is not supported on this system. Ask the user + * if he wants to delete completely the files instead. + */ + if (emit_no_trash (data)) { /* Changes this into a delete job */ data->trash = FALSE; data->iter = data->files; - - return TRUE; } - - /* End the job */ - return FALSE; - } else if (code == G_IO_ERROR_CANCELLED) { - /* Job has been cancelled, just let the job end */ - return FALSE; + else + { + /* End the job */ + async_data_free (data); + return; + } + } + else if (code == G_IO_ERROR_CANCELLED) + { + /* Job has been cancelled, end the job */ + async_data_free (data); + return; } } - /* Process the next item */ - data->iter = data->iter->next; - return TRUE; + /* Continue the job */ + delete_files (data); +} + +static void +delete_files (AsyncData *data) +{ + GFile *file; + + /* Check if our job is done */ + if (data->iter == NULL) + { + async_data_free (data); + return; + } + + file = G_FILE (data->iter->data); + + if (data->trash) + { + g_file_trash_async (file, + G_PRIORITY_DEFAULT, + data->cancellable, + (GAsyncReadyCallback)delete_file_finished, + data); + } + else + { + g_file_delete_async (file, + G_PRIORITY_DEFAULT, + data->cancellable, + (GAsyncReadyCallback)delete_file_finished, + data); + } } PlumaFileBrowserStoreResult @@ -3400,11 +3424,7 @@ pluma_file_browser_store_delete_all (PlumaFileBrowserStore *model, model->priv->async_handles = g_slist_prepend (model->priv->async_handles, data); - g_io_scheduler_push_job ((GIOSchedulerJobFunc)delete_files, - data, - (GDestroyNotify)async_data_free, - G_PRIORITY_DEFAULT, - data->cancellable); + delete_files (data); g_list_free (rows); return PLUMA_FILE_BROWSER_STORE_RESULT_OK; |