This is a workaround upstream suggests for use with kernel 4.1. Upstream-Status: Inappropriate [temporary work-around] Signed-Off-By: Jussi Kukkonen From: Peter Hutterer Date: Mon Aug 3 18:23:12 PDT 2015 Subject: [PATCH v3 libinput] touchpad: serial synaptics need to fake new touches on TRIPLETAP On the 4.1 kernels synaptics pretends to have 3 slots (the serial fw only does 2). This was added to avoid cursor jumps but has since been reverted for 4.2 (kernel commit dbf3c37086, 4.1.3 is still buggy). In some cases a TRIPLETAP may be triggered without slot 2 ever activating. While there are still those kernels out there, work around this bug by opening a new touch point where none exists if the fake finger count exceeds the slot count. Reported-by: Jan Alexander Steffens Signed-off-by: Peter Hutterer Tested-by: Jan Alexander Steffens Reviewed-by: Hans de Goede --- Changes to v2: - split out the handling instead of having a tmp state variable, see Hans' comments from v2 Mainly sending this to the list again so I have a link to point people to. If you're on 4.1.x add this patch to your distribution package. src/evdev-mt-touchpad.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index a683d9a..5ef03d5 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -369,13 +369,23 @@ tp_restore_synaptics_touches(struct tp_dispatch *tp, for (i = 0; i < tp->num_slots; i++) { struct tp_touch *t = tp_get_touch(tp, i); - if (t->state != TOUCH_END) + switch(t->state) { + case TOUCH_HOVERING: + case TOUCH_BEGIN: + case TOUCH_UPDATE: continue; - - /* new touch, move it through begin to update immediately */ - tp_new_touch(tp, t, time); - tp_begin_touch(tp, t, time); - t->state = TOUCH_UPDATE; + case TOUCH_NONE: + /* new touch, move it through to begin immediately */ + tp_new_touch(tp, t, time); + tp_begin_touch(tp, t, time); + break; + case TOUCH_END: + /* touch just ended ,we need need to restore it to update */ + tp_new_touch(tp, t, time); + tp_begin_touch(tp, t, time); + t->state = TOUCH_UPDATE; + break; + } } } -- 2.4.3