[PATCH libinput] Add a libinput_device_get_udev_devices() call for merged devices

Hans de Goede hdegoede at redhat.com
Tue Feb 3 00:29:42 PST 2015


Hi,

On 30-01-15 06:48, Peter Hutterer wrote:
> Merged devices may comprise of multiple event nodes. To get those we need to
> return all udev devices we have.
>
> This patch still leaves the backend where it is (one evdev device per libinput
> device) and merely introduces the new API.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

Looks good:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans


> ---
> This is preparation work for the tablet support bits where we will end up
> merging multiple devices into one struct libinput_device.
>
>   src/libinput.c   | 10 ++++++++++
>   src/libinput.h   | 43 ++++++++++++++++++++++++++++++++++++++++++-
>   src/libinput.sym |  1 +
>   test/device.c    | 31 +++++++++++++++++++++++++++++++
>   4 files changed, 84 insertions(+), 1 deletion(-)
>
> diff --git a/src/libinput.c b/src/libinput.c
> index 39c4ef6..6185651 100644
> --- a/src/libinput.c
> +++ b/src/libinput.c
> @@ -1414,6 +1414,16 @@ libinput_device_get_udev_device(struct libinput_device *device)
>   	return evdev_device_get_udev_device((struct evdev_device *)device);
>   }
>
> +LIBINPUT_EXPORT size_t
> +libinput_device_get_udev_devices(struct libinput_device *device,
> +				 struct udev_device **udev_devices,
> +				 size_t ndevices)
> +{
> +	if (ndevices > 0)
> +		udev_devices[0] = evdev_device_get_udev_device((struct evdev_device *)device);
> +	return 1;
> +}
> +
>   LIBINPUT_EXPORT void
>   libinput_device_led_update(struct libinput_device *device,
>   			   enum libinput_led leds)
> diff --git a/src/libinput.h b/src/libinput.h
> index 59a841f..4cb8fe8 100644
> --- a/src/libinput.h
> +++ b/src/libinput.h
> @@ -1561,6 +1561,9 @@ libinput_device_set_seat_logical_name(struct libinput_device *device,
>   /**
>    * @ingroup device
>    *
> + * @deprecated This function is deprecated and always returns the first udev
> + * device. Use libinput_device_get_udev_devices() instead.
> + *
>    * Return a udev handle to the device that is this libinput device, if any.
>    * The returned handle has a refcount of at least 1, the caller must call
>    * udev_device_unref() once to release the associated resources.
> @@ -1576,7 +1579,45 @@ libinput_device_set_seat_logical_name(struct libinput_device *device,
>    * @retval NULL This device is not represented by a udev device
>    */
>   struct udev_device *
> -libinput_device_get_udev_device(struct libinput_device *device);
> +libinput_device_get_udev_device(struct libinput_device *device)
> +	LIBINPUT_ATTRIBUTE_DEPRECATED;
> +
> +/**
> + * @ingroup device
> + *
> + * Return the udev handles for the devices that make up this libinput
> + * device, if any. The returned handles have a refcount of at least 1, the
> + * caller must call udev_device_unref() once on each device to release the
> + * associated resources.
> + *
> + * This function returns the number of available udev handles for this
> + * device, but writes at most ndevices handles into the udev_devices array.
> + *
> + * Some devices may not have a udev device, or the udev device may be
> + * unobtainable. This function returns 0 if no udev device was available.
> + * Some libinput devices may be composed of multiple devices, not all of
> + * which have a corresponding udev device. In this case, this function
> + * returns all available udev devices.
> + *
> + * A device may be composed of multiple device nodes, these may appear or
> + * disappear at any time. The list of udev devices can only be considered
> + * static once all events have been processed until the next call to
> + * libinput_dispatch().
> + *
> + * Calling this function multiple times for the same device may not
> + * return the same udev handles each time.
> + *
> + * @param device A previously obtained device
> + * @param udev_devices A pre-allocated array that will be filled with up to
> + * ndevices udev handles.
> + * @param ndevices Number of elements in udev_devices
> + * @return The number of udev handles available for this device.
> + * @retval 0 This device is not represented by a udev device
> + */
> +size_t
> +libinput_device_get_udev_devices(struct libinput_device *device,
> +				 struct udev_device **udev_devices,
> +				 size_t ndevices);
>
>   /**
>    * @ingroup device
> diff --git a/src/libinput.sym b/src/libinput.sym
> index 671930e..32d39d5 100644
> --- a/src/libinput.sym
> +++ b/src/libinput.sym
> @@ -127,5 +127,6 @@ global:
>   	libinput_device_config_click_get_method;
>   	libinput_device_config_click_get_methods;
>   	libinput_device_config_click_set_method;
> +	libinput_device_get_udev_devices;
>   	libinput_event_get_device_capability_event;
>   } LIBINPUT_0.8.0;
> diff --git a/test/device.c b/test/device.c
> index 76486f0..2e7a3bb 100644
> --- a/test/device.c
> +++ b/test/device.c
> @@ -639,6 +639,8 @@ START_TEST(device_ids)
>   }
>   END_TEST
>
> +#pragma GCC diagnostic push
> +#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
>   START_TEST(device_get_udev_handle)
>   {
>   	struct litest_device *dev = litest_current_device();
> @@ -649,6 +651,34 @@ START_TEST(device_get_udev_handle)
>   	udev_device_unref(udev_device);
>   }
>   END_TEST
> +#pragma GCC diagnostic pop
> +
> +START_TEST(device_get_udev_handles)
> +{
> +	struct litest_device *dev = litest_current_device();
> +	struct udev_device *udev_devices[3];
> +	size_t ndevices;
> +
> +	udev_devices[1] = (struct udev_device *)0xab;
> +	udev_devices[2] = (struct udev_device *)0xcd;
> +
> +	ndevices = libinput_device_get_udev_devices(dev->libinput_device,
> +						    udev_devices,
> +						    3);
> +	ck_assert_int_eq(ndevices, 1);
> +	ck_assert_notnull(udev_devices[0]);
> +	udev_device_unref(udev_devices[0]);
> +	ck_assert_ptr_eq(udev_devices[1], 0xab);
> +	ck_assert_ptr_eq(udev_devices[2], 0xcd);
> +
> +	udev_devices[0] = (struct udev_device *)0xef;
> +	ndevices = libinput_device_get_udev_devices(dev->libinput_device,
> +						    udev_devices,
> +						    0);
> +	ck_assert_int_eq(ndevices, 1);
> +	ck_assert_ptr_eq(udev_devices[0], 0xef);
> +}
> +END_TEST
>
>   START_TEST(device_context)
>   {
> @@ -685,6 +715,7 @@ int main (int argc, char **argv)
>   	litest_add_for_device("device:context", device_context, LITEST_SYNAPTICS_CLICKPAD);
>
>   	litest_add("device:udev", device_get_udev_handle, LITEST_ANY, LITEST_ANY);
> +	litest_add("device:udev", device_get_udev_handles, LITEST_ANY, LITEST_ANY);
>
>   	return litest_run(argc, argv);
>   }
>


More information about the wayland-devel mailing list