[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