[gedit] File browser: don't use GIOScheduler (deprecated)
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gedit] File browser: don't use GIOScheduler (deprecated)
- Date: Tue, 16 Apr 2013 18:48:33 +0000 (UTC)
commit 2d1eb80d3d670d1420635e25042de248b6ce8fbb
Author: Sébastien Wilmet <swilmet gnome org>
Date: Sun Apr 14 19:22:05 2013 +0200
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
configure.ac | 2 +-
plugins/filebrowser/gedit-file-browser-store.c | 131 ++++++++++++++-----------
2 files changed, 74 insertions(+), 59 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 831ca5e..b7c7c15 100644
--- a/configure.ac
+++ b/configure.ac
@@ -325,7 +325,7 @@ dnl ================================================================
PKG_CHECK_MODULES(GEDIT, [
libxml-2.0 >= 2.5.0
glib-2.0 >= 2.28.0
- gio-2.0 >= 2.35.4
+ gio-2.0 >= 2.37.0
gtk+-3.0 >= 3.7.10
gtksourceview-3.0 >= 3.2.0
libpeas-1.0 >= 1.7.0
diff --git a/plugins/filebrowser/gedit-file-browser-store.c b/plugins/filebrowser/gedit-file-browser-store.c
index abf8589..ba487d4 100644
--- a/plugins/filebrowser/gedit-file-browser-store.c
+++ b/plugins/filebrowser/gedit-file-browser-store.c
@@ -196,6 +196,8 @@ static void model_check_dummy (GeditFileBrowserSto
static void next_files_async (GFileEnumerator *enumerator,
AsyncNode *async);
+static void delete_files (AsyncData *data);
+
G_DEFINE_DYNAMIC_TYPE_EXTENDED (GeditFileBrowserStore, gedit_file_browser_store,
G_TYPE_OBJECT,
0,
@@ -3521,84 +3523,101 @@ emit_no_trash (AsyncData *data)
return ret;
}
-typedef struct {
- GeditFileBrowserStore *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 (ret)
+ if (ok)
{
- delete.model = data->model;
- delete.file = file;
+ /* Remove the file from the model */
+ FileBrowserNode *node = model_find_node (data->model, NULL, file);
- /* Remove the file from the model in the main loop */
- g_io_scheduler_job_send_to_mainloop (job, (GSourceFunc)file_deleted, &delete, NULL);
+ if (node != NULL)
+ {
+ model_remove_node (data->model, node, NULL, TRUE);
+ }
+
+ /* Process the next file */
+ data->iter = data->iter->next;
}
- else if (!ret && error)
+ else if (!ok && error != NULL)
{
- code = error->code;
+ 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
+ {
+ /* End the job */
+ async_data_free (data);
+ return;
+ }
}
else if (code == G_IO_ERROR_CANCELLED)
{
- /* Job has been cancelled, just let the job end */
- return FALSE;
+ /* 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);
+ }
}
GeditFileBrowserStoreResult
@@ -3652,11 +3671,7 @@ gedit_file_browser_store_delete_all (GeditFileBrowserStore *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 GEDIT_FILE_BROWSER_STORE_RESULT_OK;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]