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 */