events: Deliver touch events to actors
authorTomeu Vizoso <tomeu.vizoso@collabora.com>
Mon, 4 Jun 2012 11:15:13 +0000 (13:15 +0200)
committerTomeu Vizoso <tomeu.vizoso@collabora.com>
Tue, 5 Jun 2012 13:59:52 +0000 (15:59 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=677390

clutter/clutter-main.c

index 7e4bef8..744301b 100644 (file)
@@ -2614,6 +2614,40 @@ _clutter_process_event_details (ClutterActor        *stage,
       case CLUTTER_TOUCH_BEGIN:
       case CLUTTER_TOUCH_UPDATE:
       case CLUTTER_TOUCH_END:
+        {
+          ClutterActor *actor;
+          gfloat x, y;
+
+          clutter_event_get_coords (event, &x, &y);
+
+          /* Only do a pick to find the source if source is not already set
+           * (as it could be in a synthetic event)
+           */
+          if (event->any.source == NULL)
+            {
+              actor = _clutter_stage_do_pick (CLUTTER_STAGE (stage),
+                                              x, y,
+                                              CLUTTER_PICK_REACTIVE);
+              if (actor == NULL)
+                break;
+
+              event->any.source = actor;
+            }
+          else
+            {
+              /* use the source already set in the synthetic event */
+              actor = event->any.source;
+            }
+
+          CLUTTER_NOTE (EVENT,
+                        "Reactive event received at %.2f, %.2f - actor: %p",
+                        x, y,
+                        actor);
+
+          emit_pointer_event (event, device);
+          break;
+        }
+
       case CLUTTER_TOUCH_CANCEL:
         break;