diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2020-08-11 19:01:12 +0200 |
---|---|---|
committer | Marge Bot <marge-bot@gnome.org> | 2020-11-27 15:14:33 +0000 |
commit | b789d38f680ec4b547143c66cbe18994b1d06796 (patch) | |
tree | b97645ae646310fc1061fdea544269c355a711ff | |
parent | 1609d1459ef9a6cf43714621e8307a14d9d05072 (diff) | |
download | mutter-b789d38f680ec4b547143c66cbe18994b1d06796.tar.gz |
clutter: Switch to GAsyncQueue for ClutterMainContext event queue
We will be moving to having events produced in one thread and consumed
in another. Make this an async event queue in preparation for that.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403>
-rw-r--r-- | clutter/clutter/clutter-event.c | 20 | ||||
-rw-r--r-- | clutter/clutter/clutter-main.c | 25 | ||||
-rw-r--r-- | clutter/clutter/clutter-private.h | 2 |
3 files changed, 24 insertions, 23 deletions
diff --git a/clutter/clutter/clutter-event.c b/clutter/clutter/clutter-event.c index ac1d2cfd3..cc8741221 100644 --- a/clutter/clutter/clutter-event.c +++ b/clutter/clutter/clutter-event.c @@ -1445,14 +1445,11 @@ ClutterEvent * clutter_event_get (void) { ClutterMainContext *context = _clutter_context_get_default (); + ClutterEvent *event; - if (context->events_queue == NULL) - return NULL; + event = g_async_queue_try_pop (context->events_queue); - if (g_queue_is_empty (context->events_queue)) - return NULL; - - return g_queue_pop_tail (context->events_queue); + return event; } void @@ -1463,9 +1460,6 @@ _clutter_event_push (const ClutterEvent *event, g_assert (context != NULL); - if (context->events_queue == NULL) - context->events_queue = g_queue_new (); - if (do_copy) { ClutterEvent *copy; @@ -1474,7 +1468,8 @@ _clutter_event_push (const ClutterEvent *event, event = copy; } - g_queue_push_head (context->events_queue, (gpointer) event); + g_async_queue_push (context->events_queue, (gpointer) event); + g_main_context_wakeup (NULL); } /** @@ -1511,10 +1506,7 @@ clutter_events_pending (void) g_return_val_if_fail (context != NULL, FALSE); - if (context->events_queue == NULL) - return FALSE; - - return g_queue_is_empty (context->events_queue) == FALSE; + return g_async_queue_length (context->events_queue) > 0; } /** diff --git a/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c index 706fb430a..035ed9444 100644 --- a/clutter/clutter/clutter-main.c +++ b/clutter/clutter/clutter-main.c @@ -697,6 +697,8 @@ _clutter_context_get_default (void) ctx->settings = clutter_settings_get_default (); _clutter_settings_set_backend (ctx->settings, ctx->backend); + ctx->events_queue = g_async_queue_new (); + ctx->last_repaint_id = 1; } @@ -2286,15 +2288,22 @@ void _clutter_clear_events_queue (void) { ClutterMainContext *context = _clutter_context_get_default (); + ClutterEvent *event; + GAsyncQueue *events_queue; - if (context->events_queue != NULL) - { - g_queue_foreach (context->events_queue, - (GFunc) clutter_event_free, - NULL); - g_queue_free (context->events_queue); - context->events_queue = NULL; - } + if (!context->events_queue) + return; + + g_async_queue_lock (context->events_queue); + + while ((event = g_async_queue_try_pop_unlocked (context->events_queue))) + clutter_event_free (event); + + events_queue = context->events_queue; + context->events_queue = NULL; + + g_async_queue_unlock (events_queue); + g_async_queue_unref (events_queue); } /** diff --git a/clutter/clutter/clutter-private.h b/clutter/clutter/clutter-private.h index 08a8c3f8c..4c6f32282 100644 --- a/clutter/clutter/clutter-private.h +++ b/clutter/clutter/clutter-private.h @@ -121,7 +121,7 @@ struct _ClutterMainContext ClutterStageManager *stage_manager; /* the main event queue */ - GQueue *events_queue; + GAsyncQueue *events_queue; /* the event filters added via clutter_event_add_filter. these are * ordered from least recently added to most recently added */ |