From: Matthew Allum Date: Wed, 7 May 2008 20:56:32 +0000 (+0000) Subject: 2008-05-07 Matthew Allum X-Git-Url: http://vcs.maemo.org/git/?p=clutter-gtk;a=commitdiff_plain;h=b2068ab6aded38ea31531dc09d0c9cb228efc6dc 2008-05-07 Matthew Allum * clutter-gtk/gtk-clutter-embed.c: Add motion event handling - fixes #907 --- diff --git a/ChangeLog b/ChangeLog index 9ea2854..a4853c7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2008-05-07 Matthew Allum + + * clutter-gtk/gtk-clutter-embed.c: + Add motion event handling - fixes #907 + 2008-04-24 Emmanuele Bassi * examples/gtk-clutter-test.c (main): Use the utility function diff --git a/clutter-gtk/gtk-clutter-embed.c b/clutter-gtk/gtk-clutter-embed.c index 549aed0..0ccc9bc 100644 --- a/clutter-gtk/gtk-clutter-embed.c +++ b/clutter-gtk/gtk-clutter-embed.c @@ -151,9 +151,14 @@ gtk_clutter_embed_realize (GtkWidget *widget) attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); + + /* NOTE: GDK_MOTION_NOTIFY above should be safe as Clutter does its own + * throtling. + */ attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK; + | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_MOTION_NOTIFY; + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; @@ -206,6 +211,42 @@ gtk_clutter_embed_size_allocate (GtkWidget *widget, } static gboolean +gtk_clutter_embed_motion_notify_event (GtkWidget *widget, + GdkEventMotion *event) +{ + GtkClutterEmbedPrivate *priv = GTK_CLUTTER_EMBED (widget)->priv; + ClutterEvent cevent = { 0, }; + + cevent.type = CLUTTER_MOTION; + cevent.any.stage = CLUTTER_STAGE (priv->stage); + cevent.motion.x = event->x; + cevent.motion.y = event->y; + cevent.motion.time = event->time; + + clutter_do_event (&cevent); + + /* doh - motion events can push ENTER/LEAVE events onto Clutters + * internal event queue which we do really ever touch (essentially + * proxying from gtks queue). The below pumps them back out and + * processes. + * *could* be side effects with below though doubful as no other + * events reach the queue (we shut down event collection). Maybe + * a peek_mask type call could be even safer. + */ + while (clutter_events_pending()) + { + ClutterEvent *ev = clutter_event_get (); + if (ev) + { + clutter_do_event (ev); + clutter_event_free (ev); + } + } + + return FALSE; +} + +static gboolean gtk_clutter_embed_button_event (GtkWidget *widget, GdkEventButton *event) { @@ -384,6 +425,7 @@ gtk_clutter_embed_class_init (GtkClutterEmbedClass *klass) widget_class->button_release_event = gtk_clutter_embed_button_event; widget_class->key_press_event = gtk_clutter_embed_key_event; widget_class->key_release_event = gtk_clutter_embed_key_event; + widget_class->motion_notify_event = gtk_clutter_embed_motion_notify_event; widget_class->expose_event = gtk_clutter_embed_expose_event; widget_class->map_event = gtk_clutter_embed_map_event; }