On Thu, Jun 19, 2014 at 01:18:06AM -0400, Stephen Chandler Paul wrote:
> Axis changes are now still processed by libinput regardless of whether or not
> the tool is in proximity, however we refrain from reporting them unless the 
> tool
> is in proximity. This stops bad distance events from being reported without
> needing a huge mess of conditional statements in sanitize_axes(). The tool is
> now counted as back in proximity when a tool update is received instead of 
> when
> an axis update is received.
> 
> Signed-off-by: Stephen Chandler Paul <[email protected]>

all 4 pushed, thanks.

Cheers,
   Peter

> ---
>  src/evdev-tablet.c | 67 
> +++++++++++++++++++++++-------------------------------
>  src/evdev-tablet.h |  9 ++++----
>  2 files changed, 33 insertions(+), 43 deletions(-)
> 
> diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
> index bde3b47..760b954 100644
> --- a/src/evdev-tablet.c
> +++ b/src/evdev-tablet.c
> @@ -50,9 +50,6 @@ tablet_process_absolute(struct tablet_dispatch *tablet,
>       case ABS_PRESSURE:
>       case ABS_TILT_X:
>       case ABS_TILT_Y:
> -             tablet_unset_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY);
> -
> -             /* Fall through */
>       case ABS_DISTANCE:
>               axis = evcode_to_axis(e->code);
>               if (axis == LIBINPUT_TABLET_AXIS_NONE) {
> @@ -77,12 +74,15 @@ tablet_update_tool(struct tablet_dispatch *tablet,
>  {
>       assert(tool != LIBINPUT_TOOL_NONE);
>  
> -     if (enabled && tool != tablet->current_tool_type) {
> -             tablet->current_tool_type = tool;
> -             tablet_set_status(tablet, TABLET_TOOL_UPDATED);
> +     if (enabled) {
> +             if (tool != tablet->current_tool_type) {
> +                     tablet->current_tool_type = tool;
> +                     tablet_set_status(tablet, TABLET_TOOL_UPDATED);
> +             }
> +             tablet_unset_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY);
>       }
> -     else if (!enabled)
> -             tablet_set_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY);
> +     else
> +             tablet_set_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY);
>  }
>  
>  static inline double
> @@ -141,10 +141,14 @@ tablet_check_notify_axes(struct tablet_dispatch *tablet,
>               axis_update_needed = true;
>       }
>  
> -     if (axis_update_needed) {
> -             tablet_notify_axis(base, time, tablet->changed_axes, 
> tablet->axes);
> -             memset(tablet->changed_axes, 0, sizeof(tablet->changed_axes));
> -     }
> +     if (axis_update_needed &&
> +         !tablet_has_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY))
> +             tablet_notify_axis(base,
> +                                time,
> +                                tablet->changed_axes,
> +                                tablet->axes);
> +
> +     memset(tablet->changed_axes, 0, sizeof(tablet->changed_axes));
>  }
>  
>  static void
> @@ -223,6 +227,8 @@ tablet_process_misc(struct tablet_dispatch *tablet,
>                   e->value != -1) {
>                       tablet->current_tool_serial = e->value;
>                       tablet_set_status(tablet, TABLET_TOOL_UPDATED);
> +                     tablet_unset_status(tablet,
> +                                         TABLET_TOOL_OUT_OF_PROXIMITY);
>               }
>               break;
>       default:
> @@ -334,11 +340,8 @@ sanitize_tablet_axes(struct tablet_dispatch *tablet)
>        * properly
>        */
>       if (bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_AXIS_DISTANCE) &&
> -         ((distance->value > distance->minimum &&
> -           pressure->value > pressure->minimum) ||
> -          (tablet_has_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY) &&
> -           (distance->value <= distance->minimum ||
> -            distance->value >= distance->maximum)))) {
> +         distance->value > distance->minimum &&
> +         pressure->value > pressure->minimum) {
>               clear_bit(tablet->changed_axes, LIBINPUT_TABLET_AXIS_DISTANCE);
>               tablet->axes[LIBINPUT_TABLET_AXIS_DISTANCE] = 0;
>       } else if (bit_is_set(tablet->changed_axes, 
> LIBINPUT_TABLET_AXIS_PRESSURE) &&
> @@ -357,28 +360,19 @@ tablet_flush(struct tablet_dispatch *tablet,
>            struct evdev_device *device,
>            uint32_t time)
>  {
> -     if (tablet_has_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY)) {
> +     if (tablet_has_status(tablet, TABLET_TOOL_OUT_OF_PROXIMITY)) {
>               /* Release all stylus buttons */
>               tablet->button_state.stylus_buttons = 0;
>               tablet_set_status(tablet, TABLET_BUTTONS_RELEASED);
> +     } else if (tablet_has_status(tablet, TABLET_TOOL_UPDATED)) {
> +             tablet_notify_tool(tablet, device, time);
> +             tablet_unset_status(tablet, TABLET_TOOL_UPDATED);
> +     }
>  
> -             /* FIXME: This behavior is not ideal and this memset should be
> -              * removed */
> -             memset(&tablet->changed_axes, 0, sizeof(tablet->changed_axes));
> -             memset(&tablet->axes, 0, sizeof(tablet->axes));
> -
> +     if (tablet_has_status(tablet, TABLET_AXES_UPDATED)) {
> +             sanitize_tablet_axes(tablet);
> +             tablet_check_notify_axes(tablet, device, time);
>               tablet_unset_status(tablet, TABLET_AXES_UPDATED);
> -     } else {
> -             if (tablet_has_status(tablet, TABLET_TOOL_UPDATED)) {
> -                     tablet_notify_tool(tablet, device, time);
> -                     tablet_unset_status(tablet, TABLET_TOOL_UPDATED);
> -             }
> -
> -             if (tablet_has_status(tablet, TABLET_AXES_UPDATED)) {
> -                     sanitize_tablet_axes(tablet);
> -                     tablet_check_notify_axes(tablet, device, time);
> -                     tablet_unset_status(tablet, TABLET_AXES_UPDATED);
> -             }
>       }
>  
>       if (tablet_has_status(tablet, TABLET_BUTTONS_RELEASED)) {
> @@ -393,11 +387,8 @@ tablet_flush(struct tablet_dispatch *tablet,
>               tablet_unset_status(tablet, TABLET_BUTTONS_PRESSED);
>       }
>  
> -     if (tablet_has_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY)) {
> +     if (tablet_has_status(tablet, TABLET_TOOL_OUT_OF_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 bc2939d..9beba7b 100644
> --- a/src/evdev-tablet.h
> +++ b/src/evdev-tablet.h
> @@ -31,11 +31,10 @@ enum tablet_status {
>       TABLET_NONE = 0,
>       TABLET_AXES_UPDATED = 1 << 0,
>       TABLET_TOOL_UPDATED = 1 << 1,
> -     TABLET_TOOL_LEAVING_PROXIMITY = 1 << 2,
> -     TABLET_BUTTONS_PRESSED = 1 << 3,
> -     TABLET_BUTTONS_RELEASED = 1 << 4,
> -     TABLET_STYLUS_IN_CONTACT = 1 << 5,
> -     TABLET_TOOL_OUT_OF_PROXIMITY = 1 << 6
> +     TABLET_BUTTONS_PRESSED = 1 << 2,
> +     TABLET_BUTTONS_RELEASED = 1 << 3,
> +     TABLET_STYLUS_IN_CONTACT = 1 << 4,
> +     TABLET_TOOL_OUT_OF_PROXIMITY = 1 << 5
>  };
>  
>  struct button_state {
> -- 
> 1.8.5.5
> 
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to