[PATCH libinput] touchpad: always enable palm detection on apple touchpads

Hans de Goede hdegoede at redhat.com
Mon Jul 21 01:00:26 PDT 2014


Hi,

On 07/21/2014 08:31 AM, Peter Hutterer wrote:
> They don't set resolution so we can't calculate the size but we know they're
> big enough to need palm detection.
> 
> And fix the descriptor for the bcm5974. For some reason this was advertising
> synaptics coordinates. Fix it to represent (one of) the apple touchpads.
> 
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

Looks good:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans

> ---
> Should really be two separate patches, but the broken descriptors causes the
> tests to break otherwise.
> 
>  src/evdev-mt-touchpad-buttons.c |  2 +-
>  src/evdev-mt-touchpad.c         | 19 +++++++++++--------
>  src/evdev-mt-touchpad.h         |  2 ++
>  test/litest-bcm5974.c           | 19 ++++++++++++-------
>  test/touchpad.c                 |  3 +++
>  5 files changed, 29 insertions(+), 16 deletions(-)
> 
> diff --git a/src/evdev-mt-touchpad-buttons.c b/src/evdev-mt-touchpad-buttons.c
> index bd3c0e2..fe33d0b 100644
> --- a/src/evdev-mt-touchpad-buttons.c
> +++ b/src/evdev-mt-touchpad-buttons.c
> @@ -521,7 +521,7 @@ tp_init_buttons(struct tp_dispatch *tp,
>  
>  	tp->buttons.motion_dist = diagonal * DEFAULT_BUTTON_MOTION_THRESHOLD;
>  
> -	if (libevdev_get_id_vendor(device->evdev) == 0x5ac) /* Apple */
> +	if (libevdev_get_id_vendor(device->evdev) == VENDOR_ID_APPLE)
>  		tp->buttons.use_clickfinger = true;
>  
>  	if (tp->buttons.is_clickpad && !tp->buttons.use_clickfinger) {
> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
> index 5db204f..0755f2c 100644
> --- a/src/evdev-mt-touchpad.c
> +++ b/src/evdev-mt-touchpad.c
> @@ -757,17 +757,20 @@ tp_init_palmdetect(struct tp_dispatch *tp,
>  	tp->palm.right_edge = INT_MAX;
>  	tp->palm.left_edge = INT_MIN;
>  
> -	/* We don't know how big the touchpad is */
> -	if (device->abs.absinfo_x->resolution == 1)
> -		return 0;
> -
>  	width = abs(device->abs.absinfo_x->maximum -
>  		    device->abs.absinfo_x->minimum);
>  
> -	/* Enable palm detection on touchpads >= 80 mm. Anything smaller
> -	   probably won't need it, until we find out it does */
> -	if (width/device->abs.absinfo_x->resolution < 80)
> -		return 0;
> +	/* Apple touchpads are always big enough to warrant palm detection */
> +	if (evdev_device_get_id_vendor(device) != VENDOR_ID_APPLE) {
> +		/* We don't know how big the touchpad is */
> +		if (device->abs.absinfo_x->resolution == 1)
> +			return 0;
> +
> +		/* Enable palm detection on touchpads >= 80 mm. Anything smaller
> +		   probably won't need it, until we find out it does */
> +		if (width/device->abs.absinfo_x->resolution < 80)
> +			return 0;
> +	}
>  
>  	/* palm edges are 5% of the width on each side */
>  	tp->palm.right_edge = device->abs.absinfo_x->maximum - width * 0.05;
> diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
> index 4779120..192c401 100644
> --- a/src/evdev-mt-touchpad.h
> +++ b/src/evdev-mt-touchpad.h
> @@ -33,6 +33,8 @@
>  #define TOUCHPAD_HISTORY_LENGTH 4
>  #define TOUCHPAD_MIN_SAMPLES 4
>  
> +#define VENDOR_ID_APPLE 0x5ac
> +
>  enum touchpad_event {
>  	TOUCHPAD_EVENT_NONE		= 0,
>  	TOUCHPAD_EVENT_MOTION		= (1 << 0),
> diff --git a/test/litest-bcm5974.c b/test/litest-bcm5974.c
> index 10a9eb4..c7bd857 100644
> --- a/test/litest-bcm5974.c
> +++ b/test/litest-bcm5974.c
> @@ -65,13 +65,18 @@ static struct litest_device_interface interface = {
>  };
>  
>  static struct input_absinfo absinfo[] = {
> -	{ ABS_X, 1472, 5472, 0, 0, 75 },
> -	{ ABS_Y, 1408, 4448, 0, 0, 129 },
> -	{ ABS_PRESSURE, 0, 255, 0, 0, 0 },
> -	{ ABS_TOOL_WIDTH, 0, 15, 0, 0, 0 },
> -	{ ABS_MT_SLOT, 0, 1, 0, 0, 0 },
> -	{ ABS_MT_POSITION_X, 1472, 5472, 0, 0, 75 },
> -	{ ABS_MT_POSITION_Y, 1408, 4448, 0, 0, 129 },
> +	{ ABS_X, -4824, 4824, 0, 0, 0 },
> +	{ ABS_Y, -172, 4290, 0, 0, 0 },
> +	{ ABS_PRESSURE, 0, 256, 5, 0, 0 },
> +	{ ABS_TOOL_WIDTH, 0, 16, 0, 0, 0 },
> +	{ ABS_MT_SLOT, 0, 15, 0, 0, 0 },
> +	{ ABS_MT_POSITION_X, -4824, 4824, 17, 0, 0 },
> +	{ ABS_MT_POSITION_Y, -172, 4290, 17, 0, 0 },
> +	{ ABS_MT_ORIENTATION, -16384, 16384, 3276, 0, 0 },
> +	{ ABS_MT_TOUCH_MAJOR, 0, 2048, 81, 0, 0 },
> +	{ ABS_MT_TOUCH_MINOR, 0, 2048, 81, 0, 0 },
> +	{ ABS_MT_WIDTH_MAJOR, 0, 2048, 81, 0, 0 },
> +	{ ABS_MT_WIDTH_MINOR, 0, 2048, 81, 0, 0 },
>  	{ ABS_MT_TRACKING_ID, 0, 65535, 0, 0, 0 },
>  	{ ABS_MT_PRESSURE, 0, 255, 0, 0, 0 },
>  	{ .value = -1 },
> diff --git a/test/touchpad.c b/test/touchpad.c
> index 9b232bf..0de3cbb 100644
> --- a/test/touchpad.c
> +++ b/test/touchpad.c
> @@ -1247,6 +1247,9 @@ touchpad_has_palm_detect_size(struct litest_device *dev)
>  	double width, height;
>  	int rc;
>  
> +	if (libinput_device_get_id_vendor(dev->libinput_device) == 0x5ac) /* Apple */
> +		return 1;
> +
>  	rc = libinput_device_get_size(dev->libinput_device, &width, &height);
>  
>  	return rc == 0 && width >= 80;
> 


More information about the wayland-devel mailing list