[PATCH libinput] tablet: add hwdb entries to ignore Wacom Cintiq offsets

Ping Cheng pinglinux at gmail.com
Tue Feb 16 20:39:09 UTC 2016


On Mon, Feb 15, 2016 at 9:47 PM, Peter Hutterer <peter.hutterer at who-t.net>
wrote:

> Wacom Cintiqs and some DTK/DTU devices have a sensor larger than the
> underlying display. Clamp any data outside the screen area to the screen
> area.
>
> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
> ---
>  src/evdev-tablet.c                     | 27 +++++++++++++++++--------
>  src/evdev.c                            |  1 +
>  src/evdev.h                            |  1 +
>  test/tablet.c                          |  8 ++++----
>  udev/90-libinput-model-quirks.hwdb     | 36
> ++++++++++++++++++++++++++++++++++
>  udev/90-libinput-model-quirks.rules.in |  4 ++++
>  6 files changed, 65 insertions(+), 12 deletions(-)
>
> diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
> index 1e5c2cd..50ecf25 100644
> --- a/src/evdev-tablet.c
> +++ b/src/evdev-tablet.c
> @@ -244,9 +244,9 @@ adjust_tilt(const struct input_absinfo *absinfo)
>  }
>
>  static inline int32_t
> -invert_axis(const struct input_absinfo *absinfo)
> +invert_axis(const struct input_absinfo *absinfo, int value)
>  {
> -       return absinfo->maximum - (absinfo->value - absinfo->minimum);
> +       return absinfo->maximum - (value - absinfo->minimum);
>  }
>
>  static void
> @@ -292,6 +292,18 @@ normalize_wheel(struct tablet_dispatch *tablet,
>         return value * device->scroll.wheel_click_angle;
>  }
>
> +static inline int
> +tablet_get_ranged_value(struct evdev_device *device,
> +                       const struct input_absinfo *abs)
> +{
> +       int value = abs->value;
> +
> +       if (device->model_flags & EVDEV_MODEL_WACOM_SENSOR_OFFSET)
> +               value = max(min(value, abs->maximum), abs->minimum);
>

If we trim data here, we lost the benefit of actually reported values for
calibration.

For example, if the actual calibrated tablet area is
(abs->minimum-30, abs->minimum-12;
maxX-offset-offset-30, maxY-offset-offset-12), we miss the
(abs->minimum-30, abs->minimum-12; abs->minimum, abs->minimum) active
area, which could be mapped to the screen if we don't trim it.

This patch potentially leaves some screen area unreachable, which could be
reached with the introduction of outbound values.

Tablet (output) area for mapping to screen/display needs to be considered
separately from tablet input area. Input/raw area/data should be reported
as-is; output area can be selected/configured by client, as long as we tell
them the default.


> +
> +       return value;
> +}
> +
>  static inline void
>  tablet_handle_xy(struct tablet_dispatch *tablet,
>                  struct evdev_device *device,
> @@ -305,26 +317,25 @@ tablet_handle_xy(struct tablet_dispatch *tablet,
>
>         if (bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_TOOL_AXIS_X))
> {
>                 absinfo = libevdev_get_abs_info(device->evdev, ABS_X);
> +               value = tablet_get_ranged_value(device, absinfo);
>
>                 if (device->left_handed.enabled)
> -                       value = invert_axis(absinfo);
> -               else
> -                       value = absinfo->value;
> +                       value = invert_axis(absinfo, value);
>
>                 if (!tablet_has_status(tablet,
>                                        TABLET_TOOL_ENTERING_PROXIMITY))
>                         delta.x = value - tablet->axes.point.x;
>                 tablet->axes.point.x = value;
> +
>         }
>         point.x = tablet->axes.point.x;
>
>         if (bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_TOOL_AXIS_Y))
> {
>                 absinfo = libevdev_get_abs_info(device->evdev, ABS_Y);
> +               value = tablet_get_ranged_value(device, absinfo);
>
>                 if (device->left_handed.enabled)
> -                       value = invert_axis(absinfo);
> -               else
> -                       value = absinfo->value;
> +                       value = invert_axis(absinfo, value);
>
>                 if (!tablet_has_status(tablet,
>                                        TABLET_TOOL_ENTERING_PROXIMITY))
> diff --git a/src/evdev.c b/src/evdev.c
> index 51768fe..ccfd7e4 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -1680,6 +1680,7 @@ evdev_read_model_flags(struct evdev_device *device)
>                 { "LIBINPUT_MODEL_CYBORG_RAT", EVDEV_MODEL_CYBORG_RAT },
>                 { "LIBINPUT_MODEL_CYAPA", EVDEV_MODEL_CYAPA },
>                 { "LIBINPUT_MODEL_ALPS_RUSHMORE",
> EVDEV_MODEL_ALPS_RUSHMORE },
> +               { "LIBINPUT_MODEL_WACOM_SENSOR_OFFSET",
> EVDEV_MODEL_WACOM_SENSOR_OFFSET },
>                 { NULL, EVDEV_MODEL_DEFAULT },
>         };
>         const struct model_map *m = model_map;
> diff --git a/src/evdev.h b/src/evdev.h
> index 482712b..80f1606 100644
> --- a/src/evdev.h
> +++ b/src/evdev.h
> @@ -113,6 +113,7 @@ enum evdev_device_model {
>         EVDEV_MODEL_CYBORG_RAT = (1 << 14),
>         EVDEV_MODEL_CYAPA = (1 << 15),
>         EVDEV_MODEL_ALPS_RUSHMORE = (1 << 16),
> +       EVDEV_MODEL_WACOM_SENSOR_OFFSET = (1 << 17),
>  };
>
>  struct mt_slot {
> diff --git a/test/tablet.c b/test/tablet.c
> index c5dc892..b1f7160 100644
> --- a/test/tablet.c
> +++ b/test/tablet.c
> @@ -1682,12 +1682,12 @@ START_TEST(motion_outside_bounds)
>         tablet_event = litest_is_tablet_event(event,
>
> LIBINPUT_EVENT_TABLET_TOOL_AXIS);
>         val = libinput_event_tablet_tool_get_x(tablet_event);
> -       ck_assert_double_lt(val, 0.0);
> +       ck_assert_double_eq(val, 0.0);
>         val = libinput_event_tablet_tool_get_y(tablet_event);
>         ck_assert_double_gt(val, 0.0);
>
>         val = libinput_event_tablet_tool_get_x_transformed(tablet_event,
> 100);
> -       ck_assert_double_lt(val, 0.0);
> +       ck_assert_double_eq(val, 0.0);
>
>         libinput_event_destroy(event);
>
> @@ -1703,10 +1703,10 @@ START_TEST(motion_outside_bounds)
>         val = libinput_event_tablet_tool_get_x(tablet_event);
>         ck_assert_double_gt(val, 0.0);
>         val = libinput_event_tablet_tool_get_y(tablet_event);
> -       ck_assert_double_lt(val, 0.0);
> +       ck_assert_double_eq(val, 0.0);
>
>         val = libinput_event_tablet_tool_get_y_transformed(tablet_event,
> 100);
> -       ck_assert_double_lt(val, 0.0);
> +       ck_assert_double_eq(val, 0.0);
>
>         libinput_event_destroy(event);
>  }
> diff --git a/udev/90-libinput-model-quirks.hwdb
> b/udev/90-libinput-model-quirks.hwdb
> index eb2859e..07fb23f 100644
> --- a/udev/90-libinput-model-quirks.hwdb
> +++ b/udev/90-libinput-model-quirks.hwdb
> @@ -131,3 +131,39 @@ libinput:name:SynPS/2 Synaptics
> TouchPad:dmi:*svnSystem76*pvrkudp1*
>  ##########################################
>  libinput:touchpad:input:b0003v056Ap*
>   LIBINPUT_MODEL_WACOM_TOUCHPAD=1
> +
> +# DTK2241
> +libinput:tablet:input:b0003v056Ap0057*
> +# DTK2242
> +libinput:tablet:input:b0003v056Ap0059*
> +# Cintiq 22HDT
> +libinput:tablet:input:b0003v056Ap005B*
> +# Cintiq 21UX2
> +libinput:tablet:input:b0003v056Ap00CC*
> +# Cintiq 24HD
> +libinput:tablet:input:b0003v056Ap00F4*
> +# Cintiq 24HDT
> +libinput:tablet:input:b0003v056Ap00F8*
> +# Cintiq 22HD
> +libinput:tablet:input:b0003v056Ap00FA*
> +# DTU1031
> +libinput:tablet:input:b0003v056Ap00FB*
> +# Cintiq 13HD
> +libinput:tablet:input:b0003v056Ap0304*
> +# ISDv4 307
> +libinput:tablet:input:b0003v056Ap0307*
> +# ISDv4 30A
> +libinput:tablet:input:b0003v056Ap030A*
> +# ISDv4 325
>

