diff options
author | Cosimo Cecchi <cosimoc@gnome.org> | 2012-10-18 14:28:45 -0400 |
---|---|---|
committer | Cosimo Cecchi <cosimoc@gnome.org> | 2012-10-18 15:07:17 -0400 |
commit | 546184ca418672533504c4121bd681fb547d2e01 (patch) | |
tree | 432ed2204f5cfc95ec1c1a81c2217dcd29ab3771 | |
parent | 632094e0665ba29558631dfb99f82e7f40b7f8bb (diff) | |
download | nautilus-546184ca418672533504c4121bd681fb547d2e01.tar.gz |
search-engine-model: emit finished when cancelled in-flight
If we get stopped while the directory ready callback is pending, make
sure to still emit the finished signal on the provider.
-rw-r--r-- | libnautilus-private/nautilus-search-engine-model.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/libnautilus-private/nautilus-search-engine-model.c b/libnautilus-private/nautilus-search-engine-model.c index 9ccaf6cd2..8b75cbc6f 100644 --- a/libnautilus-private/nautilus-search-engine-model.c +++ b/libnautilus-private/nautilus-search-engine-model.c @@ -41,6 +41,7 @@ struct NautilusSearchEngineModelDetails { NautilusDirectory *directory; gboolean query_pending; + guint finished_id; }; static void nautilus_search_provider_init (NautilusSearchProviderIface *iface); @@ -63,6 +64,11 @@ finalize (GObject *object) model->details->hits = NULL; } + if (model->details->finished_id != 0) { + g_source_remove (model->details->finished_id); + model->details->finished_id = 0; + } + g_clear_object (&model->details->directory); g_clear_object (&model->details->query); @@ -70,10 +76,8 @@ finalize (GObject *object) } static gboolean -emit_finished_idle_cb (gpointer user_data) +search_finished (NautilusSearchEngineModel *model) { - NautilusSearchEngineModel *model = user_data; - if (model->details->hits != NULL) { nautilus_search_provider_hits_added (NAUTILUS_SEARCH_PROVIDER (model), model->details->hits); @@ -89,6 +93,16 @@ emit_finished_idle_cb (gpointer user_data) } static void +search_finished_idle (NautilusSearchEngineModel *model) +{ + if (model->details->finished_id != 0) { + return; + } + + model->details->finished_id = g_idle_add ((GSourceFunc) search_finished, model); +} + +static void model_directory_ready_cb (NautilusDirectory *directory, GList *list, gpointer user_data) @@ -122,7 +136,7 @@ model_directory_ready_cb (NautilusDirectory *directory, nautilus_file_list_free (files); model->details->hits = hits; - emit_finished_idle_cb (model); + search_finished (model); } static void @@ -131,18 +145,19 @@ nautilus_search_engine_model_start (NautilusSearchProvider *provider) NautilusSearchEngineModel *model; model = NAUTILUS_SEARCH_ENGINE_MODEL (provider); - g_object_ref (model); if (model->details->query_pending) { return; } + g_object_ref (model); + model->details->query_pending = TRUE; + if (model->details->directory == NULL) { - g_idle_add (emit_finished_idle_cb, model); + search_finished_idle (model); return; } - model->details->query_pending = TRUE; nautilus_directory_call_when_ready (model->details->directory, NAUTILUS_FILE_ATTRIBUTE_INFO, TRUE, model_directory_ready_cb, model); @@ -158,7 +173,7 @@ nautilus_search_engine_model_stop (NautilusSearchProvider *provider) if (model->details->query_pending) { nautilus_directory_cancel_callback (model->details->directory, model_directory_ready_cb, model); - model->details->query_pending = FALSE; + search_finished_idle (model); } g_clear_object (&model->details->directory); |