2015-08-04 19:27:37 +02:00
|
|
|
From: Peter Hutterer <peter.hutterer@who-t.net>
|
|
|
|
References: http://lists.freedesktop.org/archives/wayland-devel/2015-August/023782.html
|
|
|
|
|
2015-08-04 19:19:30 +02:00
|
|
|
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 <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>
|
|
|
|
Reviewed-by: Hans de Goede <hdegoede at redhat.com>
|
|
|
|
---
|
|
|
|
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
|