On Tue, Jan 27, 2015 at 03:45:58PM +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 <[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);

You dont test for no-touch capability any longer after this change. You
need to retrieve every capability event there is and check that none is
a touch capability event.


Jonas

> +     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
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to