evdev: Wait for SYN event before sending events over to the client
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
This commit is contained in:
parent
6d8fcc75b8
commit
964a342e53
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue