summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2020-05-28 16:41:09 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2020-06-03 22:32:56 +0000
commit4058c43579f23b3abe288b7480fe2a4e70aaea20 (patch)
tree5a6052d14fe0de5a70dc6b1e0070e26ca00eb6e6
parent84fda690bdf92ee44550f553a7262192c57aaa84 (diff)
evdev: a device without any seat caps is an unhandled device
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>
-rw-r--r--src/evdev.c9
-rw-r--r--test/test-device.c22
2 files changed, 26 insertions, 5 deletions
diff --git a/src/evdev.c b/src/evdev.c
index 6afc8623..dae1284d 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -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;
}
diff --git a/test/test-device.c b/test/test-device.c
index df6bb22d..5fc79cdc 100644
--- a/test/test-device.c
+++ b/test/test-device.c
@@ -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);