On Thu, Jun 12, 2014 at 11:28:33PM -0400, Stephen Chandler Paul wrote: > This commit changes two things with the way distance and pressure axes are > reported: > 1. Distance and pressure are made mutually exclusive. When there is a distance > event and a pressure event and the tool is in contact with the tablet, only > the pressure change will be reported. When the tool is not in contact and > both a distance and pressure change are received, only the distance update > will be received. > 2. Bad distance events are not reported to the caller. There is a certain > distance a tool can be from the tablet where the tablet recongnizes that a > tool appeared, but the tool doesn't send any useful information to the > tablet. When this happens, the distance will update to it's minimum or > maximum value, and no other axis updates will be sent. Since this can give > a caller the impression that the tool is within a useful proximity of the > tablet, we filter out any distance events with a value of maximum or > minimum > when the tool is not within useful proximity of the tablet. > > Signed-off-by: Stephen Chandler Paul <[email protected]> > --- > src/evdev-tablet.c | 34 ++++++++++++++++++++++++++++++++++ > src/evdev-tablet.h | 3 ++- > 2 files changed, 36 insertions(+), 1 deletion(-) > > diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c > index 8cb7d64..f42caab 100644 > --- a/src/evdev-tablet.c > +++ b/src/evdev-tablet.c > @@ -56,6 +56,9 @@ tablet_process_absolute(struct tablet_dispatch *tablet, > case ABS_PRESSURE: > case ABS_TILT_X: > case ABS_TILT_Y: > + tablet_unset_status(tablet, TABLET_TOOL_LEFT_PROXIMITY);
Only one request: please rename this to TABLET_TOOL_OUT_OF_PROXIMITY. My brain keeps wondering how proximity can be on the left even though I know what it should in this context. otherwise Reviewed-by: Peter Hutterer <[email protected]> Cheers, Peter > + > + /* Fall through */ > case ABS_DISTANCE: > axis = evcode_to_axis(e->code); > if (axis == LIBINPUT_TABLET_AXIS_NONE) { > @@ -314,6 +317,35 @@ tablet_notify_buttons(struct tablet_dispatch *tablet, > } > > static void > +sanitize_tablet_axes(struct tablet_dispatch *tablet) > +{ > + const struct input_absinfo *distance, > + *pressure; > + > + distance = tablet->absinfo[LIBINPUT_TABLET_AXIS_DISTANCE]; > + pressure = tablet->absinfo[LIBINPUT_TABLET_AXIS_PRESSURE]; > + > + /* Keep distance and pressure mutually exclusive. In addition, filter > + * out invalid distance events that can occur when the tablet tool is > + * close enough for the tablet to detect that's something's there, but > + * not close enough for it to actually receive data from the tool > + * properly > + */ > + if (bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_AXIS_DISTANCE) && > + ((bit_is_set(tablet->changed_axes, LIBINPUT_TABLET_AXIS_PRESSURE) && > + distance->value > distance->minimum && > + pressure->value > pressure->minimum) || > + (tablet_has_status(tablet, TABLET_TOOL_LEFT_PROXIMITY) && > + (distance->value <= distance->minimum || > + distance->value >= distance->maximum)))) { > + clear_bit(tablet->changed_axes, LIBINPUT_TABLET_AXIS_DISTANCE); > + } else if (bit_is_set(tablet->changed_axes, > LIBINPUT_TABLET_AXIS_PRESSURE) && > + !tablet_has_status(tablet, TABLET_STYLUS_IN_CONTACT)) { > + clear_bit(tablet->changed_axes, LIBINPUT_TABLET_AXIS_PRESSURE); > + } > +} > + > +static void > tablet_flush(struct tablet_dispatch *tablet, > struct evdev_device *device, > uint32_t time) > @@ -334,6 +366,7 @@ tablet_flush(struct tablet_dispatch *tablet, > } > > if (tablet_has_status(tablet, TABLET_AXES_UPDATED)) { > + sanitize_tablet_axes(tablet); > tablet_notify_axes(tablet, device, time); > tablet_unset_status(tablet, TABLET_AXES_UPDATED); > } > @@ -354,6 +387,7 @@ tablet_flush(struct tablet_dispatch *tablet, > /* We want button releases to be sent before the proximity out event */ > if (tablet_has_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY)) { > tablet_notify_proximity_out(&device->base, time); > + tablet_set_status(tablet, TABLET_TOOL_LEFT_PROXIMITY); > tablet_unset_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY); > } > > diff --git a/src/evdev-tablet.h b/src/evdev-tablet.h > index ffcf33c..5a27c8d 100644 > --- a/src/evdev-tablet.h > +++ b/src/evdev-tablet.h > @@ -34,7 +34,8 @@ enum tablet_status { > TABLET_TOOL_LEAVING_PROXIMITY = 1 << 2, > TABLET_BUTTONS_PRESSED = 1 << 3, > TABLET_BUTTONS_RELEASED = 1 << 4, > - TABLET_STYLUS_IN_CONTACT = 1 << 5 > + TABLET_STYLUS_IN_CONTACT = 1 << 5, > + TABLET_TOOL_LEFT_PROXIMITY = 1 << 6 > }; > > struct button_state { > -- > 1.8.5.5 > _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
