[PATCH libinput 17/24] tablet: Emit axis events on distance/pressure changes

Peter Hutterer peter.hutterer at who-t.net
Sun Apr 27 22:07:46 PDT 2014


On Mon, Apr 21, 2014 at 07:11:26PM +0200, Carlos Garnacho wrote:
> Those have been made mutually exclusive, to make sure only one or the
> other is notified when there is some uncertainty from the device.
> 
> Signed-off-by: Carlos Garnacho <carlosg at gnome.org>
> ---
>  src/evdev-tablet.c | 29 +++++++++++++++++++++++++++++
>  1 file changed, 29 insertions(+)
> 
> diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
> index cc55c74..1054f5a 100644
> --- a/src/evdev-tablet.c
> +++ b/src/evdev-tablet.c
> @@ -216,6 +216,23 @@ tablet_process_misc(struct tablet_dispatch *tablet,
>  }
>  
>  static void
> +sanitize_tablet_axes(struct tablet_dispatch *tablet)
> +{
> +	struct axis_info *distance, *pressure;
> +
> +	distance = tablet_get_axis(tablet, ABS_DISTANCE);
> +	pressure = tablet_get_axis(tablet, ABS_PRESSURE);
> +
> +	if (distance && pressure && distance->updated && pressure->updated) {
> +		/* Keep distance and pressure mutually exclusive */
> +		distance->updated = 0;
> +	} else if (pressure && pressure->updated &&
> +		   !tablet_has_status(tablet, TABLET_HAS_CONTACT)) {
> +		pressure->updated = 0;
> +	}

what about an event where you go to distance 0 and pressure N in the same
SYN_REPORT? You need to check for != 0 on both axes, not just whether they
got updated.

Cheers,
   Peter

> +}
> +
> +static void
>  tablet_check_notify_tool(struct tablet_dispatch *tablet,
>  			 struct evdev_device *device,
>  			 uint32_t time,
> @@ -360,6 +377,8 @@ tablet_flush(struct tablet_dispatch *tablet,
>  	tablet_notify_buttons(tablet, device, time, 0);
>  
>  	if (tablet->state.tool != LIBINPUT_TOOL_NONE) {
> +		sanitize_tablet_axes(tablet);
> +
>  		if (tablet_has_status(tablet, TABLET_UPDATED)) {
>  			/* FIXME: apply hysteresis, calibration */
>  			x = li_fixed_from_int(device->abs.x);
> @@ -426,6 +445,16 @@ static void
>  tablet_init_axes(struct tablet_dispatch *tablet,
>  		 struct evdev_device *device)
>  {
> +	if (libevdev_has_event_code(device->evdev, EV_ABS, ABS_DISTANCE)) {
> +		tablet_add_axis(tablet, device, ABS_DISTANCE,
> +				LIBINPUT_POINTER_AXIS_DISTANCE);
> +	}
> +
> +	if (libevdev_has_event_code(device->evdev, EV_ABS, ABS_PRESSURE)) {
> +		tablet_add_axis(tablet, device, ABS_PRESSURE,
> +				LIBINPUT_POINTER_AXIS_PRESSURE);
> +	}
> +
>  	if (libevdev_has_event_code(device->evdev, EV_ABS, ABS_TILT_X) &&
>  	    libevdev_has_event_code(device->evdev, EV_ABS, ABS_TILT_Y)) {
>  		tablet_add_axis(tablet, device, ABS_TILT_X,
> -- 
> 1.9.0
> 
> _______________________________________________
> 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