From 93d7454b37429ca2696eef5370f4dd2f7addbeb8 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Fri, 23 Mar 2007 09:44:21 +0000 Subject: [PATCH] 2007-03-23 Emmanuele Bassi * clutter/clutter-event.c: Pop and peek the event queue from the tail - it's a queue, not a stack. --- ChangeLog | 5 ++++ clutter/clutter-event.c | 4 +-- clutter/clutter-main.c | 16 +++++++++++ clutter/clutter-private.h | 6 ++++ clutter/clutter-stage.c | 40 ++++++++------------------- clutter/clutter-stage.h | 5 ++-- clutter/glx/clutter-event-glx.c | 2 ++ doc/reference/tmpl/clutter-stage.sgml | 12 ++------ examples/test.c | 13 +++++++++ 9 files changed, 62 insertions(+), 41 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7dbc0cc54..860f8e2b9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-03-23 Emmanuele Bassi + + * clutter/clutter-event.c: Pop and peek the event queue + from the tail - it's a queue, not a stack. + 2007-03-22 Emmanuele Bassi * clutter.pc.in: Require gobject-2.0 too. diff --git a/clutter/clutter-event.c b/clutter/clutter-event.c index 53b892874..1da199f4c 100644 --- a/clutter/clutter-event.c +++ b/clutter/clutter-event.c @@ -433,7 +433,7 @@ _clutter_event_queue_pop (ClutterBackend *backend) if (!backend->events_queue) return NULL; - return g_queue_pop_head (backend->events_queue); + return g_queue_pop_tail (backend->events_queue); } ClutterEvent * @@ -442,7 +442,7 @@ _clutter_event_queue_peek (ClutterBackend *backend) if (!backend->events_queue) return NULL; - return g_queue_peek_head (backend->events_queue); + return g_queue_peek_tail (backend->events_queue); } gboolean diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c index ad51166c1..70eec2180 100644 --- a/clutter/clutter-main.c +++ b/clutter/clutter-main.c @@ -632,3 +632,19 @@ clutter_init (int *argc, return CLUTTER_INIT_SUCCESS; } + +gboolean +_clutter_boolean_accumulator (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer dummy) +{ + gboolean continue_emission; + gboolean signal_handled; + + signal_handled = g_value_get_boolean (handler_return); + g_value_set_boolean (return_accu, signal_handled); + continue_emission = !signal_handled; + + return continue_emission; +} diff --git a/clutter/clutter-private.h b/clutter/clutter-private.h index 59eb36fe5..4ed17add5 100644 --- a/clutter/clutter-private.h +++ b/clutter/clutter-private.h @@ -96,6 +96,12 @@ ClutterEvent *_clutter_event_queue_pop (ClutterBackend *backend); ClutterEvent *_clutter_event_queue_peek (ClutterBackend *backend); gboolean _clutter_event_queue_check_pending (ClutterBackend *backend); +/* signal accumulators */ +gboolean _clutter_boolean_accumulator (GSignalInvocationHint *ihint, + GValue *return_accu, + const GValue *handler_return, + gpointer dummy); + typedef void (* ClutterEventFunc) (ClutterEvent *event, gpointer data); diff --git a/clutter/clutter-stage.c b/clutter/clutter-stage.c index 52d20dc0f..34aec5448 100644 --- a/clutter/clutter-stage.c +++ b/clutter/clutter-stage.c @@ -88,7 +88,8 @@ enum static guint stage_signals[LAST_SIGNAL] = { 0 }; static void -clutter_stage_delete_event (ClutterStage *stage) +clutter_stage_delete_event (ClutterStage *stage, + ClutterAnyEvent *event) { /* FIXME - destroy the main stage, probably attaching a weak ref * to it from the backend, so that it gets destroyed too. @@ -226,24 +227,6 @@ clutter_stage_class_init (ClutterStageClass *klass) CLUTTER_TYPE_COLOR, CLUTTER_PARAM_READWRITE)); - /** - * ClutterStage::input-event: - * @stage: the actor which received the event - * @event: the event received - * - * The ::input-event is a signal emitted when any input event is - * received. Valid input events are mouse button press and release - * events, and key press and release events. - */ - stage_signals[INPUT_EVENT] = - g_signal_new ("input-event", - G_TYPE_FROM_CLASS (gobject_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ClutterStageClass, input_event), - NULL, NULL, - clutter_marshal_VOID__BOXED, - G_TYPE_NONE, 1, - CLUTTER_TYPE_EVENT); /** * ClutterStage::button-press-event: * @stage: the actor which received the event @@ -260,7 +243,7 @@ clutter_stage_class_init (ClutterStageClass *klass) NULL, NULL, clutter_marshal_VOID__BOXED, G_TYPE_NONE, 1, - CLUTTER_TYPE_EVENT); + CLUTTER_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); /** * ClutterStage::button-release-event: * @stage: the actor which received the event @@ -277,7 +260,7 @@ clutter_stage_class_init (ClutterStageClass *klass) NULL, NULL, clutter_marshal_VOID__BOXED, G_TYPE_NONE, 1, - CLUTTER_TYPE_EVENT); + CLUTTER_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); /** * ClutterStage::scroll-event: * @stage: the actor which received the event @@ -296,7 +279,7 @@ clutter_stage_class_init (ClutterStageClass *klass) NULL, NULL, clutter_marshal_VOID__BOXED, G_TYPE_NONE, 1, - CLUTTER_TYPE_EVENT); + CLUTTER_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); /** * ClutterStage::key-press-event: * @stage: the actor which received the event @@ -313,7 +296,7 @@ clutter_stage_class_init (ClutterStageClass *klass) NULL, NULL, clutter_marshal_VOID__BOXED, G_TYPE_NONE, 1, - CLUTTER_TYPE_EVENT); + CLUTTER_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); /** * ClutterStage::key-release-event: * @stage: the actor which received the event @@ -330,7 +313,7 @@ clutter_stage_class_init (ClutterStageClass *klass) NULL, NULL, clutter_marshal_VOID__BOXED, G_TYPE_NONE, 1, - CLUTTER_TYPE_EVENT); + CLUTTER_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); /** * ClutterStage::motion-event: * @stage: the actor which received the event @@ -347,16 +330,17 @@ clutter_stage_class_init (ClutterStageClass *klass) NULL, NULL, clutter_marshal_VOID__BOXED, G_TYPE_NONE, 1, - CLUTTER_TYPE_EVENT); + CLUTTER_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); stage_signals[DELETE_EVENT] = g_signal_new ("delete-event", G_TYPE_FROM_CLASS (gobject_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (ClutterStageClass, delete_event), - NULL, NULL, - clutter_marshal_VOID__VOID, - G_TYPE_NONE, 0); + _clutter_boolean_accumulator, NULL, + clutter_marshal_VOID__BOXED, + G_TYPE_BOOLEAN, 1, + CLUTTER_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); g_type_class_add_private (gobject_class, sizeof (ClutterStagePrivate)); } diff --git a/clutter/clutter-stage.h b/clutter/clutter-stage.h index 7dd68a617..8b75fb5a4 100644 --- a/clutter/clutter-stage.h +++ b/clutter/clutter-stage.h @@ -96,7 +96,7 @@ struct _ClutterStageClass void (* flush) (ClutterStage *stage); /* signals */ - void (* input_event) (ClutterStage *stage, + void (* event) (ClutterStage *stage, ClutterEvent *event); void (* button_press_event) (ClutterStage *stage, ClutterButtonEvent *event); @@ -112,7 +112,8 @@ struct _ClutterStageClass ClutterMotionEvent *event); void (* stage_state_event) (ClutterStage *stage, ClutterStageStateEvent *event); - void (* delete_event) (ClutterStage *stage); + void (* delete_event) (ClutterStage *stage, + ClutterAnyEvent *event); /* padding for future expansion */ void (*_clutter_stage1) (void); diff --git a/clutter/glx/clutter-event-glx.c b/clutter/glx/clutter-event-glx.c index b3b247cf7..638c22f3b 100644 --- a/clutter/glx/clutter-event-glx.c +++ b/clutter/glx/clutter-event-glx.c @@ -312,6 +312,8 @@ clutter_event_translate (ClutterBackend *backend, event->motion.modifier_state = xevent->xmotion.state; break; case DestroyNotify: + CLUTTER_NOTE (EVENT, "destroy notify:\twindow: %ld", + xevent->xdestroywindow.window); event->type = event->any.type = CLUTTER_DESTROY_NOTIFY; break; default: diff --git a/doc/reference/tmpl/clutter-stage.sgml b/doc/reference/tmpl/clutter-stage.sgml index a16e1c052..b4ebeb90e 100644 --- a/doc/reference/tmpl/clutter-stage.sgml +++ b/doc/reference/tmpl/clutter-stage.sgml @@ -59,14 +59,8 @@ Macro evaluating to the height of the #ClutterStage @clutterstage: the object which received the signal. - - - - - - -@clutterstage: the object which received the signal. -@arg1: +@Param2: +@Returns: @@ -132,7 +126,7 @@ Macro evaluating to the height of the #ClutterStage @get_actor_at_pos: @draw_to_pixbuf: @flush: -@input_event: +@event: @button_press_event: @button_release_event: @scroll_event: diff --git a/examples/test.c b/examples/test.c index c4874e8ba..b3cc6a13d 100644 --- a/examples/test.c +++ b/examples/test.c @@ -79,6 +79,17 @@ key_release_cb (ClutterStage *stage, g_print ("key-release-event\n"); } +static gboolean +delete_event_cb (ClutterStage *stage, + ClutterEvent *event, + gpointer data) +{ + g_print ("delete-event\n"); + + return TRUE; +} + + int main (int argc, char *argv[]) { @@ -91,6 +102,8 @@ main (int argc, char *argv[]) clutter_init (&argc, &argv); stage = clutter_stage_get_default (); + g_signal_connect (stage, "delete-event", + G_CALLBACK (delete_event_cb), NULL); g_signal_connect (stage, "key-press-event", G_CALLBACK (key_press_cb), NULL); g_signal_connect (stage, "key-release-event",