[nautilus/gnome-3-6] search-engine-model: emit finished when cancelled in-flight



commit 152807b2bee527f942432bbda2808c52539b5f4d
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Thu Oct 18 14:28:45 2012 -0400

    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.

 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 9ccaf6c..8b75cbc 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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]