[PATCH libinput] touchpad: disable MT for elantech semi-mt touchpads

Benjamin Tissoires btissoir at redhat.com
Wed Jan 13 06:01:22 PST 2016


Hi Hans,

On Jan 13 2016 or thereabouts, Hans de Goede wrote:
> Hi,
> 
> On 13-01-16 05:09, Peter Hutterer wrote:
> >When three fingers are set down on the touchpad, one finger tends to get a 0/0
> >coordinate, triggering palm detection in the upper left corner. Handle this
> >like the jumping semi-mt touchpads and disable MT handling and instead
> >just rely on the x/y axis and the BTN_TOOL_* events.
> >
> >https://bugs.freedesktop.org/show_bug.cgi?id=93583
> >
> >This kernel patch is required:
> >https://lkml.org/lkml/2016/1/11/171
> >
> >Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> 
> Patch looks good to me:
> 
> Reviewed-by: Hans de Goede <hdegoede at redhat.com>
> 
> About Benjamin's patch:
> 
> https://lkml.org/lkml/2016/1/11/171
> 
> Benjamin, when you pass in INPUT_MT_SEMI_MT, you can drop the:
> 
> 	__set_bit(INPUT_PROP_SEMI_MT, dev->propbit);
> 
> A few lines up, since input_mt_init_slots will do that now.

Oops, I missed that. I focused only on the v3 and missed that v2 already
had the bit set :)

> 
> More in general the elantech driver could do with some cleanup
> to fully use the input_mt helpers, specifically stop doing
> pointer emulation itself for v2 and v3 touchpads:
> - pass in INPUT_MT_POINTER to input_mt_init_slots and stop initializing
>   ABS_X / ABS_Y and move input_mt_init_slots to after setting up the MT
>   axis (this applies to v4 too)
> - Stop reporting BTN_TOUCH / ABS_X / ABSY in diy style instead just call
>   input_mt_frame_sync before input_sync
> - Replace:
>         input_report_key(dev, BTN_TOOL_FINGER, fingers == 1);
>         input_report_key(dev, BTN_TOOL_DOUBLETAP, fingers == 2);
>         input_report_key(dev, BTN_TOOL_TRIPLETAP, fingers == 3);
>         input_report_key(dev, BTN_TOOL_QUADTAP, fingers == 4);
>   With:
> 	input_mt_report_finger_count(dev, fingers);
> - And for v4 touchpads replace:
> 	input_mt_report_pointer_emulation(dev, true);
>   With:
>         input_mt_frame_sync(dev);
>   Which ends up doing the same, but is the right way to use the
>   input_mt helpers
> 

Ack. I made those changes and was able to "test" on the recording the
user gave us for v3. I am not able to test (yet) on the v4 series as I
need to borrow my wife's laptop.

The only concern I have with this cleanup is that the touchpad has its
own handling of pressure and width, and it has to stay here otherwise I
might change too many bits in the current driver to blindly test and
send the patch.

Cheers,
Benjamin

> Regards,
> 
> Hans
> 
> 
> 
> 
> 
> 
> 
> >---
> >  src/evdev-mt-touchpad.c | 3 ++-
> >  1 file changed, 2 insertions(+), 1 deletion(-)
> >
> >diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
> >index 2de2539..f91f839 100644
> >--- a/src/evdev-mt-touchpad.c
> >+++ b/src/evdev-mt-touchpad.c
> >@@ -1496,7 +1496,8 @@ tp_init_slots(struct tp_dispatch *tp,
> >  	 * explanation.
> >  	 */
> >  	if (tp->semi_mt &&
> >-	    (device->model_flags & EVDEV_MODEL_JUMPING_SEMI_MT)) {
> >+	    (device->model_flags &
> >+	     (EVDEV_MODEL_JUMPING_SEMI_MT|EVDEV_MODEL_ELANTECH_TOUCHPAD))) {
> >  		tp->num_slots = 1;
> >  		tp->slot = 0;
> >  		tp->has_mt = false;
> >


More information about the wayland-devel mailing list