ISDv4 should be ISDv5.

Thank you.

Ping


> +libinput:tablet:input:b0003v056Ap0325*
> +# Cintiq 27QHD
> +libinput:tablet:input:b0003v056Ap032A*
> +# Cintiq 27QHDT
> +libinput:tablet:input:b0003v056Ap032B*
> +# DTU1031X
> +libinput:tablet:input:b0003v056Ap032F*
> +# Cintiq 13HDT
> +libinput:tablet:input:b0003v056Ap0333*
> +# DTU1141
> +libinput:tablet:input:b0003v056Ap0336*
> + LIBINPUT_MODEL_WACOM_SENSOR_OFFSET=1
> diff --git a/udev/90-libinput-model-quirks.rules.in b/udev/
> 90-libinput-model-quirks.rules.in
> index 8bff192..4e96bb3 100644
> --- a/udev/90-libinput-model-quirks.rules.in
> +++ b/udev/90-libinput-model-quirks.rules.in
> @@ -33,6 +33,10 @@ ENV{ID_INPUT_TOUCHPAD}=="1", \
>  ENV{ID_INPUT_MOUSE}=="1", \
>    IMPORT{builtin}="hwdb --subsystem=input --lookup-prefix=libinput:mouse:"
>
> +# libinput:tablet:<modalias>
> +ENV{ID_INPUT_TABLET}=="1", \
> +  IMPORT{builtin}="hwdb --subsystem=input
> --lookup-prefix=libinput:tablet:"
> +
>  # libinput:name:<name>:dmi:<dmi string>
>  KERNELS=="input*", \
>    IMPORT{builtin}="hwdb
> 'libinput:name:$attr{name}:$attr{[dmi/id]modalias}'"
> --
> 2.5.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20160216/79aea6da/attachment-0001.html>


More information about the wayland-devel mailing list