summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2021-04-14 15:35:07 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2021-04-21 00:15:42 +0000
commita37d6dcc9c2ec7ebd0d3609e01da1cfcec28db6e (patch)
tree68cd76668a4a53e0b6fca7991cf092138cfc2032
parent467266bbb4cd208ecf163a6461bad1e47b5e6872 (diff)
downloadlibinput-a37d6dcc9c2ec7ebd0d3609e01da1cfcec28db6e.tar.gz
touchpad: if we have a right button, let's assume it's not a clickpad
This assumption dates back roughly a decade when INPUT_PROP_BUTTONPAD was introduced into the kernel. To my knowledge, devices right now erroneously advertise INPUT_PROP_BUTTONPAD when they are not a clickpad (but then they have BTN_RIGHT) or they lack INPUT_PROP_BUTTONPAD (and only have BTN_LEFT). So let's change our assumption here - if a clickpad has a right button log the kernel bug and continue with the assumption the device is a touchpad with physical buttons. To disable that warning, fix the kernel or add an AttrInputPropDisable quirk for the device. Fixes #595 Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--src/evdev-mt-touchpad-buttons.c22
-rw-r--r--test/test-touchpad-buttons.c24
2 files changed, 32 insertions, 14 deletions
diff --git a/src/evdev-mt-touchpad-buttons.c b/src/evdev-mt-touchpad-buttons.c
index be399bc7..8ce1e13c 100644
--- a/src/evdev-mt-touchpad-buttons.c
+++ b/src/evdev-mt-touchpad-buttons.c
@@ -940,7 +940,6 @@ tp_guess_clickpad(const struct tp_dispatch *tp, struct evdev_device *device)
{
bool is_clickpad;
bool has_left = libevdev_has_event_code(device->evdev, EV_KEY, BTN_LEFT),
- has_middle = libevdev_has_event_code(device->evdev, EV_KEY, BTN_MIDDLE),
has_right = libevdev_has_event_code(device->evdev, EV_KEY, BTN_RIGHT);
is_clickpad = libevdev_has_property(device->evdev, INPUT_PROP_BUTTONPAD);
@@ -952,24 +951,19 @@ tp_guess_clickpad(const struct tp_dispatch *tp, struct evdev_device *device)
* single physical button
* - Wacom touch devices have neither left nor right buttons
*/
- if (!is_clickpad && has_left && !has_right &&
- (tp->device->model_flags & EVDEV_MODEL_APPLE_TOUCHPAD_ONEBUTTON) == 0) {
+ if (is_clickpad) {
+ if (has_right) {
+ evdev_log_bug_kernel(device,
+ "clickpad with right button, assuming it is not a clickpad\n");
+ is_clickpad = false;
+ }
+ } else if (has_left && !has_right &&
+ (tp->device->model_flags & EVDEV_MODEL_APPLE_TOUCHPAD_ONEBUTTON) == 0) {
evdev_log_bug_kernel(device,
"missing right button, assuming it is a clickpad.\n");
is_clickpad = true;
}
- if (has_middle || has_right) {
- if (is_clickpad)
- evdev_log_bug_kernel(device,
- "clickpad advertising right button\n");
- } else if (has_left &
- !is_clickpad &&
- libevdev_get_id_vendor(device->evdev) != VENDOR_ID_APPLE) {
- evdev_log_bug_kernel(device,
- "non clickpad without right button?\n");
- }
-
return is_clickpad;
}
diff --git a/test/test-touchpad-buttons.c b/test/test-touchpad-buttons.c
index 6af571d9..e55da5c1 100644
--- a/test/test-touchpad-buttons.c
+++ b/test/test-touchpad-buttons.c
@@ -2098,6 +2098,29 @@ START_TEST(touchpad_non_clickpad_detection)
}
END_TEST
+START_TEST(touchpad_clickpad_detection)
+{
+ struct litest_device *dev;
+ uint32_t methods;
+ int codes[] = {
+ INPUT_PROP_MAX, INPUT_PROP_BUTTONPAD,
+ -1, -1,
+ };
+
+ /* Create a device with LR buttons and INPUT_PROP_BUTTONPAD set - we
+ * should ignore the property and assume it's a non-clickpad.
+ * Only way to check that is to verify no click methods are set.
+ */
+ dev = litest_create_device_with_overrides(LITEST_SYNAPTICS_TOUCHPAD,
+ "litest Fake Clickpad",
+ NULL, NULL, codes);
+
+ methods = libinput_device_config_click_get_methods(dev->libinput_device);
+ ck_assert(methods == 0);
+ litest_delete_device(dev);
+}
+END_TEST
+
TEST_COLLECTION(touchpad_buttons)
{
struct range finger_count = {1, 4};
@@ -2168,5 +2191,6 @@ TEST_COLLECTION(touchpad_buttons)
litest_add(clickpad_middleemulation_click_enable_while_down, LITEST_CLICKPAD, LITEST_ANY);
litest_add(clickpad_middleemulation_click_disable_while_down, LITEST_CLICKPAD, LITEST_ANY);
+ litest_add_no_device(touchpad_clickpad_detection);
litest_add_no_device(touchpad_non_clickpad_detection);
}