[PATCH libinput] evdev: add a quirk to disable debouncing on the MS Nano Transcievers

Peter Hutterer peter.hutterer at who-t.net
Thu Feb 1 07:38:08 UTC 2018


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 <peter.hutterer at who-t.net>
---
This is missing the svg bits for the state diagram, the mailing list
wouldn't like it...

 meson.build                        |  1 +
 src/evdev-debounce.c               | 38 +++++++++++++++++++++++++++++++++++++-
 src/evdev-fallback.h               |  2 ++
 src/evdev.c                        |  1 +
 src/evdev.h                        |  1 +
 test/litest.h                      |  2 ++
 test/test-pointer.c                | 14 +++++++-------
 udev/90-libinput-model-quirks.hwdb |  4 ++++
 8 files changed, 55 insertions(+), 8 deletions(-)

diff --git a/meson.build b/meson.build
index 3a14681c..449c4e14 100644
--- a/meson.build
+++ b/meson.build
@@ -559,6 +559,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',
diff --git a/src/evdev-debounce.c b/src/evdev-debounce.c
index 74faf39b..f7252dcd 100644
--- a/src/evdev-debounce.c
+++ b/src/evdev-debounce.c
@@ -83,6 +83,7 @@ debounce_state_to_str(enum debounce_state state)
 	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;
@@ -394,6 +395,31 @@ debounce_press_pending_event(struct fallback_dispatch *fallback, enum debounce_e
 	}
 }
 
+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,
@@ -434,6 +460,9 @@ debounce_handle_event(struct fallback_dispatch *fallback,
 	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 fallback_dispatch *dispatch,
 	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_dispatch *dispatch)
 	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,
diff --git a/src/evdev-fallback.h b/src/evdev-fallback.h
index 0d9e247e..d64d36d0 100644
--- a/src/evdev-fallback.h
+++ b/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 {
diff --git a/src/evdev.c b/src/evdev.c
index 28b7b44d..a5ce0b65 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -1264,6 +1264,7 @@ evdev_read_model_flags(struct evdev_device *device)
 		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 },
diff --git a/src/evdev.h b/src/evdev.h
index 75223852..a1d2019f 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -124,6 +124,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 {
diff --git a/test/litest.h b/test/litest.h
index faa469c0..0c57e158 100644
--- a/test/litest.h
+++ b/test/litest.h
@@ -270,6 +270,7 @@ enum litest_device_type {
 	LITEST_WACOM_BAMBOO_2FG_PEN,
 	LITEST_WACOM_BAMBOO_2FG_FINGER,
 	LITEST_HP_WMI_HOTKEYS,
+	LITEST_MS_NANO_TRANSCEIVER_MOUSE,
 };
 
 enum litest_device_feature {
@@ -303,6 +304,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
diff --git a/test/test-pointer.c b/test/test-pointer.c
index 7324c0f6..a4dcdaa3 100644
--- a/test/test-pointer.c
+++ b/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);
 }
diff --git a/udev/90-libinput-model-quirks.hwdb b/udev/90-libinput-model-quirks.hwdb
index c23ef833..514b637c 100644
--- a/udev/90-libinput-model-quirks.hwdb
+++ b/udev/90-libinput-model-quirks.hwdb
@@ -229,6 +229,10 @@ libinput:name:*Lid Switch*:dmi:*svnMicrosoftCorporation:pnSurface3:*
 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
 ##########################################
-- 
2.14.3



More information about the wayland-devel mailing list