[PATCH libinput 4/9] evdev: use LIBINPUT_ATTR_SIZE_HINT for resolutions
Hans de Goede
hdegoede at redhat.com
Wed Jul 8 05:29:21 PDT 2015
Hi,
On 01-07-15 08:08, Peter Hutterer wrote:
> Touchpads, notably Elantech, ALPS and bcm5974 don't provide x/y resolution
> until recent generations.
> Add a new property, LIBINPUT_ATTR_SIZE_HINT, that provides size information to
> libinput. Note that this property *does not* override true resolution values,
> it is only used when the resolution is missing. It is used merely as an
> approximate size hint.
>
> If the resolution for a specific device is known it should be added to the
> udev hwdb so it can be set globally. See the bcm5974 entries here:
> http://cgit.freedesktop.org/systemd/systemd/tree/hwdb/60-evdev.hwdb.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
LGTM: Reviewed-by: Hans de Goede <hdegoede at redhat.com>
Regards,
Hans
> ---
> doc/device-configuration-via-udev.dox | 14 +++++++++-----
> src/evdev.c | 36 +++++++++++++++++++++++++++++++++--
> 2 files changed, 43 insertions(+), 7 deletions(-)
>
> diff --git a/doc/device-configuration-via-udev.dox b/doc/device-configuration-via-udev.dox
> index e38b93f..85c5c9c 100644
> --- a/doc/device-configuration-via-udev.dox
> +++ b/doc/device-configuration-via-udev.dox
> @@ -67,6 +67,10 @@ to normalize them.
> <dd><b>This prefix is reserved as private API, do not use.</b>. See @ref
> model_specific_configuration for details.
> </dd>
> +<dt>LIBINPUT_ATTR_*</dt>
> +<dd><b>This prefix is reserved as private API, do not use.</b>. See @ref
> +model_specific_configuration for details.
> +</dd>
> </dl>
>
> Below is an example udev rule to assign "seat1" to a device from vendor
> @@ -103,13 +107,13 @@ ENV{ID_MODEL_ID}=="034b", ENV{ID_INPUT_TOUCHPAD}="", ENV{ID_INPUT_TABLET}="1"
>
> @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>
> +libinput reserves the property prefixes <b>LIBINPUT_MODEL_</b> and
> +<b>LIBINPUT_ATTR_*</b> for model-specific configuration. <b>These prefixes
> +are reserved as private API, do not use.</b>
>
> -The effect of this property may be to enable or disable certain
> +The effect of these properties 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
> +defaults or any other reason. The effects of setting these properties, 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 5d9b9d0..26bcf41 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -1547,6 +1547,23 @@ evdev_read_model(struct evdev_device *device)
> return m->model;
> }
>
> +static inline int
> +evdev_read_attr_size_prop(struct evdev_device *device,
> + size_t *size_x,
> + size_t *size_y)
> +{
> + struct udev_device *udev;
> + const char *size_prop;
> +
> + udev = device->udev_device;
> + size_prop = udev_device_get_property_value(udev,
> + "LIBINPUT_ATTR_SIZE_HINT");
> + if (!size_prop)
> + return false;
> +
> + return parse_dimension_property(size_prop, size_x, size_y);
> +}
> +
> /* Return 1 if the device is set to the fake resolution or 0 otherwise */
> static inline int
> evdev_fix_abs_resolution(struct evdev_device *device,
> @@ -1555,6 +1572,8 @@ evdev_fix_abs_resolution(struct evdev_device *device,
> {
> struct libinput *libinput = device->base.seat->libinput;
> struct libevdev *evdev = device->evdev;
> + const struct input_absinfo *absx, *absy;
> + size_t widthmm = 0, heightmm = 0;
> int xres = EVDEV_FAKE_RESOLUTION,
> yres = EVDEV_FAKE_RESOLUTION;
>
> @@ -1566,15 +1585,28 @@ evdev_fix_abs_resolution(struct evdev_device *device,
> return 0;
> }
>
> - if (libevdev_get_abs_resolution(evdev, xcode) != 0)
> + absx = libevdev_get_abs_info(evdev, xcode);
> + absy = libevdev_get_abs_info(evdev, ycode);
> +
> + if (absx->resolution != 0 || absy->resolution != 0)
> return 0;
>
> + /* Note: we *do not* override resolutions if provided by the kernel.
> + * If a device needs this, add it to 60-evdev.hwdb. The libinput
> + * property is only for general size hints where we can make
> + * educated guesses but don't know better.
> + */
> + if (evdev_read_attr_size_prop(device, &widthmm, &heightmm)) {
> + xres = (absx->maximum - absx->minimum)/widthmm;
> + yres = (absy->maximum - absy->minimum)/heightmm;
> + }
> +
> /* libevdev_set_abs_resolution() changes the absinfo we already
> have a pointer to, no need to fetch it again */
> libevdev_set_abs_resolution(evdev, xcode, xres);
> libevdev_set_abs_resolution(evdev, ycode, yres);
>
> - return 1;
> + return xres == EVDEV_FAKE_RESOLUTION;
> }
>
> static enum evdev_device_udev_tags
>
More information about the wayland-devel
mailing list