Commit cd5af1a4 authored by Peter Hutterer's avatar Peter Hutterer

touchpad: only reduce the slot count for ALPS serial touchpads

We're getting too many regressions on other devices for this feature and only
ALPS touchpads need it (it's a kernel driver bug). So let's limit this to
those devices only.

For example, synaptics serial touchpads don't keep the fake fingers and slot
states in sync when going from two to three fingers, causing an erroneous slot
downgrade. See
#434 (comment 419912)
That interferes with this code but fixing it is hard and anyway,
synaptics touchpads don't need the slot count drop.
Signed-off-by: Peter Hutterer's avatarPeter Hutterer <peter.hutterer@who-t.net>
parent c7f06b0b
Pipeline #115955 passed with stages
in 23 minutes and 6 seconds
......@@ -645,12 +645,14 @@ tp_process_fake_touches(struct tp_dispatch *tp,
EVDEV_MODEL_SYNAPTICS_SERIAL_TOUCHPAD)
tp_restore_synaptics_touches(tp, time);
/* ALPS touchpads always set 3 slots in the kernel, even
/* ALPS serial touchpads always set 3 slots in the kernel, even
* where they support less than that. So we get BTN_TOOL_TRIPLETAP
* but never slot 2 because our slot count is wrong.
* This also means that the third touch falls through the cracks and
* is ignored.
*
* See https://gitlab.freedesktop.org/libinput/libinput/issues/408
*
* All touchpad devices have at least one slot so we only do this
* for 2 touches or higher.
*
......@@ -665,7 +667,8 @@ tp_process_fake_touches(struct tp_dispatch *tp,
* For a long explanation of what happens, see
* https://gitlab.freedesktop.org/libevdev/libevdev/merge_requests/19
*/
if (nfake_touches > 1 && tp->has_mt &&
if (tp->device->model_flags & EVDEV_MODEL_ALPS_SERIAL_TOUCHPAD &&
nfake_touches > 1 && tp->has_mt &&
tp->nactive_slots > 0 &&
nfake_touches > tp->nactive_slots &&
tp->nactive_slots < tp->num_slots) {
......
......@@ -1384,6 +1384,7 @@ evdev_read_model_flags(struct evdev_device *device)
#define MODEL(name) { QUIRK_MODEL_##name, EVDEV_MODEL_##name }
MODEL(WACOM_TOUCHPAD),
MODEL(SYNAPTICS_SERIAL_TOUCHPAD),
MODEL(ALPS_SERIAL_TOUCHPAD),
MODEL(LENOVO_T450_TOUCHPAD),
MODEL(TRACKBALL),
MODEL(APPLE_TOUCHPAD_ONEBUTTON),
......
......@@ -108,6 +108,7 @@ enum evdev_device_model {
EVDEV_MODEL_DEFAULT = 0,
EVDEV_MODEL_WACOM_TOUCHPAD = bit(1),
EVDEV_MODEL_SYNAPTICS_SERIAL_TOUCHPAD = bit(2),
EVDEV_MODEL_ALPS_SERIAL_TOUCHPAD = bit(3),
EVDEV_MODEL_LENOVO_T450_TOUCHPAD = bit(4),
EVDEV_MODEL_APPLE_TOUCHPAD_ONEBUTTON = bit(5),
EVDEV_MODEL_LENOVO_SCROLLPOINT = bit(6),
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment