[Xfce4-commits] <xfdesktop:jannis/port-to-gio> Load files in the desktop folder asynchronously with GIO.
Jannis Pohlmann
noreply at xfce.org
Thu Oct 21 00:10:02 CEST 2010
Updating branch refs/heads/jannis/port-to-gio
to 909ca98ea8920479f21bdaea72e15e63b8b0ab81 (commit)
from 2d81053a21542e64fc71afb633f8d371c1d1ae2b (commit)
commit 909ca98ea8920479f21bdaea72e15e63b8b0ab81
Author: Jannis Pohlmann <jannis at xfce.org>
Date: Thu Oct 21 00:07:39 2010 +0200
Load files in the desktop folder asynchronously with GIO.
A few workarounds have been inserted to get the ThunarVfsInfo back when
we create the file icons. Those will be removed later.
src/xfdesktop-file-icon-manager.c | 219 +++++++++++++++++--------------------
1 files changed, 101 insertions(+), 118 deletions(-)
diff --git a/src/xfdesktop-file-icon-manager.c b/src/xfdesktop-file-icon-manager.c
index e715e56..bf8be7c 100644
--- a/src/xfdesktop-file-icon-manager.c
+++ b/src/xfdesktop-file-icon-manager.c
@@ -109,6 +109,7 @@ struct _XfdesktopFileIconManagerPrivate
XfdesktopFileIcon *desktop_icon;
GFileMonitor *monitor;
ThunarVfsJob *list_job;
+ GFileEnumerator *enumerator;
GHashTable *icons;
GHashTable *removable_icons;
@@ -2160,11 +2161,9 @@ xfdesktop_file_icon_manager_add_icon(XfdesktopFileIconManager *fmanager,
do_add = TRUE;
} else {
if(defer_if_missing) {
- ThunarVfsInfo *info = (ThunarVfsInfo *)xfdesktop_file_icon_peek_info(icon);
- if(info) {
- fmanager->priv->deferred_icons = g_list_prepend(fmanager->priv->deferred_icons,
- thunar_vfs_info_ref(info));
- }
+ GFile *file = xfdesktop_file_icon_peek_file(icon);
+ fmanager->priv->deferred_icons = g_list_prepend(fmanager->priv->deferred_icons,
+ g_object_ref(file));
} else
do_add = TRUE;
}
@@ -2521,7 +2520,6 @@ xfdesktop_file_icon_manager_file_changed(GFileMonitor *monitor,
break;
case G_FILE_MONITOR_EVENT_DELETED:
DBG("got deleted event");
- g_debug("got deleted event: %s", g_file_get_path(file));
icon = g_hash_table_lookup(fmanager->priv->icons, file);
if(icon) {
@@ -2543,81 +2541,90 @@ xfdesktop_file_icon_manager_file_changed(GFileMonitor *monitor,
}
}
-static gboolean
-xfdesktop_file_icon_manager_listdir_infos_ready_cb(ThunarVfsJob *job,
- GList *infos,
- gpointer user_data)
-{
- XfdesktopFileIconManager *fmanager = XFDESKTOP_FILE_ICON_MANAGER(user_data);
- GList *l;
- ThunarVfsInfo *info;
-
- g_return_val_if_fail(job == fmanager->priv->list_job, FALSE);
-
- TRACE("entering");
-
- for(l = infos; l; l = l->next) {
- info = l->data;
-
- DBG("got a ThunarVfsInfo: %s", info->display_name);
-
- if((info->flags & THUNAR_VFS_FILE_FLAGS_HIDDEN) != 0)
- continue;
-
- /* FIXME: memleak? */
- /*thunar_vfs_path_ref(info->path);*/
- xfdesktop_file_icon_manager_add_regular_icon(fmanager, info, TRUE);
- }
-
- return FALSE;
-}
-
static void
-xfdesktop_file_icon_manager_listdir_finished_cb(ThunarVfsJob *job,
- gpointer user_data)
+xfdesktop_file_icon_manager_files_ready(GFileEnumerator *enumerator,
+ GAsyncResult *result,
+ gpointer user_data)
{
XfdesktopFileIconManager *fmanager = XFDESKTOP_FILE_ICON_MANAGER(user_data);
- GList *l;
-
- g_return_if_fail(job == fmanager->priv->list_job);
-
- TRACE("entering");
-
- if(fmanager->priv->deferred_icons) {
- for(l = fmanager->priv->deferred_icons; l; l = l->next) {
- xfdesktop_file_icon_manager_add_regular_icon(fmanager,
- (ThunarVfsInfo *)l->data,
- FALSE);
- thunar_vfs_info_unref((ThunarVfsInfo *)l->data);
+ GError *error = NULL;
+ GList *files, *l;
+ gboolean is_hidden;
+
+ g_return_if_fail(enumerator == fmanager->priv->enumerator);
+
+ files = g_file_enumerator_next_files_finish(enumerator, result, &error);
+
+ if(!files) {
+ if(error) {
+ GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(fmanager->priv->icon_view));
+ xfce_message_dialog(gtk_widget_is_toplevel(toplevel) ? GTK_WINDOW(toplevel) : NULL,
+ _("Load Error"),
+ GTK_STOCK_DIALOG_WARNING,
+ _("Failed to load the desktop folder"), error->message,
+ GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT, NULL);
}
- g_list_free(fmanager->priv->deferred_icons);
- fmanager->priv->deferred_icons = NULL;
- }
-
- if(!fmanager->priv->monitor) {
- fmanager->priv->monitor = g_file_monitor(fmanager->priv->folder,
- G_FILE_MONITOR_NONE,
- NULL, NULL);
- g_signal_connect(fmanager->priv->monitor, "changed",
- G_CALLBACK(xfdesktop_file_icon_manager_file_changed),
- fmanager);
- }
-
- g_object_unref(G_OBJECT(job));
- fmanager->priv->list_job = NULL;
-}
-static void
-xfdesktop_file_icon_manager_listdir_error_cb(ThunarVfsJob *job,
- GError *error,
- gpointer user_data)
-{
- XfdesktopFileIconManager *fmanager = XFDESKTOP_FILE_ICON_MANAGER(user_data);
-
- g_return_if_fail(job == fmanager->priv->list_job);
-
- g_warning("Got error from thunar-vfs on loading directory: %s",
- error->message);
+ g_object_unref(fmanager->priv->enumerator);
+ fmanager->priv->enumerator = NULL;
+
+ if(fmanager->priv->deferred_icons) {
+ for(l = fmanager->priv->deferred_icons; l; l = l->next) {
+ gchar *pathname = g_file_get_path(l->data);
+ ThunarVfsPath *path = thunar_vfs_path_new(pathname, NULL);
+ ThunarVfsInfo *info = thunar_vfs_info_new_for_path(path, NULL);
+
+ xfdesktop_file_icon_manager_add_regular_icon(fmanager, info, FALSE);
+
+ thunar_vfs_info_unref(info);
+ thunar_vfs_path_unref(path);
+ g_free(pathname);
+ g_object_unref(l->data);
+ }
+ g_list_free(fmanager->priv->deferred_icons);
+ fmanager->priv->deferred_icons = NULL;
+ }
+
+
+ if(!fmanager->priv->monitor) {
+ fmanager->priv->monitor = g_file_monitor(fmanager->priv->folder,
+ G_FILE_MONITOR_NONE,
+ NULL, NULL);
+ g_signal_connect(fmanager->priv->monitor, "changed",
+ G_CALLBACK(xfdesktop_file_icon_manager_file_changed),
+ fmanager);
+ }
+ } else {
+ for(l = files; l; l = l->next) {
+ DBG("got a GFileInfo: %s", g_file_info_get_display_name(l->data));
+
+ is_hidden = g_file_info_get_attribute_boolean(l->data,
+ G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN);
+ if(!is_hidden) {
+ const gchar *basename = g_file_info_get_name(l->data);
+ GFile *file = g_file_get_child(fmanager->priv->folder, basename);
+ gchar *pathname = g_file_get_path(file);
+ ThunarVfsPath *path = thunar_vfs_path_new(pathname, NULL);
+ ThunarVfsInfo *info = thunar_vfs_info_new_for_path(path, NULL);
+
+ xfdesktop_file_icon_manager_add_regular_icon(fmanager, info, TRUE);
+
+ thunar_vfs_info_unref(info);
+ thunar_vfs_path_unref(path);
+ g_free(pathname);
+ g_object_unref(file);
+ }
+
+ g_object_unref(l->data);
+ }
+
+ g_list_free(files);
+
+ g_file_enumerator_next_files_async(fmanager->priv->enumerator,
+ 10, G_PRIORITY_DEFAULT, NULL,
+ (GAsyncReadyCallback) xfdesktop_file_icon_manager_files_ready,
+ fmanager);
+ }
}
static void
@@ -2633,37 +2640,23 @@ xfdesktop_file_icon_manager_load_desktop_folder(XfdesktopFileIconManager *fmanag
fmanager->priv->deferred_icons = NULL;
}
- if(fmanager->priv->list_job) {
- thunar_vfs_job_cancel(fmanager->priv->list_job);
- g_signal_handlers_disconnect_by_func(G_OBJECT(fmanager->priv->list_job),
- G_CALLBACK(xfdesktop_file_icon_manager_listdir_error_cb),
- fmanager);
- g_signal_handlers_disconnect_by_func(G_OBJECT(fmanager->priv->list_job),
- G_CALLBACK(xfdesktop_file_icon_manager_listdir_finished_cb),
- fmanager);
- g_signal_handlers_disconnect_by_func(G_OBJECT(fmanager->priv->list_job),
- G_CALLBACK(xfdesktop_file_icon_manager_listdir_infos_ready_cb),
- fmanager);
- g_object_unref(G_OBJECT(fmanager->priv->list_job));
+ if(fmanager->priv->enumerator) {
+ g_object_unref(fmanager->priv->enumerator);
+ fmanager->priv->enumerator = NULL;
}
- pathname = g_file_get_uri(fmanager->priv->folder);
- path = thunar_vfs_path_new(pathname, NULL);
- g_free(pathname);
-
- fmanager->priv->list_job = thunar_vfs_listdir(path, NULL);
+ fmanager->priv->enumerator = g_file_enumerate_children(fmanager->priv->folder,
+ XFDESKTOP_FILE_INFO_NAMESPACE,
+ G_FILE_QUERY_INFO_NONE,
+ NULL, NULL);
- thunar_vfs_path_unref(path);
-
- g_signal_connect(G_OBJECT(fmanager->priv->list_job), "error",
- G_CALLBACK(xfdesktop_file_icon_manager_listdir_error_cb),
- fmanager);
- g_signal_connect(G_OBJECT(fmanager->priv->list_job), "finished",
- G_CALLBACK(xfdesktop_file_icon_manager_listdir_finished_cb),
- fmanager);
- g_signal_connect(G_OBJECT(fmanager->priv->list_job), "infos-ready",
- G_CALLBACK(xfdesktop_file_icon_manager_listdir_infos_ready_cb),
- fmanager);
+ if(fmanager->priv->enumerator) {
+ g_file_enumerator_next_files_async(fmanager->priv->enumerator,
+ 10, G_PRIORITY_DEFAULT, NULL,
+ (GAsyncReadyCallback) xfdesktop_file_icon_manager_files_ready,
+ fmanager);
+
+ }
}
static void
@@ -2976,19 +2969,9 @@ xfdesktop_file_icon_manager_fini(XfdesktopIconViewManager *manager)
fmanager->priv->inited = FALSE;
- if(fmanager->priv->list_job) {
- thunar_vfs_job_cancel(fmanager->priv->list_job);
- g_signal_handlers_disconnect_by_func(G_OBJECT(fmanager->priv->list_job),
- G_CALLBACK(xfdesktop_file_icon_manager_listdir_error_cb),
- fmanager);
- g_signal_handlers_disconnect_by_func(G_OBJECT(fmanager->priv->list_job),
- G_CALLBACK(xfdesktop_file_icon_manager_listdir_finished_cb),
- fmanager);
- g_signal_handlers_disconnect_by_func(G_OBJECT(fmanager->priv->list_job),
- G_CALLBACK(xfdesktop_file_icon_manager_listdir_infos_ready_cb),
- fmanager);
- g_object_unref(G_OBJECT(fmanager->priv->list_job));
- fmanager->priv->list_job = NULL;
+ if(fmanager->priv->enumerator) {
+ g_object_unref(fmanager->priv->enumerator);
+ fmanager->priv->enumerator = NULL;
}
g_signal_handlers_disconnect_by_func(G_OBJECT(fmanager->priv->desktop),
@@ -3029,7 +3012,7 @@ xfdesktop_file_icon_manager_fini(XfdesktopIconViewManager *manager)
if(fmanager->priv->deferred_icons) {
g_list_foreach(fmanager->priv->deferred_icons,
- (GFunc)thunar_vfs_info_unref, NULL);
+ (GFunc)g_object_unref, NULL);
g_list_free(fmanager->priv->deferred_icons);
fmanager->priv->deferred_icons = NULL;
}
More information about the Xfce4-commits
mailing list