On Fri, Jun 27, 2014 at 09:00:21AM +1000, Peter Hutterer wrote:
> On Thu, Jun 26, 2014 at 06:02:48PM -0400, Stephen Chandler Paul wrote:
> > Because bad distance events still trigger calls to tablet_flush(),
> > tablet_flush() will see that the tablet is out of proximity and assume it's 
> > an
> > appropriate time to send a proximity-out event, even when we've already sent
> > one. This results in multiple proximity-out events being sent in a row 
> > instead
> > of just one.
> > In addition, the bad distance events test has been modified to pick up on 
> > this.
> > We shouldn't be receiving /any/ events when we get false distance events 
> > from
> > evdev anyway.
> > 
> > Signed-off-by: Stephen Chandler Paul <[email protected]>
> > ---
> 
> Please always add a section in here listing what changed.

huh, hit the wrong key too early, sorry.

afaict, this is the same patch as before, merged it locally now. thanks.

Cheers,
   Peter

> >  src/evdev-tablet.c | 12 ++++++++----
> >  src/evdev-tablet.h |  3 ++-
> >  test/tablet.c      | 27 +++++----------------------
> >  3 files changed, 15 insertions(+), 27 deletions(-)
> > 
> > diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
> > index a6acca4..584b49e 100644
> > --- a/src/evdev-tablet.c
> > +++ b/src/evdev-tablet.c
> > @@ -102,7 +102,7 @@ tablet_update_tool(struct tablet_dispatch *tablet,
> >             tablet_unset_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY);
> >     }
> >     else
> > -           tablet_set_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY);
> > +           tablet_set_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY);
> >  }
> >  
> >  static inline double
> > @@ -164,7 +164,8 @@ tablet_check_notify_axes(struct tablet_dispatch *tablet,
> >     }
> >  
> >     if (axis_update_needed &&
> > -       !tablet_has_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY))
> > +       !tablet_has_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY) &&
> > +       !tablet_has_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY))
> >             tablet_notify_axis(base,
> >                                time,
> >                                tablet->changed_axes,
> > @@ -378,7 +379,7 @@ tablet_flush(struct tablet_dispatch *tablet,
> >          struct evdev_device *device,
> >          uint32_t time)
> >  {
> > -   if (tablet_has_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY)) {
> > +   if (tablet_has_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY)) {
> >             /* Release all stylus buttons */
> >             tablet->button_state.stylus_buttons = 0;
> >             tablet_set_status(tablet, TABLET_BUTTONS_RELEASED);
> > @@ -405,8 +406,11 @@ tablet_flush(struct tablet_dispatch *tablet,
> >             tablet_unset_status(tablet, TABLET_BUTTONS_PRESSED);
> >     }
> >  
> > -   if (tablet_has_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY))
> > +   if (tablet_has_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY)) {
> >             tablet_notify_proximity_out(&device->base, time);
> > +           tablet_set_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY);
> > +           tablet_unset_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY);
> > +   }
> >  
> >     /* Update state */
> >     memcpy(&tablet->prev_button_state,
> > diff --git a/src/evdev-tablet.h b/src/evdev-tablet.h
> > index 504b093..89cf224 100644
> > --- a/src/evdev-tablet.h
> > +++ b/src/evdev-tablet.h
> > @@ -34,7 +34,8 @@ enum tablet_status {
> >     TABLET_BUTTONS_PRESSED = 1 << 2,
> >     TABLET_BUTTONS_RELEASED = 1 << 3,
> >     TABLET_STYLUS_IN_CONTACT = 1 << 4,
> > -   TABLET_TOOL_OUT_OF_PROXIMITY = 1 << 5
> > +   TABLET_TOOL_LEAVING_PROXIMITY = 1 << 5,
> > +   TABLET_TOOL_OUT_OF_PROXIMITY = 1 << 6
> >  };
> >  
> >  struct button_state {
> > diff --git a/test/tablet.c b/test/tablet.c
> > index adecdab..99200de 100644
> > --- a/test/tablet.c
> > +++ b/test/tablet.c
> > @@ -243,15 +243,12 @@ START_TEST(bad_distance_events)
> >  {
> >     struct litest_device *dev = litest_current_device();
> >     struct libinput *li = dev->libinput;
> > -   struct libinput_event_tablet *tablet_event;
> > -   struct libinput_event *event;
> > -   bool bad_distance_event_received = false,
> > -        axis_has_changed;
> > -   enum libinput_event_type type;
> >     const struct input_absinfo *absinfo;
> > +   struct axis_replacement axes[] = {
> > +           { -1, -1 },
> > +   };
> >  
> > -   litest_drain_events(dev->libinput);
> > -
> > +   litest_tablet_proximity_in(dev, 10, 10, axes);
> >     litest_tablet_proximity_out(dev);
> >     litest_drain_events(dev->libinput);
> >  
> > @@ -263,21 +260,7 @@ START_TEST(bad_distance_events)
> >     litest_event(dev, EV_ABS, ABS_DISTANCE, absinfo->minimum);
> >     litest_event(dev, EV_SYN, SYN_REPORT, 0);
> >  
> > -   /* We shouldn't be able to see any of the bad distance events that got
> > -    * sent
> > -    */
> > -   while ((event = libinput_get_event(li))) {
> > -           tablet_event = libinput_event_get_tablet_event(event);
> > -           type = libinput_event_get_type(event);
> > -           axis_has_changed = libinput_event_tablet_axis_has_changed(
> > -               tablet_event, LIBINPUT_TABLET_AXIS_DISTANCE);
> > -
> > -           if (type == LIBINPUT_EVENT_TABLET_AXIS && axis_has_changed)
> > -                   bad_distance_event_received = true;
> > -
> > -           libinput_event_destroy(event);
> > -   }
> > -   ck_assert(!bad_distance_event_received);
> > +   litest_assert_empty_queue(li);
> >  }
> >  END_TEST
> >  
> > -- 
> > 1.8.5.5
> > 
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to