diff --git a/ChangeLog b/ChangeLog index 46c4300a06..12b6c19d60 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2006-03-16 Kristian Rietveld + + More review work. + + * gtk/gtkfilechooserprivate.h: remove idle_finished_loading_source + from GtkFileSystemModel. + + * gtk/gtkfilesystemmodel.c (gtk_file_system_model_finalize): remove + idle_finished_loading_source, + (idle_finished_loading_cb), (queue_finished_loading): removed, + (got_root_folder_cb): save a list walk, immediately emit + finished-loading and don't queue it, since we are already in an + idle here, always list_children() so the children the folder already + has are returned, + (_gtk_file_system_model_new): handle the case where NULL is + returned by _get_folder(), + (_gtk_file_system_model_path_do): remove comment, and append the + new handle to the list, don't try to remove, + (get_children_get_folder_cb): save a list walk, remove the dummy + child if the _get_folder() call fails or is cancelled. + 2006-03-14 Kristian Rietveld More suggestions from Federico. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 46c4300a06..12b6c19d60 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,24 @@ +2006-03-16 Kristian Rietveld + + More review work. + + * gtk/gtkfilechooserprivate.h: remove idle_finished_loading_source + from GtkFileSystemModel. + + * gtk/gtkfilesystemmodel.c (gtk_file_system_model_finalize): remove + idle_finished_loading_source, + (idle_finished_loading_cb), (queue_finished_loading): removed, + (got_root_folder_cb): save a list walk, immediately emit + finished-loading and don't queue it, since we are already in an + idle here, always list_children() so the children the folder already + has are returned, + (_gtk_file_system_model_new): handle the case where NULL is + returned by _get_folder(), + (_gtk_file_system_model_path_do): remove comment, and append the + new handle to the list, don't try to remove, + (get_children_get_folder_cb): save a list walk, remove the dummy + child if the _get_folder() call fails or is cancelled. + 2006-03-14 Kristian Rietveld More suggestions from Federico. diff --git a/gtk/gtkfilechooserprivate.h b/gtk/gtkfilechooserprivate.h index 0d1882b4a4..34ad17b40b 100644 --- a/gtk/gtkfilechooserprivate.h +++ b/gtk/gtkfilechooserprivate.h @@ -279,7 +279,6 @@ struct _GtkFileSystemModel GSList *idle_clears; GSource *idle_clear_source; - GSource *idle_finished_loading_source; gushort max_depth; diff --git a/gtk/gtkfilesystemmodel.c b/gtk/gtkfilesystemmodel.c index 6275af8b3b..69db850956 100644 --- a/gtk/gtkfilesystemmodel.c +++ b/gtk/gtkfilesystemmodel.c @@ -260,9 +260,6 @@ gtk_file_system_model_finalize (GObject *object) if (model->file_system) g_object_unref (model->file_system); - if (model->idle_finished_loading_source) - g_source_destroy (model->idle_finished_loading_source); - children = model->roots; while (children) { @@ -651,35 +648,6 @@ root_folder_finished_loading_cb (GtkFileFolder *folder, g_signal_emit (model, file_system_model_signals[FINISHED_LOADING], 0); } -/* Emits the "finished-loading" signal as an idle handler; see the comment in - * _gtk_file_system_model_new() - */ -static gboolean -idle_finished_loading_cb (GtkFileSystemModel *model) -{ - GDK_THREADS_ENTER (); - - g_signal_emit (model, file_system_model_signals[FINISHED_LOADING], 0); - - g_source_destroy (model->idle_finished_loading_source); - model->idle_finished_loading_source = NULL; - - GDK_THREADS_LEAVE (); - - return FALSE; -} - -/* Queues an idle handler to emit the "finished-loading" signal */ -static void -queue_finished_loading (GtkFileSystemModel *model) -{ - model->idle_finished_loading_source = g_idle_source_new (); - g_source_set_closure (model->idle_finished_loading_source, - g_cclosure_new_object (G_CALLBACK (idle_finished_loading_cb), - G_OBJECT (model))); - g_source_attach (model->idle_finished_loading_source, NULL); -} - static void got_root_folder_cb (GtkFileSystemHandle *handle, GtkFileFolder *folder, @@ -691,13 +659,15 @@ got_root_folder_cb (GtkFileSystemHandle *handle, gboolean cancelled = handle->cancelled; GtkFileSystemModel *model = data; - if (!g_slist_find (model->pending_handles, handle)) + tmp_list = g_slist_find (model->pending_handles, handle); + if (!tmp_list) { g_object_unref (model); return; } - model->pending_handles = g_slist_remove (model->pending_handles, handle); + model->pending_handles = g_slist_remove_link (model->pending_handles, + tmp_list); g_object_unref (handle); if (cancelled || !folder) @@ -709,14 +679,13 @@ got_root_folder_cb (GtkFileSystemHandle *handle, model->root_folder = folder; if (gtk_file_folder_is_finished_loading (model->root_folder)) - { - queue_finished_loading (model); /* done in an idle because we are being created */ - gtk_file_folder_list_children (model->root_folder, &roots, NULL); - } + g_signal_emit (model, file_system_model_signals[FINISHED_LOADING], 0); else g_signal_connect_object (model->root_folder, "finished-loading", G_CALLBACK (root_folder_finished_loading_cb), model, 0); + gtk_file_folder_list_children (model->root_folder, &roots, NULL); + g_signal_connect_object (model->root_folder, "deleted", G_CALLBACK (root_deleted_callback), model, 0); g_signal_connect_object (model->root_folder, "files-added", @@ -803,6 +772,22 @@ _gtk_file_system_model_new (GtkFileSystem *file_system, handle = gtk_file_system_get_folder (file_system, root_path, types, got_root_folder_cb, g_object_ref (model)); + if (!handle) + { + /* In this case got_root_folder_cb() will never be called, so we + * need to unref model twice. + */ + g_object_unref (model); + g_object_unref (model); + + g_set_error (error, + GTK_FILE_CHOOSER_ERROR, + GTK_FILE_CHOOSER_ERROR_NONEXISTENT, + _("Could not obtain root folder")); + + return NULL; + } + model->pending_handles = g_slist_append (model->pending_handles, handle); return model; @@ -1238,7 +1223,6 @@ _gtk_file_system_model_path_do (GtkFileSystemModel *model, node = find_child_node (model, NULL, paths->data); if (!node) { - /* Shouldn't really happen */ gtk_file_paths_free (paths); return; } @@ -1287,7 +1271,7 @@ _gtk_file_system_model_path_do (GtkFileSystemModel *model, handle = gtk_file_system_get_folder (model->file_system, paths->data, model->types, ref_path_cb, info); - model->pending_handles = g_slist_remove (model->pending_handles, handle); + model->pending_handles = g_slist_append (model->pending_handles, handle); } } } @@ -1579,15 +1563,27 @@ get_children_get_folder_cb (GtkFileSystemHandle *handle, gboolean cancelled = handle->cancelled; struct GetChildrenData *data = callback_data; - if (!g_slist_find (data->model->pending_handles, handle)) + tmp_list = g_slist_find (data->model->pending_handles, handle); + + if (!tmp_list) goto out; - data->model->pending_handles = g_slist_remove (data->model->pending_handles, handle); + data->model->pending_handles = g_slist_remove_link (data->model->pending_handles, tmp_list); g_object_unref (handle); if (cancelled || !folder) - /* error, no folder, remove dummy child? */ - goto out; + { + /* error, no folder, remove dummy child */ + if (data->node->parent && data->node->parent->has_dummy) + { + data->node->parent->children = NULL; + data->node->parent->has_dummy = FALSE; + } + + file_model_node_free (data->node); + + goto out; + } data->node->folder = folder; data->node->load_pending = FALSE;