summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Wilmet <[email protected]>2017-05-12 21:00:25 +0200
committerraveit65 <[email protected]>2017-05-25 20:13:59 +0200
commit91834ee958566d4edc2af9ecb90ac4440765c7d1 (patch)
treea4f6745a69ac211283cc337851d5a03d5b08015b
parent44d7761c90405c6bfbe3e306bab02397435ff44c (diff)
downloadpluma-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.ac2
-rw-r--r--plugins/filebrowser/pluma-file-browser-store.c138
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;