--- xfdesktop-file-icon-manager.c 2015-05-17 11:16:26.000000000 +0200 +++ xfdesktop-file-icon-manager.c 2016-04-16 04:22:49.369727370 +0200 @@ -2885,117 +2885,82 @@ } static void -xfdesktop_file_icon_manager_files_ready(GFileEnumerator *enumerator, - GAsyncResult *result, - gpointer user_data) -{ - XfdesktopFileIconManager *fmanager; - GError *error = NULL; - GList *files, *l; - - /* Sanity check */ - if(user_data == NULL || !XFDESKTOP_IS_FILE_ICON_MANAGER(user_data)) - return; - - fmanager = XFDESKTOP_FILE_ICON_MANAGER(user_data); - - if(enumerator != fmanager->priv->enumerator) - return; - - 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_object_unref(fmanager->priv->enumerator); - fmanager->priv->enumerator = NULL; - - /* initialize the file monitor */ - if(!fmanager->priv->monitor) { - fmanager->priv->monitor = g_file_monitor(fmanager->priv->folder, - G_FILE_MONITOR_SEND_MOVED, - NULL, NULL); - g_signal_connect(fmanager->priv->monitor, "changed", - G_CALLBACK(xfdesktop_file_icon_manager_file_changed), - fmanager); - } - - /* initialize the metadata watching the gvfs files since it doesn't - * send notification messages when monitored files change */ - if(!fmanager->priv->metadata_monitor) { - gchar *location = xfce_resource_lookup(XFCE_RESOURCE_DATA, "gvfs-metadata/"); - GFile *metadata_location; - - if(location == NULL) - return; +xfdesktop_file_icon_manager_load_desktop_folder (XfdesktopFileIconManager *fmanager) { - metadata_location = g_file_new_for_path(location); - - fmanager->priv->metadata_monitor = g_file_monitor(metadata_location, - G_FILE_MONITOR_NONE, - NULL, NULL); - g_signal_connect(fmanager->priv->metadata_monitor, "changed", - G_CALLBACK(xfdesktop_file_icon_manager_metadata_changed), - fmanager); - - g_object_unref(metadata_location); - g_free(location); - } - } else { - for(l = files; l; l = l->next) { - const gchar *name = g_file_info_get_name(l->data); - GFile *file = g_file_get_child(fmanager->priv->folder, name); - - XF_DEBUG("got a GFileInfo: %s", g_file_info_get_display_name(l->data)); - - xfdesktop_file_icon_manager_add_regular_icon(fmanager, - file, l->data, - -1, -1, - TRUE); - - 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 -xfdesktop_file_icon_manager_load_desktop_folder(XfdesktopFileIconManager *fmanager) -{ - - if(fmanager->priv->enumerator) { - g_object_unref(fmanager->priv->enumerator); - fmanager->priv->enumerator = NULL; - } - - fmanager->priv->enumerator = g_file_enumerate_children(fmanager->priv->folder, - XFDESKTOP_FILE_INFO_NAMESPACE, - G_FILE_QUERY_INFO_NONE, - NULL, NULL); - - 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); - - } + if (fmanager->priv->enumerator) { + g_object_unref(fmanager->priv->enumerator); + fmanager->priv->enumerator = NULL; + } + + fmanager->priv->enumerator = g_file_enumerate_children( + fmanager->priv->folder, + XFDESKTOP_FILE_INFO_NAMESPACE, + G_FILE_QUERY_INFO_NONE, + NULL, NULL); + + if (!fmanager->priv->enumerator) + return; + + GError *error = NULL; + GCancellable *cancellable = g_cancellable_new(); + + while (TRUE) { + GFileInfo *info; + gboolean iterationResult = g_file_enumerator_iterate(fmanager->priv->enumerator, &info, NULL, cancellable, &error); + + 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); + } + + if (!iterationResult || !info) break; + + const gchar *name = g_file_info_get_name(info); + GFile *file = g_file_get_child(fmanager->priv->folder, name); + XF_DEBUG("Got a GFileInfo: %s", g_file_info_get_display_name(info)); + + xfdesktop_file_icon_manager_add_regular_icon( + fmanager, + file, info, + -1, -1, + TRUE); + + g_object_unref(file); + } + + g_object_unref(fmanager->priv->enumerator); // Note: frees the last @info + fmanager->priv->enumerator = NULL; + + /* Initialize the file monitor */ + if (!fmanager->priv->monitor) { + fmanager->priv->monitor = g_file_monitor(fmanager->priv->folder, + G_FILE_MONITOR_SEND_MOVED, NULL, NULL); + g_signal_connect(fmanager->priv->monitor, "changed", + G_CALLBACK(xfdesktop_file_icon_manager_file_changed), + fmanager); + } + + /* Initialize the metadata watching the gvfs files since it doesn't + * send notification messages when monitored files change. */ + if (!fmanager->priv->metadata_monitor) { + gchar *location = xfce_resource_lookup(XFCE_RESOURCE_DATA, "gvfs-metadata/"); + if (location == NULL) + return; + GFile *metadata_location; + metadata_location = g_file_new_for_path(location); + fmanager->priv->metadata_monitor = g_file_monitor(metadata_location, + G_FILE_MONITOR_NONE, NULL, NULL); + g_signal_connect(fmanager->priv->metadata_monitor, "changed", + G_CALLBACK(xfdesktop_file_icon_manager_metadata_changed), + fmanager); + g_object_unref(metadata_location); + g_free(location); + } } static void