Hi,

On 16-02-16 06:47, Peter Hutterer 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.hutte...@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);
+
+       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;

This seems like an extra empty line accidentally got added. Otherwise this
patch looks good to me:

Reviewed-by: Hans de Goede <hdego...@redhat.com>

Regards,

Hans



        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
+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}'"

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to