diff --git a/quirks/50-system-lenovo.quirks b/quirks/50-system-lenovo.quirks index c4d369c1..19a3b9e5 100644 --- a/quirks/50-system-lenovo.quirks +++ b/quirks/50-system-lenovo.quirks @@ -136,6 +136,7 @@ AttrTrackpointMultiplier=1.25 MatchName=Synaptics TM3288-011 MatchDMIModalias=dmi:*svnLENOVO:*pvrThinkPadX1Carbon6th:* AttrEventCodeDisable=ABS_MT_TOOL_TYPE +ModelLenovoX1Gen6Touchpad=1 [Lenovo X41 Tablet] MatchName=AT Translated Set 2 keyboard diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index df745054..9bee7606 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -1499,6 +1499,13 @@ tp_detect_jumps(const struct tp_dispatch *tp, * were measured from */ unsigned int reference_interval = ms2us(12); + /* On some touchpads the firmware does funky stuff and we cannot + * have our own jump detection, e.g. Lenovo Carbon X1 Gen 6 (see + * issue #506) + */ + if (tp->jump.detection_disabled) + return false; + /* We haven't seen pointer jumps on Wacom tablets yet, so exclude * those. */ @@ -3628,6 +3635,14 @@ tp_init(struct tp_dispatch *tp, tp_init_gesture(tp); tp_init_thumb(tp); + /* Lenovo X1 Gen6 buffers the events in a weird way, making jump + * detection impossible. See + * https://gitlab.freedesktop.org/libinput/libinput/-/issues/506 + */ + if (evdev_device_has_model_quirk(device, + QUIRK_MODEL_LENOVO_X1GEN6_TOUCHPAD)) + tp->jump.detection_disabled = true; + device->seat_caps |= EVDEV_DEVICE_POINTER; if (tp->gesture.enabled) device->seat_caps |= EVDEV_DEVICE_GESTURE; diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h index 3a33a6a4..da569264 100644 --- a/src/evdev-mt-touchpad.h +++ b/src/evdev-mt-touchpad.h @@ -295,6 +295,7 @@ struct tp_dispatch { unsigned int fake_touches; struct { + bool detection_disabled; struct ratelimit warning; } jump; diff --git a/src/quirks.c b/src/quirks.c index 04b020f8..45d1f554 100644 --- a/src/quirks.c +++ b/src/quirks.c @@ -244,6 +244,7 @@ quirk_get_name(enum quirk q) case QUIRK_MODEL_LENOVO_T450_TOUCHPAD: return "ModelLenovoT450Touchpad"; case QUIRK_MODEL_LENOVO_T480S_TOUCHPAD: return "ModelLenovoT480sTouchpad"; case QUIRK_MODEL_LENOVO_T490S_TOUCHPAD: return "ModelLenovoT490sTouchpad"; + case QUIRK_MODEL_LENOVO_X1GEN6_TOUCHPAD: return "ModelLenovoX1Gen6Touchpad"; case QUIRK_MODEL_LENOVO_X230: return "ModelLenovoX230"; case QUIRK_MODEL_SYNAPTICS_SERIAL_TOUCHPAD: return "ModelSynapticsSerialTouchpad"; case QUIRK_MODEL_SYSTEM76_BONOBO: return "ModelSystem76Bonobo"; diff --git a/src/quirks.h b/src/quirks.h index 408236ee..ee85fe3b 100644 --- a/src/quirks.h +++ b/src/quirks.h @@ -77,6 +77,7 @@ enum quirk { QUIRK_MODEL_LENOVO_T450_TOUCHPAD, QUIRK_MODEL_LENOVO_T480S_TOUCHPAD, QUIRK_MODEL_LENOVO_T490S_TOUCHPAD, + QUIRK_MODEL_LENOVO_X1GEN6_TOUCHPAD, QUIRK_MODEL_LENOVO_X230, QUIRK_MODEL_SYNAPTICS_SERIAL_TOUCHPAD, QUIRK_MODEL_SYSTEM76_BONOBO,