+2007-08-23 Emmanuele Bassi <ebassi@openedhand.com>
+
+ * clutter/clutter-private.h:
+ * clutter/clutter-event.c: Revert the event queue ordering
+ commit.
+
+ * clutter/eglx/clutter-event-egl.c:
+ * clutter/glx/clutter-event-glx.c:
+ * clutter/sdl/clutter-event-sdl.c: Update backends.
+
2007-08-22 Tomas Frydrych <tf@openedhand.com>
* clutter/clutter-behaviour-rotate.c:
ClutterEvent *
clutter_event_new (ClutterEventType type)
{
- ClutterEventPrivate *real_event;
ClutterEvent *new_event;
- real_event = g_slice_new0 (ClutterEventPrivate);
- real_event->flags = 0;
-
- new_event = (ClutterEvent *) real_event;
+ new_event = g_slice_new0 (ClutterEvent);
new_event->type = new_event->any.type = type;
return new_event;
{
if (G_LIKELY (event))
{
- g_slice_free (ClutterEventPrivate, (ClutterEventPrivate *) event);
+ g_slice_free (ClutterEvent, event);
}
}
if (g_queue_is_empty (context->events_queue))
return NULL;
- /* find the first non pending item */
- item = context->events_queue->tail;
- while (item)
- {
- ClutterEventPrivate *event = item->data;
-
- if (!(event->flags & CLUTTER_EVENT_PENDING))
- {
- g_queue_remove (context->events_queue, event);
-
- return (ClutterEvent *) event;
- }
-
- item = item->prev;
- }
-
- return NULL;
+ return g_queue_pop_tail (context->events_queue);
}
/**
clutter_event_peek (void)
{
ClutterMainContext *context = clutter_context_get_default ();
- GList *item;
- if (!context->events_queue)
+ g_return_val_if_fail (context != NULL, NULL);
+
+ if (context->events_queue == NULL)
return NULL;
if (g_queue_is_empty (context->events_queue))
return NULL;
- /* find the first non pending item */
- item = context->events_queue->tail;
- while (item)
- {
- ClutterEventPrivate *event = item->data;
- if (!(event->flags & CLUTTER_EVENT_PENDING))
- return (ClutterEvent *) event;
-
- item = item->prev;
- }
-
- return NULL;
+ return g_queue_peek_tail (context->events_queue);
}
/**
{
ClutterMainContext *context = clutter_context_get_default ();
- g_return_if_fail (event != NULL);
- g_return_if_fail (context->events_queue != NULL);
+ /* FIXME: check queue is valid */
+ g_return_if_fail (context != NULL);
g_queue_push_head (context->events_queue, clutter_event_copy (event));
}
clutter_events_pending (void)
{
ClutterMainContext *context = clutter_context_get_default ();
- GList *item;
g_return_val_if_fail (context != NULL, FALSE);
if (!context->events_queue)
return FALSE;
- if (g_queue_is_empty (context->events_queue))
- return FALSE;
-
- /* find the first non pending item */
- item = context->events_queue->tail;
- while (item)
- {
- ClutterEventPrivate *event = item->data;
- if (!(event->flags & CLUTTER_EVENT_PENDING))
- return TRUE;
-
- item = item->prev;
- }
-
- return FALSE;
+ return g_queue_is_empty (context->events_queue) == FALSE;
}
/* Backend helpers (private) */
button_x[0] = button_x[1] = 0;
button_y[0] = button_y[1] = 0;
}
- else if ((event->button.time < (button_click_time[0] + double_click_time))
- && (event->button.button == button_number[0])
- && (ABS (event->button.x - button_x[0]) <= double_click_distance)
- && (ABS (event->button.y - button_y[0]) <= double_click_distance))
+ else if ((event->button.time < (button_click_time[0] + double_click_time)) &&
+ (event->button.button == button_number[0]) &&
+ (ABS (event->button.x - button_x[0]) <= double_click_distance) &&
+ (ABS (event->button.y - button_y[0]) <= double_click_distance))
{
synthesize_click (backend, event, 2);
CLUTTER_PICK_ALL
} ClutterPickMode;
-typedef enum {
- /* this flag is set when an event has been put on the queue but still
- * needs processing; the event queue must ignore every event with this
- * flag set
- */
- CLUTTER_EVENT_PENDING = 1 << 0
-} ClutterEventFlags;
-
-typedef struct _ClutterEventPrivate ClutterEventPrivate;
-typedef struct _ClutterMainContext ClutterMainContext;
-
-/* Private structure, to be used for extending ClutterEvent without
- * exposing new members and breaking compatibility.
- */
-struct _ClutterEventPrivate
-{
- ClutterEvent event;
- guint flags;
-};
+typedef struct _ClutterMainContext ClutterMainContext;
struct _ClutterMainContext
{
events_queue (ClutterBackend *backend)
{
ClutterBackendEGL *backend_egl = CLUTTER_BACKEND_EGL (backend);
- Display *xdisplay = backend_egl->xdpy;
+ ClutterEvent *event;
XEvent xevent;
ClutterMainContext *clutter_context;
clutter_context = clutter_context_get_default ();
+ Display *xdisplay = backend_egl->xdpy;
+
while (!clutter_events_pending () && XPending (xdisplay))
{
- ClutterEvent *event;
-
XNextEvent (xdisplay, &xevent);
event = clutter_event_new (CLUTTER_NOTHING);
- ((ClutterEventPrivate *) event)->flags |= CLUTTER_EVENT_PENDING;
-
- g_queue_push_head (clutter_context->events_queue, event);
-
if (clutter_event_translate (backend, event, &xevent))
{
- ((ClutterEventPrivate *) event)->flags &= ~CLUTTER_EVENT_PENDING;
+ g_queue_push_head (clutter_context->events_queue, event);
}
else
{
- g_queue_remove (clutter_context->events_queue, event);
clutter_event_free (event);
}
}
events_queue (ClutterBackend *backend)
{
ClutterBackendGLX *backend_glx = CLUTTER_BACKEND_GLX (backend);
+ ClutterEvent *event;
Display *xdisplay = backend_glx->xdpy;
XEvent xevent;
ClutterMainContext *clutter_context;
while (!clutter_events_pending () && XPending (xdisplay))
{
- ClutterEvent *event;
-
XNextEvent (xdisplay, &xevent);
event = clutter_event_new (CLUTTER_NOTHING);
- /* mark the event as pending and push it so that event_translate()
- * can put events on the queue without tampering with the ordering
- */
- ((ClutterEventPrivate *) event)->flags |= CLUTTER_EVENT_PENDING;
- g_queue_push_head (clutter_context->events_queue, event);
-
if (event_translate (backend, event, &xevent))
{
- /* translation successful, the event is done */
- ((ClutterEventPrivate *) event)->flags &= ~CLUTTER_EVENT_PENDING;
+ /* push directly here to avoid copy of queue_put */
+ g_queue_push_head (clutter_context->events_queue, event);
}
else
{
- /* remove the event from the queue */
- g_queue_remove (clutter_context->events_queue, event);
clutter_event_free (event);
}
}
{
event = clutter_event_new (CLUTTER_NOTHING);
- ((ClutterEventPrivate *) event)->flags |= CLUTTER_EVENT_PENDING;
-
- g_queue_push_head (clutter_context->events_queue, event);
-
if (event_translate (backend, event, &sdl_event))
{
- ((ClutterEventPrivate *) event)->flags &= ~CLUTTER_EVENT_PENDING;
- }
+ /* push directly here to avoid copy of queue_put */
+ g_queue_push_head (clutter_context->events_queue, event);
+ }
else
{
- g_queue_remove (clutter_context->events_queue, event);
clutter_event_free (event);
}
}
if (event)
{
- clutter_do_event (event);
+ clutter_do_event(event);
clutter_event_free (event);
}