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:
@@ -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,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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user