Peter Hutterer 6af3f58
From 253f8e4152b6c36b87756bb23b16512c3abf7cb8 Mon Sep 17 00:00:00 2001
Peter Hutterer 6af3f58
From: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer 6af3f58
Date: Fri, 24 Jul 2015 11:13:41 +1000
Peter Hutterer 6af3f58
Subject: [PATCH libinput] touchpad: serial synaptics need to fake new touches
Peter Hutterer 6af3f58
 on TRIPLETAP
Peter Hutterer 6af3f58
Peter Hutterer 6af3f58
On the 4.1 kernels synaptics pretends to have 3 slots (the serial fw only does
Peter Hutterer 6af3f58
2). This was added to avoid cursor jumps but has since been reverted for 4.2
Peter Hutterer 6af3f58
(kernel commit dbf3c37086, 4.1.3 is still buggy). In some cases a TRIPLETAP
Peter Hutterer 6af3f58
may be triggered without slot 2 ever activating.
Peter Hutterer 6af3f58
Peter Hutterer 6af3f58
While there are still those kernels out there, work around this bug by opening
Peter Hutterer 6af3f58
a new touch point where none exists if the fake finger count exceeds the slot
Peter Hutterer 6af3f58
count.
Peter Hutterer 6af3f58
Peter Hutterer 6af3f58
Reported-by: Jan Alexander Steffens <jan.steffens@gmail.com>
Peter Hutterer 6af3f58
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer 6af3f58
Tested-by: Jan Alexander Steffens <jan.steffens@gmail.com>
Peter Hutterer 6af3f58
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Peter Hutterer 6af3f58
---
Peter Hutterer 6af3f58
 src/evdev-mt-touchpad.c | 22 ++++++++++++++++------
Peter Hutterer 6af3f58
 1 file changed, 16 insertions(+), 6 deletions(-)
Peter Hutterer 6af3f58
Peter Hutterer 6af3f58
diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
Peter Hutterer 6af3f58
index a683d9a..5ef03d5 100644
Peter Hutterer 6af3f58
--- a/src/evdev-mt-touchpad.c
Peter Hutterer 6af3f58
+++ b/src/evdev-mt-touchpad.c
Peter Hutterer 6af3f58
@@ -369,13 +369,23 @@ tp_restore_synaptics_touches(struct tp_dispatch *tp,
Peter Hutterer 6af3f58
 	for (i = 0; i < tp->num_slots; i++) {
Peter Hutterer 6af3f58
 		struct tp_touch *t = tp_get_touch(tp, i);
Peter Hutterer 6af3f58
 
Peter Hutterer 6af3f58
-		if (t->state != TOUCH_END)
Peter Hutterer 6af3f58
+		switch(t->state) {
Peter Hutterer 6af3f58
+		case TOUCH_HOVERING:
Peter Hutterer 6af3f58
+		case TOUCH_BEGIN:
Peter Hutterer 6af3f58
+		case TOUCH_UPDATE:
Peter Hutterer 6af3f58
 			continue;
Peter Hutterer 6af3f58
-
Peter Hutterer 6af3f58
-		/* new touch, move it through begin to update immediately */
Peter Hutterer 6af3f58
-		tp_new_touch(tp, t, time);
Peter Hutterer 6af3f58
-		tp_begin_touch(tp, t, time);
Peter Hutterer 6af3f58
-		t->state = TOUCH_UPDATE;
Peter Hutterer 6af3f58
+		case TOUCH_NONE:
Peter Hutterer 6af3f58
+			/* new touch, move it through to begin immediately */
Peter Hutterer 6af3f58
+			tp_new_touch(tp, t, time);
Peter Hutterer 6af3f58
+			tp_begin_touch(tp, t, time);
Peter Hutterer 6af3f58
+			break;
Peter Hutterer 6af3f58
+		case TOUCH_END:
Peter Hutterer 6af3f58
+			/* touch just ended ,we need need to restore it to update */
Peter Hutterer 6af3f58
+			tp_new_touch(tp, t, time);
Peter Hutterer 6af3f58
+			tp_begin_touch(tp, t, time);
Peter Hutterer 6af3f58
+			t->state = TOUCH_UPDATE;
Peter Hutterer 6af3f58
+			break;
Peter Hutterer 6af3f58
+		}
Peter Hutterer 6af3f58
 	}
Peter Hutterer 6af3f58
 }
Peter Hutterer 6af3f58
 
Peter Hutterer 6af3f58
-- 
Peter Hutterer 6af3f58
2.4.3
Peter Hutterer 6af3f58