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; 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}'" -- 2.5.0 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel