[gtk/wip/carlosg/tracker3-3-24: 1/4] gtksearchengine: Add "got_results" argument to ::finished



commit 99031f885ed3a32f0eeb73dc79eb83c1971d6d8e
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sun May 17 00:00:22 2020 +0200

    gtksearchengine: Add "got_results" argument to ::finished
    
    The filechooser tries to figure out whether it got results by poking
    the model, but all files might go through the async GFileInfo querying
    state.
    
    Make all search engines (and the composite one) just notify about this
    fact, so the file chooser can behave appropriately without waiting for
    the async operations to finish.

 gtk/gtkfilechooserwidget.c   |  3 ++-
 gtk/gtksearchengine.c        | 14 ++++++++++----
 gtk/gtksearchengine.h        |  3 ++-
 gtk/gtksearchenginequartz.c  |  2 +-
 gtk/gtksearchenginesimple.c  |  7 ++++++-
 gtk/gtksearchenginetracker.c |  4 ++--
 6 files changed, 23 insertions(+), 10 deletions(-)
---
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c
index 6c115f99ff..fe41f32f0b 100644
--- a/gtk/gtkfilechooserwidget.c
+++ b/gtk/gtkfilechooserwidget.c
@@ -7372,6 +7372,7 @@ search_engine_hits_added_cb (GtkSearchEngine      *engine,
 /* Callback used from GtkSearchEngine when the query is done running */
 static void
 search_engine_finished_cb (GtkSearchEngine *engine,
+                           gboolean         got_results,
                            gpointer         data)
 {
   GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (data);
@@ -7386,7 +7387,7 @@ search_engine_finished_cb (GtkSearchEngine *engine,
       priv->show_progress_timeout = 0;
     }
 
-  if (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->search_model), NULL) == 0)
+  if (!got_results)
     {
       gtk_stack_set_visible_child_name (GTK_STACK (priv->browse_files_stack), "empty");
       gtk_entry_grab_focus_without_selecting (GTK_ENTRY (priv->search_entry));
diff --git a/gtk/gtksearchengine.c b/gtk/gtksearchengine.c
index 74496c9695..b30bc4c38e 100644
--- a/gtk/gtksearchengine.c
+++ b/gtk/gtksearchengine.c
@@ -40,6 +40,7 @@ struct _GtkSearchEnginePrivate {
 
   GtkSearchEngine *simple;
   gboolean simple_running;
+  gboolean got_results;
   gchar *simple_error;
 
   GtkSearchEngine *model;
@@ -185,7 +186,7 @@ _gtk_search_engine_class_init (GtkSearchEngineClass *class)
                   G_STRUCT_OFFSET (GtkSearchEngineClass, finished),
                   NULL, NULL,
                   NULL,
-                  G_TYPE_NONE, 0);
+                  G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
 
   signals[ERROR] =
     g_signal_new (I_("error"),
@@ -256,13 +257,16 @@ update_status (GtkSearchEngine *engine)
           else if (engine->priv->model_error)
             _gtk_search_engine_error (engine, engine->priv->model_error);
           else
-            _gtk_search_engine_finished (engine);
+            _gtk_search_engine_finished (engine, engine->priv->got_results);
+
+          engine->priv->got_results = FALSE;
         }
     }
 }
 
 static void
 finished (GtkSearchEngine *engine,
+          gboolean         got_results,
           gpointer         data)
 {
   GtkSearchEngine *composite = GTK_SEARCH_ENGINE (data);
@@ -274,6 +278,7 @@ finished (GtkSearchEngine *engine,
   else if (engine == composite->priv->model)
     composite->priv->model_running = FALSE;
 
+  composite->priv->got_results |= got_results;
   update_status (composite);
 }
 
@@ -433,11 +438,12 @@ _gtk_search_engine_hits_added (GtkSearchEngine *engine,
 }
 
 void
-_gtk_search_engine_finished (GtkSearchEngine *engine)
+_gtk_search_engine_finished (GtkSearchEngine *engine,
+                             gboolean         got_results)
 {
   g_return_if_fail (GTK_IS_SEARCH_ENGINE (engine));
 
-  g_signal_emit (engine, signals[FINISHED], 0);
+  g_signal_emit (engine, signals[FINISHED], 0, got_results);
 }
 
 void
diff --git a/gtk/gtksearchengine.h b/gtk/gtksearchengine.h
index c3d181274d..0c11324d04 100644
--- a/gtk/gtksearchengine.h
+++ b/gtk/gtksearchengine.h
@@ -82,7 +82,8 @@ void           _gtk_search_engine_stop            (GtkSearchEngine *engine);
 
 void            _gtk_search_engine_hits_added      (GtkSearchEngine *engine, 
                                                     GList           *hits);
-void            _gtk_search_engine_finished        (GtkSearchEngine *engine);
+void             _gtk_search_engine_finished        (GtkSearchEngine *engine,
+                                                     gboolean         got_results);
 void            _gtk_search_engine_error           (GtkSearchEngine *engine, 
                                                     const gchar     *error_message);
 void             _gtk_search_engine_set_recursive   (GtkSearchEngine *engine,
diff --git a/gtk/gtksearchenginequartz.c b/gtk/gtksearchenginequartz.c
index 60d7b62c22..ddf20b8aa7 100644
--- a/gtk/gtksearchenginequartz.c
+++ b/gtk/gtksearchenginequartz.c
@@ -130,7 +130,7 @@ G_DEFINE_TYPE_WITH_PRIVATE (GtkSearchEngineQuartz, _gtk_search_engine_quartz, GT
 
   [self submitHits:ns_query];
 
-  _gtk_search_engine_finished (engine);
+  _gtk_search_engine_finished (engine, submitted_hits > 0);
   submitted_hits = 0;
 }
 
diff --git a/gtk/gtksearchenginesimple.c b/gtk/gtksearchenginesimple.c
index 2c3185d49e..07e08f2f31 100644
--- a/gtk/gtksearchenginesimple.c
+++ b/gtk/gtksearchenginesimple.c
@@ -40,6 +40,7 @@ typedef struct
 
   GQueue *directories;
 
+  guint got_results : 1;
   gint n_processed_files;
   GList *hits;
 
@@ -138,7 +139,10 @@ search_thread_done_idle (gpointer user_data)
   data = user_data;
 
   if (!g_cancellable_is_cancelled (data->cancellable))
-    _gtk_search_engine_finished (GTK_SEARCH_ENGINE (data->engine));
+    {
+      _gtk_search_engine_finished (GTK_SEARCH_ENGINE (data->engine),
+                                   data->got_results);
+    }
 
   data->engine->active_search = NULL;
   search_thread_data_free (data);
@@ -183,6 +187,7 @@ send_batch (SearchThreadData *data)
 
       id = gdk_threads_add_idle (search_thread_add_hits_idle, batch);
       g_source_set_name_by_id (id, "[gtk+] search_thread_add_hits_idle");
+      data->got_results = TRUE;
     }
 
   data->hits = NULL;
diff --git a/gtk/gtksearchenginetracker.c b/gtk/gtksearchenginetracker.c
index 4a8188d488..7350d5e354 100644
--- a/gtk/gtksearchenginetracker.c
+++ b/gtk/gtksearchenginetracker.c
@@ -291,7 +291,7 @@ query_callback (GObject      *object,
 
   if (!reply)
     {
-      _gtk_search_engine_finished (GTK_SEARCH_ENGINE (tracker));
+      _gtk_search_engine_finished (GTK_SEARCH_ENGINE (tracker), FALSE);
       g_object_unref (tracker);
       return;
     }
@@ -315,7 +315,7 @@ query_callback (GObject      *object,
     }
 
   _gtk_search_engine_hits_added (GTK_SEARCH_ENGINE (tracker), hits);
-  _gtk_search_engine_finished (GTK_SEARCH_ENGINE (tracker));
+  _gtk_search_engine_finished (GTK_SEARCH_ENGINE (tracker), i > 0);
 
   g_list_free (hits);
   for (i = 0; i < n; i++)


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