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 <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2018-01-31 16:18:15 +10:00
parent cb186abc17
commit 3a3fd645c4
10 changed files with 115 additions and 721 deletions

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 74 KiB

After

Width:  |  Height:  |  Size: 78 KiB

View file

@ -563,6 +563,7 @@ if get_option('tests')
'test/litest-device-mouse-low-dpi.c', 'test/litest-device-mouse-low-dpi.c',
'test/litest-device-mouse-wheel-click-angle.c', 'test/litest-device-mouse-wheel-click-angle.c',
'test/litest-device-mouse-wheel-click-count.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-ms-surface-cover.c',
'test/litest-device-protocol-a-touch-screen.c', 'test/litest-device-protocol-a-touch-screen.c',
'test/litest-device-qemu-usb-tablet.c', 'test/litest-device-qemu-usb-tablet.c',

View file

@ -83,6 +83,7 @@ debounce_state_to_str(enum debounce_state state)
CASE_RETURN_STRING(DEBOUNCE_STATE_MAYBE_SPURIOUS); CASE_RETURN_STRING(DEBOUNCE_STATE_MAYBE_SPURIOUS);
CASE_RETURN_STRING(DEBOUNCE_STATE_RELEASED); CASE_RETURN_STRING(DEBOUNCE_STATE_RELEASED);
CASE_RETURN_STRING(DEBOUNCE_STATE_PRESS_PENDING); CASE_RETURN_STRING(DEBOUNCE_STATE_PRESS_PENDING);
CASE_RETURN_STRING(DEBOUNCE_STATE_DISABLED);
} }
return NULL; 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 static void
debounce_handle_event(struct fallback_dispatch *fallback, debounce_handle_event(struct fallback_dispatch *fallback,
enum debounce_event event, enum debounce_event event,
@ -434,6 +460,9 @@ debounce_handle_event(struct fallback_dispatch *fallback,
case DEBOUNCE_STATE_PRESS_PENDING: case DEBOUNCE_STATE_PRESS_PENDING:
debounce_press_pending_event(fallback, event, time); debounce_press_pending_event(fallback, event, time);
break; break;
case DEBOUNCE_STATE_DISABLED:
debounce_disabled_event(fallback, event, time);
break;
} }
evdev_log_debug(fallback->device, 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++) { for (size_t i = 0; i < nchanged; i++) {
bool is_down = hw_is_key_down(dispatch, changed[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, debounce_set_state(dispatch,
!is_down ? !is_down ?
DEBOUNCE_STATE_IS_DOWN : DEBOUNCE_STATE_IS_DOWN :
@ -538,6 +568,12 @@ fallback_init_debounce(struct fallback_dispatch *dispatch)
struct evdev_device *device = dispatch->device; struct evdev_device *device = dispatch->device;
char timer_name[64]; 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; dispatch->debounce.state = DEBOUNCE_STATE_IS_UP;
snprintf(timer_name, snprintf(timer_name,

View file

@ -41,6 +41,8 @@ enum debounce_state {
DEBOUNCE_STATE_MAYBE_SPURIOUS, DEBOUNCE_STATE_MAYBE_SPURIOUS,
DEBOUNCE_STATE_RELEASED, DEBOUNCE_STATE_RELEASED,
DEBOUNCE_STATE_PRESS_PENDING, DEBOUNCE_STATE_PRESS_PENDING,
DEBOUNCE_STATE_DISABLED = 999,
}; };
struct fallback_dispatch { struct fallback_dispatch {

View file

@ -1264,6 +1264,7 @@ evdev_read_model_flags(struct evdev_device *device)
MODEL(APPLE_TOUCHPAD_ONEBUTTON), MODEL(APPLE_TOUCHPAD_ONEBUTTON),
MODEL(LOGITECH_MARBLE_MOUSE), MODEL(LOGITECH_MARBLE_MOUSE),
MODEL(TABLET_NO_PROXIMITY_OUT), MODEL(TABLET_NO_PROXIMITY_OUT),
MODEL(MS_NANO_TRANSCEIVER),
#undef MODEL #undef MODEL
{ "ID_INPUT_TRACKBALL", EVDEV_MODEL_TRACKBALL }, { "ID_INPUT_TRACKBALL", EVDEV_MODEL_TRACKBALL },
{ NULL, EVDEV_MODEL_DEFAULT }, { NULL, EVDEV_MODEL_DEFAULT },

View file

@ -124,6 +124,7 @@ enum evdev_device_model {
EVDEV_MODEL_APPLE_TOUCHPAD_ONEBUTTON = (1 << 25), EVDEV_MODEL_APPLE_TOUCHPAD_ONEBUTTON = (1 << 25),
EVDEV_MODEL_LOGITECH_MARBLE_MOUSE = (1 << 26), EVDEV_MODEL_LOGITECH_MARBLE_MOUSE = (1 << 26),
EVDEV_MODEL_TABLET_NO_PROXIMITY_OUT = (1 << 27), EVDEV_MODEL_TABLET_NO_PROXIMITY_OUT = (1 << 27),
EVDEV_MODEL_MS_NANO_TRANSCEIVER = (1 << 28),
}; };
enum evdev_button_scroll_state { enum evdev_button_scroll_state {

View file

@ -0,0 +1,59 @@
/*
* Copyright © 2018 Red Hat, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include "config.h"
#include "litest.h"
#include "litest-int.h"
static struct input_id input_id = {
.bustype = 0x3,
.vendor = 0x045e,
.product = 0x0800,
};
static int events[] = {
EV_KEY, BTN_LEFT,
EV_KEY, BTN_RIGHT,
EV_KEY, BTN_MIDDLE,
EV_KEY, BTN_SIDE,
EV_KEY, BTN_EXTRA,
EV_REL, REL_X,
EV_REL, REL_Y,
EV_REL, REL_WHEEL,
EV_REL, REL_DIAL,
EV_REL, REL_HWHEEL,
-1 , -1,
};
TEST_DEVICE("ms-nano-mouse",
.type = LITEST_MS_NANO_TRANSCEIVER_MOUSE,
.features = LITEST_RELATIVE | LITEST_BUTTON | LITEST_WHEEL | LITEST_NO_DEBOUNCE,
.interface = NULL,
.name = "Microsoft Microsoft® Nano Transceiver v2.0",
.id = &input_id,
.absinfo = NULL,
.events = events,
)

View file

@ -270,6 +270,7 @@ enum litest_device_type {
LITEST_WACOM_BAMBOO_2FG_PEN, LITEST_WACOM_BAMBOO_2FG_PEN,
LITEST_WACOM_BAMBOO_2FG_FINGER, LITEST_WACOM_BAMBOO_2FG_FINGER,
LITEST_HP_WMI_HOTKEYS, LITEST_HP_WMI_HOTKEYS,
LITEST_MS_NANO_TRANSCEIVER_MOUSE,
}; };
enum litest_device_feature { enum litest_device_feature {
@ -303,6 +304,7 @@ enum litest_device_feature {
LITEST_LEDS = 1 << 25, LITEST_LEDS = 1 << 25,
LITEST_SWITCH = 1 << 26, LITEST_SWITCH = 1 << 26,
LITEST_IGNORED = 1 << 27, 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 /* this is a semi-mt device, so we keep track of the touches that the tests

View file

@ -2602,11 +2602,11 @@ litest_setup_tests_pointer(void)
litest_add("pointer:time", pointer_time_usec, LITEST_RELATIVE, LITEST_ANY); 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_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_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, &buttons); 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_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_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_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_add("pointer:debounce_otherbutton", debounce_spurious_switch_to_otherbutton, LITEST_BUTTON, LITEST_TOUCHPAD|LITEST_NO_DEBOUNCE);
} }

View file

@ -229,6 +229,10 @@ libinput:name:*Lid Switch*:dmi:*svnMicrosoftCorporation:pnSurface3:*
libinput:name:*Microsoft Surface Type Cover Keyboard*:dmi:*svnMicrosoftCorporation:pnSurface3:* libinput:name:*Microsoft Surface Type Cover Keyboard*:dmi:*svnMicrosoftCorporation:pnSurface3:*
LIBINPUT_ATTR_KEYBOARD_INTEGRATION=internal LIBINPUT_ATTR_KEYBOARD_INTEGRATION=internal
# Microsoft Microsoft® Nano Transceiver v2.0"
libinput:mouse:input:b0003v045Ep0800*
LIBINPUT_MODEL_MS_NANO_TRANSCEIVER=1
########################################## ##########################################
# Razer # Razer
########################################## ##########################################