[PATCH libinput] evdev: add support for LIBINPUT_MODEL_* udev tags

Hans de Goede hdegoede at redhat.com
Thu Apr 23 03:48:23 PDT 2015


Hi,

On 23-04-15 04:07, Peter Hutterer wrote:
> Some devices need specific configuration or different defaults.
> Push that into udev rules and a hwdb file, that's where detection is the
> easiest. The LIBINPUT_MODEL_ prefix is used to determine some type of device
> model. Note that this property is a private API and subject to change at
> any time without notice.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

Looks good:

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

Regards,

Hans


> ---
> A few more changes than expected, so sending this out again for another
> set of eyes on it. This is the infrastructure to tag things with
> LIBINPUT_MODEL_* udev properties, it's not in use by anything just yet.
>
>   doc/device-configuration-via-udev.dox | 15 +++++++++++++++
>   src/evdev.c                           | 22 ++++++++++++++++++++++
>   src/evdev.h                           |  6 ++++++
>   udev/90-libinput-model-quirks.hwdb    | 16 ++++++++++++++++
>   udev/90-libinput-model-quirks.rules   | 25 +++++++++++++++++++++++++
>   udev/Makefile.am                      |  8 +++++++-
>   6 files changed, 91 insertions(+), 1 deletion(-)
>   create mode 100644 udev/90-libinput-model-quirks.hwdb
>   create mode 100644 udev/90-libinput-model-quirks.rules
>
> diff --git a/doc/device-configuration-via-udev.dox b/doc/device-configuration-via-udev.dox
> index c22aafa..e38b93f 100644
> --- a/doc/device-configuration-via-udev.dox
> +++ b/doc/device-configuration-via-udev.dox
> @@ -63,6 +63,9 @@ libinput_pointer_get_axis_source() for details.
>   <dt>POINTINGSTICK_CONST_ACCEL</dt>
>   <dd>A constant (linear) acceleration factor to apply to pointingstick deltas
>   to normalize them.
> +<dt>LIBINPUT_MODEL_*</dt>
> +<dd><b>This prefix is reserved as private API, do not use.</b>. See @ref
> +model_specific_configuration for details.
>   </dd>
>   </dl>
>
> @@ -98,4 +101,16 @@ ACTION=="add|change", KERNEL=="event[0-9]*", ENV{ID_VENDOR_ID}=="012a", \
>   ENV{ID_MODEL_ID}=="034b", ENV{ID_INPUT_TOUCHPAD}="", ENV{ID_INPUT_TABLET}="1"
>   @endcode
>
> + at section model_specific_configuration Model-specific configuration
> +
> +libinput reserves the property prefix <b>LIBINPUT_MODEL_</b> for
> +model-specific configuration. <b>This prefix is reserved as private API, do
> +not use.</b>
> +
> +The effect of this property may be to enable or disable certain
> +features on a specific device or set of devices, to change configuration
> +defaults or any other reason. The effects of setting this property, the
> +format of the property and the value of the property are subject to change
> +at any time.
> +
>   */
> diff --git a/src/evdev.c b/src/evdev.c
> index 964b3ba..e3bba93 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -1422,6 +1422,27 @@ evdev_read_dpi_prop(struct evdev_device *device)
>   	return dpi;
>   }
>
> +static inline enum evdev_device_model
> +evdev_read_model(struct evdev_device *device)
> +{
> +	const struct model_map {
> +		const char *property;
> +		enum evdev_device_model model;
> +	} model_map[] = {
> +		{ NULL, EVDEV_MODEL_DEFAULT },
> +	};
> +	const struct model_map *m = model_map;
> +
> +	while (m->property) {
> +		if (!!udev_device_get_property_value(device->udev_device,
> +						     m->property))
> +			break;
> +		m++;
> +	}
> +
> +	return m->model;
> +}
> +
>   /* Return 1 if the given resolutions have been set, or 0 otherwise */
>   inline int
>   evdev_fix_abs_resolution(struct evdev_device *device,
> @@ -1950,6 +1971,7 @@ evdev_device_create(struct libinput_seat *seat,
>   	device->scroll.wheel_click_angle =
>   		evdev_read_wheel_click_prop(device);
>   	device->dpi = evdev_read_dpi_prop(device);
> +	device->model = evdev_read_model(device);
>   	/* at most 5 SYN_DROPPED log-messages per 30s */
>   	ratelimit_init(&device->syn_drop_limit, 30ULL * 1000, 5);
>
> diff --git a/src/evdev.h b/src/evdev.h
> index 9f24453..edd4011 100644
> --- a/src/evdev.h
> +++ b/src/evdev.h
> @@ -93,6 +93,10 @@ enum evdev_middlebutton_event {
>   	MIDDLEBUTTON_EVENT_ALL_UP,
>   };
>
> +enum evdev_device_model {
> +	EVDEV_MODEL_DEFAULT,
> +};
> +
>   struct mt_slot {
>   	int32_t seat_slot;
>   	struct device_coords point;
> @@ -202,6 +206,8 @@ struct evdev_device {
>
>   	int dpi; /* HW resolution */
>   	struct ratelimit syn_drop_limit; /* ratelimit for SYN_DROPPED logging */
> +
> +	enum evdev_device_model model;
>   };
>
>   #define EVDEV_UNHANDLED_DEVICE ((struct evdev_device *) 1)
> diff --git a/udev/90-libinput-model-quirks.hwdb b/udev/90-libinput-model-quirks.hwdb
> new file mode 100644
> index 0000000..02bb8f9
> --- /dev/null
> +++ b/udev/90-libinput-model-quirks.hwdb
> @@ -0,0 +1,16 @@
> +# Do not edit this file, it will be overwritten on update
> +#
> +# This file contains hwdb matches for libinput model-specific quirks.
> +# The contents of this file are a contract between libinput, udev rules and
> +# the hwdb.
> +# IT IS NOT A STABLE API AND SUBJECT TO CHANGE AT ANY TIME
> +
> +# The lookup keys are composed in:
> +#	90-libinput-model-quirks.rules
> +#
> +# Match string formats:
> +#	libinput:<modalias>
> +#	libinput:name:<name>:dmi:<dmi string>
> +
> +#
> +# Sort by brand, model
> diff --git a/udev/90-libinput-model-quirks.rules b/udev/90-libinput-model-quirks.rules
> new file mode 100644
> index 0000000..4b98874
> --- /dev/null
> +++ b/udev/90-libinput-model-quirks.rules
> @@ -0,0 +1,25 @@
> +# Do not edit this file, it will be overwritten on update
> +#
> +# This file contains lookup rules for libinput model-specific quirks.
> +# The contents of this file are a contract between libinput, udev rules and
> +# the hwdb.
> +# IT IS NOT A STABLE API AND SUBJECT TO CHANGE AT ANY TIME
> +#
> +# The hwdb database is in:
> +#	90-libinput-model-quirks.hwdb
> +
> +ACTION!="add|change", GOTO="libinput_model_quirks_end"
> +KERNEL!="event*", GOTO="libinput_model_quirks_end"
> +
> +# hwdb matches:
> +#
> +# libinput:<modalias>
> +IMPORT{builtin}="hwdb --subsystem=input --lookup-prefix=libinput:", \
> +  GOTO="libinput_model_quirks_end"
> +
> +# libinput:name:<name>:dmi:<dmi string>
> +KERNELS=="input*", \
> +  IMPORT{builtin}="hwdb 'libinput:name:$attr{name}:$attr{[dmi/id]modalias}'", \
> +  GOTO="libinput_model_quirks_end"
> +
> +LABEL="libinput_model_quirks_end"
> diff --git a/udev/Makefile.am b/udev/Makefile.am
> index 3691172..7d19809 100644
> --- a/udev/Makefile.am
> +++ b/udev/Makefile.am
> @@ -6,4 +6,10 @@ libinput_device_group_CFLAGS = $(LIBUDEV_CFLAGS) $(GCC_CFLAGS)
>   libinput_device_group_LDADD = $(LIBUDEV_LIBS)
>
>   udev_rulesdir=$(UDEV_DIR)/rules.d
> -dist_udev_rules_DATA = 80-libinput-device-groups.rules
> +dist_udev_rules_DATA = \
> +	80-libinput-device-groups.rules \
> +	90-libinput-model-quirks.rules
> +
> +udev_hwdbdir=$(UDEV_DIR)/hwdb.d
> +dist_udev_hwdb_DATA = \
> +	90-libinput-model-quirks.hwdb
>


More information about the wayland-devel mailing list