search-model: Wait for results before returning

Dazzle is very sensitive to returning empty search results,
and ends up flickering when we pass a search model that is
not yet populated.

Wait for a few results, or for 150ms, before returning the
model.

https://gitlab.gnome.org/GNOME/gnome-calendar/issues/468
This commit is contained in:
Georges Basile Stavracas Neto
2019-10-04 01:55:08 -03:00
parent 44092da60b
commit a0403b0b3e
3 changed files with 40 additions and 1 deletions
+6 -1
View File
@@ -107,7 +107,12 @@ search_func (GTask *task,
start,
end);
g_task_return_pointer (task, g_steal_pointer (&model), g_object_unref);
gcal_search_model_wait_for_hits (model, cancellable);
if (g_cancellable_is_cancelled (cancellable))
g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_CANCELLED, "Cancelled");
else
g_task_return_pointer (task, g_steal_pointer (&model), g_object_unref);
}
static void
+31
View File
@@ -31,6 +31,9 @@
#include <dazzle.h>
#define MIN_RESULTS 5
#define WAIT_FOR_RESULTS_MS 0.150
struct _GcalSearchModel
{
GObject parent;
@@ -245,3 +248,31 @@ gcal_search_model_new (GCancellable *cancellable,
return model;
}
void
gcal_search_model_wait_for_hits (GcalSearchModel *self,
GCancellable *cancellable)
{
g_autoptr (GMainContext) thread_context = NULL;
g_autoptr (GTimer) timer = NULL;
GCAL_ENTRY;
g_return_if_fail (GCAL_IS_SEARCH_MODEL (self));
thread_context = g_main_context_ref_thread_default ();
timer = g_timer_new ();
g_timer_start (timer);
while (g_list_model_get_n_items (self->model) < MIN_RESULTS &&
g_timer_elapsed (timer, NULL) < WAIT_FOR_RESULTS_MS)
{
if (g_cancellable_is_cancelled (cancellable))
break;
g_main_context_iteration (thread_context, FALSE);
}
GCAL_EXIT;
}
+3
View File
@@ -30,4 +30,7 @@ G_DECLARE_FINAL_TYPE (GcalSearchModel, gcal_search_model, GCAL, SEARCH_MODEL, GO
GcalSearchModel* gcal_search_model_new (GCancellable *cancellable,
gint max_results);
void gcal_search_model_wait_for_hits (GcalSearchModel *self,
GCancellable *cancellable);
G_END_DECLS