On Thu, Jun 12, 2014 at 11:28:33PM -0400, Stephen Chandler Paul wrote:
> This commit changes two things with the way distance and pressure axes are
> reported:
> 1. Distance and pressure are made mutually exclusive. When there is a distance
>    event and a pressure event and the tool is in contact with the tablet, only
>    the pressure change will be reported. When the tool is not in contact and
>    both a distance and pressure change are received, only the distance update
>    will be received.
> 2. Bad distance events are not reported to the caller. There is a certain
>    distance a tool can be from the tablet where the tablet recongnizes that a
>    tool appeared, but the tool doesn't send any useful information to the
>    tablet. When this happens, the distance will update to it's minimum or
>    maximum value, and no other axis updates will be sent. Since this can give
>    a caller the impression that the tool is within a useful proximity of the
>    tablet, we filter out any distance events with a value of maximum or 
> minimum
>    when the tool is not within useful proximity of the tablet.
> 
> Signed-off-by: Stephen Chandler Paul <[email protected]>
> ---
>  src/evdev-tablet.c | 34 ++++++++++++++++++++++++++++++++++
>  src/evdev-tablet.h |  3 ++-
>  2 files changed, 36 insertions(+), 1 deletion(-)
> 
> diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
> index 8cb7d64..f42caab 100644
> --- a/src/evdev-tablet.c
> +++ b/src/evdev-tablet.c
> @@ -56,6 +56,9 @@ tablet_process_absolute(struct tablet_dispatch *tablet,
>       case ABS_PRESSURE:
>       case ABS_TILT_X:
>       case ABS_TILT_Y:
> +             tablet_unset_status(tablet, TABLET_TOOL_LEFT_PROXIMITY);

Only one request: please rename this to TABLET_TOOL_OUT_OF_PROXIMITY. My
brain keeps wondering how proximity can be on the left even though I know
what it should in this context.

otherwise
Reviewed-by: Peter Hutterer <[email protected]>

Cheers,
   Peter

> +
> +             /* Fall through */
>       case ABS_DISTANCE:
>               axis = evcode_to_axis(e->code);
>               if (axis == LIBINPUT_TABLET_AXIS_NONE) {
> @@ -314,6 +317,35 @@ tablet_notify_buttons(struct tablet_dispatch *tablet,
>  }
>  
>  static void
> +sanitize_tablet_axes(struct tablet_dispatch *tablet)
> +{
> +     const struct input_absinfo *distance,
> +                                *pressure;
> +
> +     distance = tablet->absinfo[LIBINPUT_TABLET_AXIS_DISTANCE];
> +     pressure = tablet->absinfo[LIBINPUT_TABLET_AXIS_PRESSURE];
> +
> +     /* Keep distance and pressure mutually exclusive. In addition, filter
> +      * out invalid distance events that can occur when the tablet tool is
> +      * close enough for the tablet to detect that's something's there, but
> +      * not close enough for it to actually receive data from the tool
> +      * properly
> +      */
> +     if (bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_AXIS_DISTANCE) &&
> +         ((bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_AXIS_PRESSURE) &&
> +           distance->value > distance->minimum &&
> +           pressure->value > pressure->minimum) ||
> +          (tablet_has_status(tablet, TABLET_TOOL_LEFT_PROXIMITY) &&
> +           (distance->value <= distance->minimum ||
> +            distance->value >= distance->maximum)))) {
> +             clear_bit(tablet->changed_axes, LIBINPUT_TABLET_AXIS_DISTANCE);
> +     } else if (bit_is_set(tablet->changed_axes, 
> LIBINPUT_TABLET_AXIS_PRESSURE) &&
> +                !tablet_has_status(tablet, TABLET_STYLUS_IN_CONTACT)) {
> +             clear_bit(tablet->changed_axes, LIBINPUT_TABLET_AXIS_PRESSURE);
> +     }
> +}
> +
> +static void
>  tablet_flush(struct tablet_dispatch *tablet,
>            struct evdev_device *device,
>            uint32_t time)
> @@ -334,6 +366,7 @@ tablet_flush(struct tablet_dispatch *tablet,
>               }
>  
>               if (tablet_has_status(tablet, TABLET_AXES_UPDATED)) {
> +                     sanitize_tablet_axes(tablet);
>                       tablet_notify_axes(tablet, device, time);
>                       tablet_unset_status(tablet, TABLET_AXES_UPDATED);
>               }
> @@ -354,6 +387,7 @@ tablet_flush(struct tablet_dispatch *tablet,
>       /* We want button releases to be sent before the proximity out event */
>       if (tablet_has_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY)) {
>               tablet_notify_proximity_out(&device->base, time);
> +             tablet_set_status(tablet, TABLET_TOOL_LEFT_PROXIMITY);
>               tablet_unset_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY);
>       }
>  
> diff --git a/src/evdev-tablet.h b/src/evdev-tablet.h
> index ffcf33c..5a27c8d 100644
> --- a/src/evdev-tablet.h
> +++ b/src/evdev-tablet.h
> @@ -34,7 +34,8 @@ enum tablet_status {
>       TABLET_TOOL_LEAVING_PROXIMITY = 1 << 2,
>       TABLET_BUTTONS_PRESSED = 1 << 3,
>       TABLET_BUTTONS_RELEASED = 1 << 4,
> -     TABLET_STYLUS_IN_CONTACT = 1 << 5
> +     TABLET_STYLUS_IN_CONTACT = 1 << 5,
> +     TABLET_TOOL_LEFT_PROXIMITY = 1 << 6
>  };
>  
>  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