diff --git a/src/evdev-touchpad.c b/src/evdev-touchpad.c index 73c04eba..c25a199c 100644 --- a/src/evdev-touchpad.c +++ b/src/evdev-touchpad.c @@ -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, diff --git a/src/evdev.c b/src/evdev.c index 286543a0..a1fa01f0 100644 --- a/src/evdev.c +++ b/src/evdev.c @@ -249,9 +249,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, @@ -308,6 +309,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; } } diff --git a/src/evdev.h b/src/evdev.h index ccbb2224..eb5c8682 100644 --- a/src/evdev.h +++ b/src/evdev.h @@ -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 {