evdev: a device without any seat caps is an unhandled device
authorPeter Hutterer <peter.hutterer@who-t.net>
Thu, 28 May 2020 06:41:09 +0000 (16:41 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Wed, 3 Jun 2020 22:32:56 +0000 (22:32 +0000)
If we don't have any caps, assume the device is unhandled and ignore it.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
src/evdev.c
test/test-device.c

index 6afc8623db64d4a2b448a7205378050689e0d0ac..dae1284dd529728eee38062ee985be1c67edfcea 100644 (file)
@@ -2234,11 +2234,8 @@ evdev_device_create(struct libinput_seat *seat,
        evdev_pre_configure_model_quirks(device);
 
        device->dispatch = evdev_configure_device(device);
-       if (device->dispatch == NULL) {
-               if (device->seat_caps == 0)
-                       unhandled_device = 1;
+       if (device->dispatch == NULL || device->seat_caps == 0)
                goto err;
-       }
 
        device->source =
                libinput_add_fd(libinput, fd, evdev_device_dispatch, device);
@@ -2256,8 +2253,10 @@ evdev_device_create(struct libinput_seat *seat,
 
 err:
        close_restricted(libinput, fd);
-       if (device)
+       if (device) {
+               unhandled_device = device->seat_caps == 0;
                evdev_device_destroy(device);
+       }
 
        return unhandled_device ? EVDEV_UNHANDLED_DEVICE :  NULL;
 }
index df6bb22d5e531e424eb5c362b84782623e91db10..5fc79cdc31f44dad14c1c5b492a45e3782ab459e 100644 (file)
@@ -1472,6 +1472,27 @@ START_TEST(device_capability_check_invalid)
 }
 END_TEST
 
+START_TEST(device_capability_nocaps_ignored)
+{
+       struct libevdev_uinput *uinput;
+       struct libinput *li;
+       struct libinput_device *device;
+
+       /* SW_MAX isn't handled in libinput so the device is processed but
+        * ends up without seat capabilities and is ignored. */
+       uinput = litest_create_uinput_device("test device", NULL,
+                                            EV_SW, SW_MAX,
+                                            -1);
+       li = litest_create_context();
+       device = libinput_path_add_device(li,
+                                         libevdev_uinput_get_devnode(uinput));
+       litest_assert_ptr_null(device);
+
+       libinput_unref(li);
+       libevdev_uinput_destroy(uinput);
+}
+END_TEST
+
 START_TEST(device_has_size)
 {
        struct litest_device *dev = litest_current_device();
@@ -1667,6 +1688,7 @@ TEST_COLLECTION(device)
 
        litest_add("device:capability", device_capability_at_least_one, LITEST_ANY, LITEST_ANY);
        litest_add("device:capability", device_capability_check_invalid, LITEST_ANY, LITEST_ANY);
+       litest_add_no_device("device:capability", device_capability_nocaps_ignored);
 
        litest_add("device:size", device_has_size, LITEST_TOUCHPAD, LITEST_ANY);
        litest_add("device:size", device_has_size, LITEST_TABLET, LITEST_ANY);