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.
This commit is contained in:
parent
a40f50fffa
commit
46a3a0bec6
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
|||||||
|
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>
|
2007-08-22 Tomas Frydrych <tf@openedhand.com>
|
||||||
|
|
||||||
* clutter/clutter-behaviour-rotate.c:
|
* clutter/clutter-behaviour-rotate.c:
|
||||||
|
@ -364,13 +364,9 @@ clutter_event_get_type (void)
|
|||||||
ClutterEvent *
|
ClutterEvent *
|
||||||
clutter_event_new (ClutterEventType type)
|
clutter_event_new (ClutterEventType type)
|
||||||
{
|
{
|
||||||
ClutterEventPrivate *real_event;
|
|
||||||
ClutterEvent *new_event;
|
ClutterEvent *new_event;
|
||||||
|
|
||||||
real_event = g_slice_new0 (ClutterEventPrivate);
|
new_event = g_slice_new0 (ClutterEvent);
|
||||||
real_event->flags = 0;
|
|
||||||
|
|
||||||
new_event = (ClutterEvent *) real_event;
|
|
||||||
new_event->type = new_event->any.type = type;
|
new_event->type = new_event->any.type = type;
|
||||||
|
|
||||||
return new_event;
|
return new_event;
|
||||||
@ -408,7 +404,7 @@ clutter_event_free (ClutterEvent *event)
|
|||||||
{
|
{
|
||||||
if (G_LIKELY (event))
|
if (G_LIKELY (event))
|
||||||
{
|
{
|
||||||
g_slice_free (ClutterEventPrivate, (ClutterEventPrivate *) event);
|
g_slice_free (ClutterEvent, event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -434,23 +430,7 @@ clutter_event_get (void)
|
|||||||
if (g_queue_is_empty (context->events_queue))
|
if (g_queue_is_empty (context->events_queue))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* find the first non pending item */
|
return g_queue_pop_tail (context->events_queue);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -467,26 +447,16 @@ ClutterEvent *
|
|||||||
clutter_event_peek (void)
|
clutter_event_peek (void)
|
||||||
{
|
{
|
||||||
ClutterMainContext *context = clutter_context_get_default ();
|
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;
|
return NULL;
|
||||||
|
|
||||||
if (g_queue_is_empty (context->events_queue))
|
if (g_queue_is_empty (context->events_queue))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* find the first non pending item */
|
return g_queue_peek_tail (context->events_queue);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -502,8 +472,8 @@ clutter_event_put (ClutterEvent *event)
|
|||||||
{
|
{
|
||||||
ClutterMainContext *context = clutter_context_get_default ();
|
ClutterMainContext *context = clutter_context_get_default ();
|
||||||
|
|
||||||
g_return_if_fail (event != NULL);
|
/* FIXME: check queue is valid */
|
||||||
g_return_if_fail (context->events_queue != NULL);
|
g_return_if_fail (context != NULL);
|
||||||
|
|
||||||
g_queue_push_head (context->events_queue, clutter_event_copy (event));
|
g_queue_push_head (context->events_queue, clutter_event_copy (event));
|
||||||
}
|
}
|
||||||
@ -521,28 +491,13 @@ gboolean
|
|||||||
clutter_events_pending (void)
|
clutter_events_pending (void)
|
||||||
{
|
{
|
||||||
ClutterMainContext *context = clutter_context_get_default ();
|
ClutterMainContext *context = clutter_context_get_default ();
|
||||||
GList *item;
|
|
||||||
|
|
||||||
g_return_val_if_fail (context != NULL, FALSE);
|
g_return_val_if_fail (context != NULL, FALSE);
|
||||||
|
|
||||||
if (!context->events_queue)
|
if (!context->events_queue)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (g_queue_is_empty (context->events_queue))
|
return g_queue_is_empty (context->events_queue) == FALSE;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Backend helpers (private) */
|
/* Backend helpers (private) */
|
||||||
@ -585,10 +540,10 @@ _clutter_event_button_generate (ClutterBackend *backend,
|
|||||||
button_x[0] = button_x[1] = 0;
|
button_x[0] = button_x[1] = 0;
|
||||||
button_y[0] = button_y[1] = 0;
|
button_y[0] = button_y[1] = 0;
|
||||||
}
|
}
|
||||||
else if ((event->button.time < (button_click_time[0] + double_click_time))
|
else if ((event->button.time < (button_click_time[0] + double_click_time)) &&
|
||||||
&& (event->button.button == button_number[0])
|
(event->button.button == button_number[0]) &&
|
||||||
&& (ABS (event->button.x - button_x[0]) <= double_click_distance)
|
(ABS (event->button.x - button_x[0]) <= double_click_distance) &&
|
||||||
&& (ABS (event->button.y - button_y[0]) <= double_click_distance))
|
(ABS (event->button.y - button_y[0]) <= double_click_distance))
|
||||||
{
|
{
|
||||||
synthesize_click (backend, event, 2);
|
synthesize_click (backend, event, 2);
|
||||||
|
|
||||||
|
@ -61,25 +61,7 @@ typedef enum {
|
|||||||
CLUTTER_PICK_ALL
|
CLUTTER_PICK_ALL
|
||||||
} ClutterPickMode;
|
} ClutterPickMode;
|
||||||
|
|
||||||
typedef enum {
|
typedef struct _ClutterMainContext ClutterMainContext;
|
||||||
/* 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;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _ClutterMainContext
|
struct _ClutterMainContext
|
||||||
{
|
{
|
||||||
|
@ -295,30 +295,25 @@ static void
|
|||||||
events_queue (ClutterBackend *backend)
|
events_queue (ClutterBackend *backend)
|
||||||
{
|
{
|
||||||
ClutterBackendEGL *backend_egl = CLUTTER_BACKEND_EGL (backend);
|
ClutterBackendEGL *backend_egl = CLUTTER_BACKEND_EGL (backend);
|
||||||
Display *xdisplay = backend_egl->xdpy;
|
ClutterEvent *event;
|
||||||
XEvent xevent;
|
XEvent xevent;
|
||||||
ClutterMainContext *clutter_context;
|
ClutterMainContext *clutter_context;
|
||||||
|
|
||||||
clutter_context = clutter_context_get_default ();
|
clutter_context = clutter_context_get_default ();
|
||||||
|
|
||||||
|
Display *xdisplay = backend_egl->xdpy;
|
||||||
|
|
||||||
while (!clutter_events_pending () && XPending (xdisplay))
|
while (!clutter_events_pending () && XPending (xdisplay))
|
||||||
{
|
{
|
||||||
ClutterEvent *event;
|
|
||||||
|
|
||||||
XNextEvent (xdisplay, &xevent);
|
XNextEvent (xdisplay, &xevent);
|
||||||
|
|
||||||
event = clutter_event_new (CLUTTER_NOTHING);
|
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))
|
if (clutter_event_translate (backend, event, &xevent))
|
||||||
{
|
{
|
||||||
((ClutterEventPrivate *) event)->flags &= ~CLUTTER_EVENT_PENDING;
|
g_queue_push_head (clutter_context->events_queue, event);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
g_queue_remove (clutter_context->events_queue, event);
|
|
||||||
clutter_event_free (event);
|
clutter_event_free (event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -517,6 +517,7 @@ static void
|
|||||||
events_queue (ClutterBackend *backend)
|
events_queue (ClutterBackend *backend)
|
||||||
{
|
{
|
||||||
ClutterBackendGLX *backend_glx = CLUTTER_BACKEND_GLX (backend);
|
ClutterBackendGLX *backend_glx = CLUTTER_BACKEND_GLX (backend);
|
||||||
|
ClutterEvent *event;
|
||||||
Display *xdisplay = backend_glx->xdpy;
|
Display *xdisplay = backend_glx->xdpy;
|
||||||
XEvent xevent;
|
XEvent xevent;
|
||||||
ClutterMainContext *clutter_context;
|
ClutterMainContext *clutter_context;
|
||||||
@ -525,27 +526,17 @@ events_queue (ClutterBackend *backend)
|
|||||||
|
|
||||||
while (!clutter_events_pending () && XPending (xdisplay))
|
while (!clutter_events_pending () && XPending (xdisplay))
|
||||||
{
|
{
|
||||||
ClutterEvent *event;
|
|
||||||
|
|
||||||
XNextEvent (xdisplay, &xevent);
|
XNextEvent (xdisplay, &xevent);
|
||||||
|
|
||||||
event = clutter_event_new (CLUTTER_NOTHING);
|
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))
|
if (event_translate (backend, event, &xevent))
|
||||||
{
|
{
|
||||||
/* translation successful, the event is done */
|
/* push directly here to avoid copy of queue_put */
|
||||||
((ClutterEventPrivate *) event)->flags &= ~CLUTTER_EVENT_PENDING;
|
g_queue_push_head (clutter_context->events_queue, event);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* remove the event from the queue */
|
|
||||||
g_queue_remove (clutter_context->events_queue, event);
|
|
||||||
clutter_event_free (event);
|
clutter_event_free (event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -326,17 +326,13 @@ clutter_event_dispatch (GSource *source,
|
|||||||
{
|
{
|
||||||
event = clutter_event_new (CLUTTER_NOTHING);
|
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))
|
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
|
else
|
||||||
{
|
{
|
||||||
g_queue_remove (clutter_context->events_queue, event);
|
|
||||||
clutter_event_free (event);
|
clutter_event_free (event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -346,7 +342,7 @@ clutter_event_dispatch (GSource *source,
|
|||||||
|
|
||||||
if (event)
|
if (event)
|
||||||
{
|
{
|
||||||
clutter_do_event (event);
|
clutter_do_event(event);
|
||||||
clutter_event_free (event);
|
clutter_event_free (event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user