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

Reply via email to