clutter: Switch to GAsyncQueue for ClutterMainContext event queue

https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403
This commit is contained in:
Carlos Garnacho 2020-08-11 19:01:12 +02:00
parent 6f3ce4de24
commit 6496cd7c55
3 changed files with 23 additions and 22 deletions

View File

@ -1504,14 +1504,17 @@ ClutterEvent *
clutter_event_get (void) clutter_event_get (void)
{ {
ClutterMainContext *context = _clutter_context_get_default (); ClutterMainContext *context = _clutter_context_get_default ();
ClutterEvent *event;
if (context->events_queue == NULL) event = g_async_queue_try_pop (context->events_queue);
return NULL;
if (g_queue_is_empty (context->events_queue)) return event;
return NULL; }
return g_queue_pop_tail (context->events_queue); static gboolean
spin_context (gpointer data)
{
return G_SOURCE_REMOVE;
} }
void void
@ -1522,9 +1525,6 @@ _clutter_event_push (const ClutterEvent *event,
g_assert (context != NULL); g_assert (context != NULL);
if (context->events_queue == NULL)
context->events_queue = g_queue_new ();
if (do_copy) if (do_copy)
{ {
ClutterEvent *copy; ClutterEvent *copy;
@ -1533,7 +1533,8 @@ _clutter_event_push (const ClutterEvent *event,
event = copy; event = copy;
} }
g_queue_push_head (context->events_queue, (gpointer) event); g_async_queue_push (context->events_queue, (gpointer) event);
g_idle_add (spin_context, NULL);
} }
/** /**
@ -1570,10 +1571,7 @@ clutter_events_pending (void)
g_return_val_if_fail (context != NULL, FALSE); g_return_val_if_fail (context != NULL, FALSE);
if (context->events_queue == NULL) return g_async_queue_length (context->events_queue) > 0;
return FALSE;
return g_queue_is_empty (context->events_queue) == FALSE;
} }
/** /**

View File

@ -697,6 +697,8 @@ _clutter_context_get_default (void)
ctx->settings = clutter_settings_get_default (); ctx->settings = clutter_settings_get_default ();
_clutter_settings_set_backend (ctx->settings, ctx->backend); _clutter_settings_set_backend (ctx->settings, ctx->backend);
ctx->events_queue = g_async_queue_new ();
ctx->last_repaint_id = 1; ctx->last_repaint_id = 1;
} }
@ -2286,15 +2288,16 @@ void
_clutter_clear_events_queue (void) _clutter_clear_events_queue (void)
{ {
ClutterMainContext *context = _clutter_context_get_default (); ClutterMainContext *context = _clutter_context_get_default ();
ClutterEvent *event;
if (context->events_queue != NULL) /* Lock the queue for as long as it lives */
{ g_async_queue_lock (context->events_queue);
g_queue_foreach (context->events_queue,
(GFunc) clutter_event_free, while ((event = g_async_queue_try_pop_unlocked (context->events_queue)))
NULL); clutter_event_free (event);
g_queue_free (context->events_queue);
context->events_queue = NULL; g_async_queue_unref (context->events_queue);
} context->events_queue = NULL;
} }
ClutterPickMode ClutterPickMode

View File

@ -122,7 +122,7 @@ struct _ClutterMainContext
ClutterStageManager *stage_manager; ClutterStageManager *stage_manager;
/* the main event queue */ /* the main event queue */
GQueue *events_queue; GAsyncQueue *events_queue;
/* the event filters added via clutter_event_add_filter. these are /* the event filters added via clutter_event_add_filter. these are
* ordered from least recently added to most recently added */ * ordered from least recently added to most recently added */