[PATCH v2 libinput 3/3] Deprecate libinput_device_has_capability
Jonas Ådahl
jadahl at gmail.com
Tue Jan 27 15:58:10 PST 2015
On Wed, Jan 28, 2015 at 09:47:28AM +1000, Peter Hutterer wrote:
> 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 <peter.hutterer at who-t.net>
Reviewed-by: Jonas Ådahl <jadahl at gmail.com>
> ---
> Changes to v1:
> - check for TOUCH to not be in the capability events
>
> src/libinput.h | 9 +++++++--
> test/touch.c | 29 +++++++++++++++++++++++------
> 2 files changed, 30 insertions(+), 8 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..03dbe5f 100644
> --- a/test/touch.c
> +++ b/test/touch.c
> @@ -427,19 +427,36 @@ 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;
> + bool pointer_cap_found = false;
>
> 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);
> + while ((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));
> + if (libinput_event_device_capability_get_capability(cev) ==
> + LIBINPUT_DEVICE_CAP_POINTER)
> + pointer_cap_found = true;
> +
> + /* This test may need fixing if we add other fake-mt devices that
> + * have different capabilities */
> + ck_assert_int_ne(libinput_event_device_capability_get_capability(cev),
> + LIBINPUT_DEVICE_CAP_TOUCH);
> + }
> +
> + ck_assert(pointer_cap_found);
> +
> + libinput_event_destroy(event);
> + libinput_device_unref(device);
> }
> END_TEST
>
> --
> 2.1.0
>
More information about the wayland-devel
mailing list