On Tue, Feb 16, 2016 at 12:39:09PM -0800, Ping Cheng wrote: > On Mon, Feb 15, 2016 at 9:47 PM, Peter Hutterer <peter.hutte...@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.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); > > > > 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.
hmm. good point. I forgot about calibration, that needs to be taken into account here but doning so gets a bit more complicated. I might just drop this patch for now and let the client worry about handling out-of-range coordinates. This was mostly supposed to be a convenience patch anyway. > > + > > + 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. huh, force of habit, sorry. Fixed locally. Cheers, Peter _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel