2007-03-23 Emmanuele Bassi <ebassi@openedhand.com>
authorEmmanuele Bassi <ebassi@openedhand.com>
Fri, 23 Mar 2007 09:44:21 +0000 (09:44 +0000)
committerEmmanuele Bassi <ebassi@openedhand.com>
Fri, 23 Mar 2007 09:44:21 +0000 (09:44 +0000)
* clutter/clutter-event.c: Pop and peek the event queue
from the tail - it's a queue, not a stack.

ChangeLog
clutter/clutter-event.c
clutter/clutter-main.c
clutter/clutter-private.h
clutter/clutter-stage.c
clutter/clutter-stage.h
clutter/glx/clutter-event-glx.c
doc/reference/tmpl/clutter-stage.sgml
examples/test.c

index 7dbc0cc..860f8e2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-03-23  Emmanuele Bassi  <ebassi@openedhand.com>
+
+       * 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  <ebassi@openedhand.com>
 
        * clutter.pc.in: Require gobject-2.0 too.
index 53b8928..1da199f 100644 (file)
@@ -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
index ad51166..70eec21 100644 (file)
@@ -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;
+}
index 59eb36f..4ed17ad 100644 (file)
@@ -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);
 
index 52d20dc..34aec54 100644 (file)
@@ -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.
@@ -227,24 +228,6 @@ clutter_stage_class_init (ClutterStageClass *klass)
                         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
    * @event: a #ClutterButtonEvent
@@ -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));
 }
index 7dd68a6..8b75fb5 100644 (file)
@@ -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);
index b3b247c..638c22f 100644 (file)
@@ -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:
index a16e1c0..b4ebeb9 100644 (file)
@@ -59,14 +59,8 @@ Macro evaluating to the height of the #ClutterStage
 </para>
 
 @clutterstage: the object which received the signal.
-
-<!-- ##### SIGNAL ClutterStage::input-event ##### -->
-<para>
-
-</para>
-
-@clutterstage: the object which received the signal.
-@arg1: 
+@Param2: 
+@Returns: 
 
 <!-- ##### SIGNAL ClutterStage::key-press-event ##### -->
 <para>
@@ -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: 
index c4874e8..b3cc6a1 100644 (file)
@@ -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",