[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