summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCosimo Cecchi <cosimoc@gnome.org>2012-10-18 14:28:45 -0400
committerCosimo Cecchi <cosimoc@gnome.org>2012-10-18 15:08:31 -0400
commit152807b2bee527f942432bbda2808c52539b5f4d (patch)
treee69cc7e15531344f225e6c92dda009d1c5bc1d97
parentedefb219714f2775e6d3f3f69cd717cb4c9b074a (diff)
downloadnautilus-152807b2bee527f942432bbda2808c52539b5f4d.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.c31
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);