[PATCH libinput] touchpad: serial synaptics need to fake new touches on TRIPLETAP

Peter Hutterer peter.hutterer at who-t.net
Thu Jul 23 19:54:17 PDT 2015


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.
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 <jan.steffens at gmail.com>
Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
Tested-by: Jan Alexander Steffens <jan.steffens at gmail.com>
---
 src/evdev-mt-touchpad.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 6718b61..376f394 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -368,13 +368,22 @@ 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 to begin immediately */
+		case TOUCH_NONE:
+		case TOUCH_END:
+			tp_new_touch(tp, t, time);
+			tp_begin_touch(tp, t, time);
+			break;
+		}
 
-		/* 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;
+		/* touch just ended ,we need need to restore it to update */
+		if (t->state == TOUCH_END)
+			t->state = TOUCH_UPDATE;
 	}
 }
 
-- 
2.4.3



More information about the wayland-devel mailing list