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
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,
{
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,
case EV_KEY:
evdev_process_key(device, event, time);
break;
+ case EV_SYN:
+ device->pending_events |= EVDEV_SYN;
+ break;
}
}
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 {