touchpad: if we have a right button, let's assume it's not a clickpad
authorPeter Hutterer <peter.hutterer@who-t.net>
Wed, 14 Apr 2021 05:35:07 +0000 (15:35 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Wed, 21 Apr 2021 00:15:42 +0000 (00:15 +0000)
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>
src/evdev-mt-touchpad-buttons.c
test/test-touchpad-buttons.c

index be399bc770be919de22abc12161214a16dd20881..8ce1e13c2337ceddc717d92823377e4b53a5f56b 100644 (file)
@@ -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;
 }
 
index 6af571d9f7d8a7b50cf877501b949efc23cc2257..e55da5c1d5fcbc289daa374b41582c0e297a70d7 100644 (file)
@@ -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);
 }