[PATCH libinput] touchpad: add a quirk for the HP Pavilion dm4

Hans de Goede hdegoede at redhat.com
Tue Nov 29 09:11:06 UTC 2016


Hi,

On 29-11-16 04:48, Peter Hutterer wrote:
> On Mon, Nov 28, 2016 at 03:33:25PM +0100, Hans de Goede wrote:
>> Hi,
>>
>> On 27-11-16 23:55, Peter Hutterer wrote:
>>> This touchpad has cursor jumps for 2-finger scrolling that also affects the
>>> single-finger emulation. So disable any multitouch bits on this device and
>>> disallow the 2-finger scroll method. This still allows for 2-finger
>>> tapping/clicking.
>>>
>>> https://bugs.freedesktop.org/show_bug.cgi?id=91135
>>>
>>> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
>>
>> This sounds a lot like what we're doing for semi-mt devices,
>> but then with completely different code-paths. AFAICT we still
>> allow BTN_TOOL_DOUBLETAP, etc. for semi-mt, so why not use
>> the same method.
>>
>> To be specific I'm talking about the "if (tp->semi_mt) { ... }"
>> block with the large comment above it in tp_init_slots(), to me
>> it sounds like you want to change that to:
>>
>> 	if (tp->semi_mit ||
>> 	    (tp->device->model_flags & EVDEV_MODEL_HP_PAVILION_DM4_TOUCHPAD)) {
>> 		...
>> 	}
>>
>> Rather then come up with a second approach to only listen to the
>> non-mt coordinates.
>
> right, with the semi-mt we do a similar-ish thing but we still allow
> two-finger scrolling based on the single position + BTN_TOOL_DOUBLETAP. In
> this case the touchpad data is garbage as soon as two fingers are down, even
> the single-touch emulation is useless. So it's not quite the same category
> as semi-mts which can still be ok for 2fg scrolling. And since it's garbage
> anyway, we might as well disable all MT axes.

I see, so that would require keeping this hunk of your original patch:

>>> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
>>> index d72cb19..beb19cd 100644
>>> --- a/src/evdev-mt-touchpad.c
>>> +++ b/src/evdev-mt-touchpad.c
>>> @@ -1909,6 +1909,12 @@ tp_scroll_get_methods(struct tp_dispatch *tp)
>>>  {
>>>  	uint32_t methods = LIBINPUT_CONFIG_SCROLL_EDGE;
>>>
>>> +	/* Any movement with more than one finger has random cursor
>>> +	 * jumps. Don't allow for 2fg scrolling on this device, see
>>> +	 * fdo bug 91135 */
>>> +	if (tp->device->model_flags & EVDEV_MODEL_HP_PAVILION_DM4_TOUCHPAD)
>>> +		return LIBINPUT_CONFIG_SCROLL_EDGE;
>>> +
>>>  	if (tp->ntouches >= 2)
>>>  		methods |= LIBINPUT_CONFIG_SCROLL_2FG;
>>>

But my above suggestion could still replace this hunk, which to me really
feels like doing the same as the semi-mt handling but then in a more
complicated way and having 2 code paths doing the same thing in a
different way feels wrong:

>>> diff --git a/src/evdev.c b/src/evdev.c
>>> index fac8fcb..eb4c0d0 100644
>>> --- a/src/evdev.c
>>> +++ b/src/evdev.c
>>> @@ -2762,6 +2763,17 @@ evdev_pre_configure_model_quirks(struct evdev_device *device)
>>>  	if (device->model_flags & EVDEV_MODEL_HP_STREAM11_TOUCHPAD)
>>>  		libevdev_enable_property(device->evdev,
>>>  					 INPUT_PROP_BUTTONPAD);
>>> +
>>> +	/* Touchpad has random jumps in slots, including for single-finger
>>> +	 * movement. See fdo bug 91135 */
>>> +	if (device->model_flags & EVDEV_MODEL_HP_PAVILION_DM4_TOUCHPAD) {
>>> +		unsigned int code;
>>> +
>>> +		for (code = ABS_MT_SLOT; code <= ABS_MT_TRACKING_ID; code++)
>>> +			libevdev_disable_event_code(device->evdev,
>>> +						    EV_ABS,
>>> +						    code);
>>> +	}
>>>  }
>>>
>>>  struct evdev_device *

Regards,

Hans


More information about the wayland-devel mailing list