summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-08-11 19:01:12 +0200
committerMarge Bot <marge-bot@gnome.org>2020-11-27 15:14:33 +0000
commitb789d38f680ec4b547143c66cbe18994b1d06796 (patch)
treeb97645ae646310fc1061fdea544269c355a711ff
parent1609d1459ef9a6cf43714621e8307a14d9d05072 (diff)
downloadmutter-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.c20
-rw-r--r--clutter/clutter/clutter-main.c25
-rw-r--r--clutter/clutter/clutter-private.h2
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 */