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,
|
start,
|
||||||
end);
|
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
|
static void
|
||||||
|
|||||||
@@ -31,6 +31,9 @@
|
|||||||
|
|
||||||
#include <dazzle.h>
|
#include <dazzle.h>
|
||||||
|
|
||||||
|
#define MIN_RESULTS 5
|
||||||
|
#define WAIT_FOR_RESULTS_MS 0.150
|
||||||
|
|
||||||
struct _GcalSearchModel
|
struct _GcalSearchModel
|
||||||
{
|
{
|
||||||
GObject parent;
|
GObject parent;
|
||||||
@@ -245,3 +248,31 @@ gcal_search_model_new (GCancellable *cancellable,
|
|||||||
|
|
||||||
return model;
|
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,
|
GcalSearchModel* gcal_search_model_new (GCancellable *cancellable,
|
||||||
gint max_results);
|
gint max_results);
|
||||||
|
|
||||||
|
void gcal_search_model_wait_for_hits (GcalSearchModel *self,
|
||||||
|
GCancellable *cancellable);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|||||||
Reference in New Issue
Block a user