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>
This commit is contained in:
parent
1609d1459e
commit
b789d38f68
3 changed files with 24 additions and 23 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Reference in a new issue