diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2020-05-28 16:41:09 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2020-06-03 22:32:56 +0000 |
commit | 4058c43579f23b3abe288b7480fe2a4e70aaea20 (patch) | |
tree | 5a6052d14fe0de5a70dc6b1e0070e26ca00eb6e6 | |
parent | 84fda690bdf92ee44550f553a7262192c57aaa84 (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.c | 9 | ||||
-rw-r--r-- | test/test-device.c | 22 |
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); |