[PATCH 1/1] evdev: Wait for SYN event before sending events over to the client
Jonas Ådahl
jadahl at gmail.com
Sat Feb 23 02:50:34 PST 2013
Hi,
On Fri, Feb 22, 2013 at 7:56 PM, Singh, Satyeshwar
<satyeshwar.singh at intel.com> wrote:
> 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.
>
> This commit should fix: https://bugs.freedesktop.org/show_bug.cgi?id=51909
>
> ---
>
> src/evdev.c | 7 ++++++-
>
> src/evdev.h | 1 +
>
> 2 files changed, 7 insertions(+), 1 deletion(-)
>
>
>
> diff --git a/src/evdev.c b/src/evdev.c
>
> index 286543a..72ca2f2 100644
>
> --- a/src/evdev.c
>
> +++ b/src/evdev.c
>
> @@ -249,9 +249,11 @@ evdev_flush_motion(struct evdev_device *device,
> uint32_t time)
>
> {
>
> struct weston_seat *master = device->seat;
>
> - if (!device->pending_events)
>
> + if (!device->pending_events || !(device->pending_events &
> EVDEV_SYN))
>
> return;
This will break the touchpad driver. To following diff makes it work again.
diff --git a/src/evdev-touchpad.c b/src/evdev-touchpad.c
index 73c04eb..c25a199 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,
>
> + 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 +310,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 ccbb222..eb5c868 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 {
>
> --
>
> 1.7.11.4
>
>
Jonas
More information about the wayland-devel
mailing list