diff --git a/0001-evdev-add-a-quirk-to-disable-debouncing-on-the-MS-Na.patch b/0001-evdev-add-a-quirk-to-disable-debouncing-on-the-MS-Na.patch new file mode 100644 index 0000000..ff26a07 --- /dev/null +++ b/0001-evdev-add-a-quirk-to-disable-debouncing-on-the-MS-Na.patch @@ -0,0 +1,211 @@ +From 3c84788c376a50c0e3453855712d764f02494f17 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Wed, 31 Jan 2018 16:18:15 +1000 +Subject: [PATCH libinput] evdev: add a quirk to disable debouncing on the MS + Nano Transcievers + +A set of wireless devices that can scramble the timestamps, so we get +press/release within 8ms even though I doubt the user is capable of doing +this. Since they're generally good quality anyway, let's just disable +debouncing on those until someone complains and we need something more +sophisticated. + +https://bugs.freedesktop.org/show_bug.cgi?id=104415 + +Signed-off-by: Peter Hutterer +--- + meson.build | 1 + src/evdev-debounce.c | 38 ++++++++++++++++++++++++++++++++++++- + src/evdev-fallback.h | 2 + + src/evdev.c | 1 + src/evdev.h | 1 + test/litest.h | 3 ++ + test/test-pointer.c | 14 ++++++------- + udev/90-libinput-model-quirks.hwdb | 4 +++ + 8 files changed, 56 insertions(+), 8 deletions(-) + +Index: libinput-1.9.4/meson.build +=================================================================== +--- libinput-1.9.4.orig/meson.build ++++ libinput-1.9.4/meson.build +@@ -561,6 +561,7 @@ if get_option('tests') + 'test/litest-device-mouse-low-dpi.c', + 'test/litest-device-mouse-wheel-click-angle.c', + 'test/litest-device-mouse-wheel-click-count.c', ++ 'test/litest-device-ms-nano-transceiver-mouse.c', + 'test/litest-device-ms-surface-cover.c', + 'test/litest-device-protocol-a-touch-screen.c', + 'test/litest-device-qemu-usb-tablet.c', +Index: libinput-1.9.4/src/evdev-debounce.c +=================================================================== +--- libinput-1.9.4.orig/src/evdev-debounce.c ++++ libinput-1.9.4/src/evdev-debounce.c +@@ -83,6 +83,7 @@ debounce_state_to_str(enum debounce_stat + CASE_RETURN_STRING(DEBOUNCE_STATE_MAYBE_SPURIOUS); + CASE_RETURN_STRING(DEBOUNCE_STATE_RELEASED); + CASE_RETURN_STRING(DEBOUNCE_STATE_PRESS_PENDING); ++ CASE_RETURN_STRING(DEBOUNCE_STATE_DISABLED); + } + + return NULL; +@@ -395,6 +396,31 @@ debounce_press_pending_event(struct fall + } + + static void ++debounce_disabled_event(struct fallback_dispatch *fallback, ++ enum debounce_event event, ++ uint64_t time) ++{ ++ switch (event) { ++ case DEBOUNCE_EVENT_PRESS: ++ fallback->debounce.button_time = time; ++ debounce_notify_button(fallback, ++ LIBINPUT_BUTTON_STATE_PRESSED); ++ break; ++ case DEBOUNCE_EVENT_RELEASE: ++ fallback->debounce.button_time = time; ++ debounce_notify_button(fallback, ++ LIBINPUT_BUTTON_STATE_RELEASED); ++ break; ++ case DEBOUNCE_EVENT_TIMEOUT_SHORT: ++ case DEBOUNCE_EVENT_TIMEOUT: ++ log_debounce_bug(fallback, event); ++ break; ++ case DEBOUNCE_EVENT_OTHERBUTTON: ++ break; ++ } ++} ++ ++static void + debounce_handle_event(struct fallback_dispatch *fallback, + enum debounce_event event, + uint64_t time) +@@ -434,6 +460,9 @@ debounce_handle_event(struct fallback_di + case DEBOUNCE_STATE_PRESS_PENDING: + debounce_press_pending_event(fallback, event, time); + break; ++ case DEBOUNCE_STATE_DISABLED: ++ debounce_disabled_event(fallback, event, time); ++ break; + } + + evdev_log_debug(fallback->device, +@@ -484,7 +513,8 @@ fallback_debounce_handle_state(struct fa + for (size_t i = 0; i < nchanged; i++) { + bool is_down = hw_is_key_down(dispatch, changed[i]); + +- if (flushed) { ++ if (flushed && ++ dispatch->debounce.state != DEBOUNCE_STATE_DISABLED) { + debounce_set_state(dispatch, + !is_down ? + DEBOUNCE_STATE_IS_DOWN : +@@ -538,6 +568,12 @@ fallback_init_debounce(struct fallback_d + struct evdev_device *device = dispatch->device; + char timer_name[64]; + ++ if (device->model_flags & EVDEV_MODEL_MS_NANO_TRANSCEIVER) { ++ dispatch->debounce.state = DEBOUNCE_STATE_DISABLED; ++ return; ++ } ++ ++ + dispatch->debounce.state = DEBOUNCE_STATE_IS_UP; + + snprintf(timer_name, +Index: libinput-1.9.4/src/evdev-fallback.h +=================================================================== +--- libinput-1.9.4.orig/src/evdev-fallback.h ++++ libinput-1.9.4/src/evdev-fallback.h +@@ -41,6 +41,8 @@ enum debounce_state { + DEBOUNCE_STATE_MAYBE_SPURIOUS, + DEBOUNCE_STATE_RELEASED, + DEBOUNCE_STATE_PRESS_PENDING, ++ ++ DEBOUNCE_STATE_DISABLED = 999, + }; + + struct fallback_dispatch { +Index: libinput-1.9.4/src/evdev.c +=================================================================== +--- libinput-1.9.4.orig/src/evdev.c ++++ libinput-1.9.4/src/evdev.c +@@ -1237,6 +1237,7 @@ evdev_read_model_flags(struct evdev_devi + MODEL(APPLE_TOUCHPAD_ONEBUTTON), + MODEL(LOGITECH_MARBLE_MOUSE), + MODEL(TABLET_NO_PROXIMITY_OUT), ++ MODEL(MS_NANO_TRANSCEIVER), + #undef MODEL + { "ID_INPUT_TRACKBALL", EVDEV_MODEL_TRACKBALL }, + { NULL, EVDEV_MODEL_DEFAULT }, +Index: libinput-1.9.4/src/evdev.h +=================================================================== +--- libinput-1.9.4.orig/src/evdev.h ++++ libinput-1.9.4/src/evdev.h +@@ -123,6 +123,7 @@ enum evdev_device_model { + EVDEV_MODEL_APPLE_TOUCHPAD_ONEBUTTON = (1 << 25), + EVDEV_MODEL_LOGITECH_MARBLE_MOUSE = (1 << 26), + EVDEV_MODEL_TABLET_NO_PROXIMITY_OUT = (1 << 27), ++ EVDEV_MODEL_MS_NANO_TRANSCEIVER = (1 << 28), + }; + + enum evdev_button_scroll_state { +Index: libinput-1.9.4/test/litest.h +=================================================================== +--- libinput-1.9.4.orig/test/litest.h ++++ libinput-1.9.4/test/litest.h +@@ -268,6 +268,8 @@ enum litest_device_type { + LITEST_WACOM_BAMBOO_2FG_PAD, + LITEST_WACOM_BAMBOO_2FG_PEN, + LITEST_WACOM_BAMBOO_2FG_FINGER, ++ LITEST_HP_WMI_HOTKEYS, ++ LITEST_MS_NANO_TRANSCEIVER_MOUSE, + }; + + enum litest_device_feature { +@@ -301,6 +303,7 @@ enum litest_device_feature { + LITEST_LEDS = 1 << 25, + LITEST_SWITCH = 1 << 26, + LITEST_IGNORED = 1 << 27, ++ LITEST_NO_DEBOUNCE = 1 << 28, + }; + + /* this is a semi-mt device, so we keep track of the touches that the tests +Index: libinput-1.9.4/test/test-pointer.c +=================================================================== +--- libinput-1.9.4.orig/test/test-pointer.c ++++ libinput-1.9.4/test/test-pointer.c +@@ -2602,11 +2602,11 @@ litest_setup_tests_pointer(void) + + litest_add("pointer:time", pointer_time_usec, LITEST_RELATIVE, LITEST_ANY); + +- litest_add_ranged("pointer:debounce", debounce_bounce, LITEST_BUTTON, LITEST_TOUCHPAD, &buttons); +- litest_add("pointer:debounce", debounce_bounce_check_immediate, LITEST_BUTTON, LITEST_TOUCHPAD); +- litest_add_ranged("pointer:debounce", debounce_spurious, LITEST_BUTTON, LITEST_TOUCHPAD, &buttons); +- litest_add("pointer:debounce", debounce_spurious_multibounce, LITEST_BUTTON, LITEST_TOUCHPAD); +- litest_add("pointer:debounce_otherbutton", debounce_spurious_dont_enable_on_otherbutton, LITEST_BUTTON, LITEST_TOUCHPAD); +- litest_add("pointer:debounce_otherbutton", debounce_spurious_cancel_debounce_otherbutton, LITEST_BUTTON, LITEST_TOUCHPAD); +- litest_add("pointer:debounce_otherbutton", debounce_spurious_switch_to_otherbutton, LITEST_BUTTON, LITEST_TOUCHPAD); ++ litest_add_ranged("pointer:debounce", debounce_bounce, LITEST_BUTTON, LITEST_TOUCHPAD|LITEST_NO_DEBOUNCE, &buttons); ++ litest_add("pointer:debounce", debounce_bounce_check_immediate, LITEST_BUTTON, LITEST_TOUCHPAD|LITEST_NO_DEBOUNCE); ++ litest_add_ranged("pointer:debounce", debounce_spurious, LITEST_BUTTON, LITEST_TOUCHPAD|LITEST_NO_DEBOUNCE, &buttons); ++ litest_add("pointer:debounce", debounce_spurious_multibounce, LITEST_BUTTON, LITEST_TOUCHPAD|LITEST_NO_DEBOUNCE); ++ litest_add("pointer:debounce_otherbutton", debounce_spurious_dont_enable_on_otherbutton, LITEST_BUTTON, LITEST_TOUCHPAD|LITEST_NO_DEBOUNCE); ++ litest_add("pointer:debounce_otherbutton", debounce_spurious_cancel_debounce_otherbutton, LITEST_BUTTON, LITEST_TOUCHPAD|LITEST_NO_DEBOUNCE); ++ litest_add("pointer:debounce_otherbutton", debounce_spurious_switch_to_otherbutton, LITEST_BUTTON, LITEST_TOUCHPAD|LITEST_NO_DEBOUNCE); + } +Index: libinput-1.9.4/udev/90-libinput-model-quirks.hwdb +=================================================================== +--- libinput-1.9.4.orig/udev/90-libinput-model-quirks.hwdb ++++ libinput-1.9.4/udev/90-libinput-model-quirks.hwdb +@@ -225,6 +225,10 @@ libinput:name:*Lid Switch*:dmi:*svnMicro + libinput:name:*Microsoft Surface Type Cover Keyboard*:dmi:*svnMicrosoftCorporation:pnSurface3:* + LIBINPUT_ATTR_KEYBOARD_INTEGRATION=internal + ++# Microsoft Microsoft® Nano Transceiver v2.0" ++libinput:mouse:input:b0003v045Ep0800* ++ LIBINPUT_MODEL_MS_NANO_TRANSCEIVER=1 ++ + ########################################## + # Razer + ########################################## diff --git a/libinput.changes b/libinput.changes index 8af07f6..dde398f 100644 --- a/libinput.changes +++ b/libinput.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Thu Feb 8 00:02:32 UTC 2018 - jengelh@inai.de + +- Add 0001-evdev-add-a-quirk-to-disable-debouncing-on-the-MS-Na.patch + ------------------------------------------------------------------- Thu Dec 14 08:33:23 UTC 2017 - jengelh@inai.de diff --git a/libinput.spec b/libinput.spec index 8031a73..91942d6 100644 --- a/libinput.spec +++ b/libinput.spec @@ -1,7 +1,7 @@ # # spec file for package libinput # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -34,6 +34,7 @@ Source3: baselibs.conf Source4: %name.keyring Source5: libinput-rpmlintrc Patch1: kill-env.diff +Patch2: 0001-evdev-add-a-quirk-to-disable-debouncing-on-the-MS-Na.patch BuildRequires: doxygen BuildRequires: fdupes BuildRequires: gcc-c++