With the introduction of capability events, this is theoretically racy. In the current implementation that's fine as we add the capabilities before we return the device, but in the future a capability event may be in the event queue to add/remove a capability, so this call is unreliable.
Signed-off-by: Peter Hutterer <[email protected]> --- src/libinput.h | 9 +++++++-- test/touch.c | 16 ++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/libinput.h b/src/libinput.h index 50bedc8..1029483 100644 --- a/src/libinput.h +++ b/src/libinput.h @@ -1593,13 +1593,18 @@ libinput_device_led_update(struct libinput_device *device, /** * @ingroup device * - * Check if the given device has the specified capability + * Check if the given device has the specified capability. + * + * @note This function should not be used. It suffers from potential race + * conditions as it will give the capabilities of the device right now which + * may be different to the capabilities as seen in the event stream. * * @return 1 if the given device has the capability or 0 if not */ int libinput_device_has_capability(struct libinput_device *device, - enum libinput_device_capability capability); + enum libinput_device_capability capability) + LIBINPUT_ATTRIBUTE_DEPRECATED; /** * @ingroup device diff --git a/test/touch.c b/test/touch.c index 29890a4..aad7455 100644 --- a/test/touch.c +++ b/test/touch.c @@ -427,19 +427,27 @@ START_TEST(fake_mt_exists) struct litest_device *dev = litest_current_device(); struct libinput *li = dev->libinput; struct libinput_event *event; + struct libinput_event_device_capability *cev; struct libinput_device *device; litest_wait_for_event_of_type(li, LIBINPUT_EVENT_DEVICE_ADDED, -1); event = libinput_get_event(li); device = libinput_event_get_device(event); + libinput_device_ref(device); + libinput_event_destroy(event); - ck_assert(!libinput_device_has_capability(device, - LIBINPUT_DEVICE_CAP_TOUCH)); + litest_wait_for_event_of_type(li, + LIBINPUT_EVENT_DEVICE_CAPABILITY_ADDED, + -1); + event = libinput_get_event(li); + cev = libinput_event_get_device_capability_event(event); /* This test may need fixing if we add other fake-mt devices that * have different capabilities */ - ck_assert(libinput_device_has_capability(device, - LIBINPUT_DEVICE_CAP_POINTER)); + ck_assert_int_eq(libinput_event_device_capability_get_capability(cev), + LIBINPUT_DEVICE_CAP_POINTER); + libinput_event_destroy(event); + libinput_device_unref(device); } END_TEST -- 2.1.0 _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
