summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-08-11 19:01:12 +0200
committerCarlos Garnacho <carlosg@gnome.org>2020-11-27 14:19:18 +0100
commitd107bb37358ec633bc7c57c90ac53117c5b25214 (patch)
treede6429704836d4f8b2da6b7c089b2fcc9369561a
parent2aaa0118094accc88d9b73e2659a22c022927e81 (diff)
downloadmutter-d107bb37358ec633bc7c57c90ac53117c5b25214.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.
-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 */