evdev: Wait for SYN event before sending events over to the client
authorSatyeshwar Singh <satyeshwar.singh@intel.com>
Wed, 27 Feb 2013 20:26:23 +0000 (15:26 -0500)
committerKristian Høgsberg <krh@bitplanet.net>
Wed, 27 Feb 2013 21:10:22 +0000 (16:10 -0500)
The issue was that touch::down event from the compositor to client apps
would send the previous motion events coordinates and this obviously made
the client do the wrong thing. This happened because we were not waiting
for a SYN event to come from evdev before sending down, motion or up events.

https://bugs.freedesktop.org/show_bug.cgi?id=51909

src/evdev-touchpad.c
src/evdev.c
src/evdev.h

index 73c04eb..c25a199 100644 (file)
@@ -481,7 +481,7 @@ touchpad_update_state(struct touchpad_dispatch *touchpad, uint32_t time)
                        touchpad->device->rel.dx = wl_fixed_from_double(dx);
                        touchpad->device->rel.dy = wl_fixed_from_double(dy);
                        touchpad->device->pending_events |=
-                               EVDEV_RELATIVE_MOTION;
+                               EVDEV_RELATIVE_MOTION | EVDEV_SYN;
                } else if (touchpad->finger_state == TOUCHPAD_FINGERS_TWO) {
                        if (dx != 0.0)
                                notify_axis(touchpad->device->seat,
index 321992e..ccadf92 100644 (file)
@@ -234,9 +234,10 @@ evdev_flush_motion(struct evdev_device *device, uint32_t time)
 {
        struct weston_seat *master = device->seat;
 
-       if (!device->pending_events)
+       if (!(device->pending_events & EVDEV_SYN))
                return;
 
+       device->pending_events &= ~EVDEV_SYN;
        if (device->pending_events & EVDEV_RELATIVE_MOTION) {
                notify_motion(master, time,
                              master->seat.pointer->x + device->rel.dx,
@@ -292,6 +293,9 @@ fallback_process(struct evdev_dispatch *dispatch,
        case EV_KEY:
                evdev_process_key(device, event, time);
                break;
+       case EV_SYN:
+               device->pending_events |= EVDEV_SYN;
+               break;
        }
 }
 
index 7222de3..bb931f3 100644 (file)
@@ -34,6 +34,7 @@ enum evdev_event_type {
        EVDEV_ABSOLUTE_MT_MOTION = (1 << 2),
        EVDEV_ABSOLUTE_MT_UP = (1 << 3),
        EVDEV_RELATIVE_MOTION = (1 << 4),
+       EVDEV_SYN = (1 << 5),
 };
 
 enum evdev_device_capability {