[PATCH 1/1] evdev: Wait for SYN event before sending events over to the client
Kristian Høgsberg
hoegsberg at gmail.com
Wed Feb 27 13:03:19 PST 2013
On Sat, Feb 23, 2013 at 11:50:34AM +0100, Jonas Ådahl wrote:
> 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,
Thanks Jonas, I squased your fix in. Committed on master and 1.0.
Kristian
>
>
> >
> > + 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
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list