mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2025-12-20 08:00:08 +01:00
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:
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 |
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 },
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
59
test/litest-device-ms-nano-transceiver-mouse.c
Normal file
59
test/litest-device-ms-nano-transceiver-mouse.c
Normal 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,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
##########################################
|
##########################################
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue