[PATCH libinput 12/23] Sanitize distance and pressure axes before reporting their values
Stephen Chandler Paul
thatslyude at gmail.com
Thu Jun 12 20:28:33 PDT 2014
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 <thatslyude at gmail.com>
---
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);
+
+ /* 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
More information about the wayland-devel
mailing list