[PATCH libinput 9/9] test: add touch size palm detection tests

Peter Hutterer peter.hutterer at who-t.net
Wed Mar 29 04:59:08 UTC 2017


Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 test/test-touchpad.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 105 insertions(+), 10 deletions(-)

diff --git a/test/test-touchpad.c b/test/test-touchpad.c
index 7e36703..5b692a9 100644
--- a/test/test-touchpad.c
+++ b/test/test-touchpad.c
@@ -4957,15 +4957,12 @@ touchpad_has_touch_size(struct litest_device *dev)
 	return false;
 }
 
-/* Returns the touch-size thresholds in percent of the major axis. */
-static inline void
-touchpad_get_size_thresholds(struct litest_device *dev,
-			     double *low,
-			     double *high)
+static inline double
+touchpad_convert_mm_to_percent(struct litest_device *dev, double mm)
 {
 	struct libevdev *evdev = dev->evdev;
 	const struct input_absinfo *x, *major;
-	double lo = 1, hi = 5; /* mm */
+	double size;
 	int resolution;
 	int range;
 
@@ -4986,14 +4983,30 @@ touchpad_get_size_thresholds(struct litest_device *dev,
 	}
 
 	/* convert to device units along y */
-	lo = lo * resolution;
-	hi = hi * resolution;
+	size = mm * resolution;
 
 	/* convert to % of range of major */
 	major = libevdev_get_abs_info(evdev, ABS_MT_TOUCH_MAJOR);
 	range = major->maximum - major->minimum;
-	*low = lo / range * 100;
-	*high = hi / range * 100;
+	return size / range * 100.0;
+}
+
+/* Returns the touch-size thresholds in percent of the major axis. */
+static inline void
+touchpad_get_size_thresholds(struct litest_device *dev,
+			     double *low,
+			     double *high)
+{
+	*low = touchpad_convert_mm_to_percent(dev, 1);
+	*high = touchpad_convert_mm_to_percent(dev, 5);
+
+	litest_assert(*low < *high);
+}
+
+static inline double
+touchpad_get_palm_threshold(struct litest_device *dev)
+{
+	return touchpad_convert_mm_to_percent(dev, 17);
 }
 
 START_TEST(touchpad_touch_size_lo)
@@ -5193,6 +5206,86 @@ START_TEST(touchpad_touch_size_hi_2fg_lo)
 }
 END_TEST
 
+START_TEST(touchpad_palm_detect_touch_size_vertical)
+{
+       struct litest_device *dev = litest_current_device();
+       struct libinput *li = dev->libinput;
+       double lo, hi, palm;
+       struct axis_replacement axes[] = {
+               { ABS_MT_TOUCH_MAJOR, 0 },
+               { ABS_MT_TOUCH_MINOR, 0 },
+               { -1, 0 }
+       };
+
+       if (!touchpad_has_touch_size(dev))
+               return;
+
+       touchpad_get_size_thresholds(dev, &lo, &hi);
+       palm = touchpad_get_palm_threshold(dev);
+
+       litest_drain_events(li);
+       litest_axis_set_value(axes, ABS_MT_TOUCH_MAJOR, hi * 1.2);
+       litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, hi * 1.2);
+       litest_touch_down_extended(dev, 0, 50, 50, axes);
+       litest_touch_move_to_extended(dev, 0,
+                                     50, 50,
+                                     80, 80,
+                                     axes, 10, 1);
+       litest_assert_only_typed_events(li,
+                                       LIBINPUT_EVENT_POINTER_MOTION);
+
+       /* rotation is still vertical, no palm detection */
+
+       litest_axis_set_value_unchecked(axes, ABS_MT_TOUCH_MAJOR, palm * 1.2);
+       litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, hi * 1.2);
+       litest_touch_move_to_extended(dev, 0,
+                                     80, 80,
+                                     50, 50,
+                                     axes, 10, 1);
+       litest_assert_only_typed_events(li,
+                                       LIBINPUT_EVENT_POINTER_MOTION);
+}
+END_TEST
+
+START_TEST(touchpad_palm_detect_touch_size_horizontal)
+{
+       struct litest_device *dev = litest_current_device();
+       struct libinput *li = dev->libinput;
+       double lo, hi, palm;
+       struct axis_replacement axes[] = {
+               { ABS_MT_TOUCH_MAJOR, 0 },
+               { ABS_MT_TOUCH_MINOR, 0 },
+               { ABS_MT_ORIENTATION, 100 },
+               { -1, 0 }
+       };
+
+       if (!touchpad_has_touch_size(dev))
+               return;
+
+       touchpad_get_size_thresholds(dev, &lo, &hi);
+       palm = touchpad_get_palm_threshold(dev);
+
+       litest_drain_events(li);
+       litest_axis_set_value(axes, ABS_MT_TOUCH_MAJOR, hi * 1.2);
+       litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, hi * 1.2);
+       litest_touch_down_extended(dev, 0, 50, 50, axes);
+       litest_touch_move_to_extended(dev, 0,
+                                     50, 50,
+                                     80, 80,
+                                     axes, 10, 1);
+       litest_assert_only_typed_events(li,
+                                       LIBINPUT_EVENT_POINTER_MOTION);
+
+       litest_axis_set_value_unchecked(axes, ABS_MT_TOUCH_MAJOR, palm * 1.1);
+       litest_axis_set_value(axes, ABS_MT_TOUCH_MINOR, hi * 1.2);
+       litest_touch_move_to_extended(dev, 0,
+                                     80, 80,
+                                     50, 50,
+                                     axes, 10, 1);
+       litest_assert_empty_queue(li);
+}
+END_TEST
+
 void
 litest_setup_tests_touchpad(void)
 {
@@ -5239,6 +5332,8 @@ litest_setup_tests_touchpad(void)
 	litest_add("touchpad:palm", touchpad_no_palm_detect_at_edge_for_edge_scrolling, LITEST_TOUCHPAD, LITEST_CLICKPAD);
 	litest_add("touchpad:palm", touchpad_no_palm_detect_2fg_scroll, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
 	litest_add("touchpad:palm", touchpad_palm_detect_both_edges, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:palm", touchpad_palm_detect_touch_size_vertical, LITEST_APPLE_CLICKPAD, LITEST_ANY);
+	litest_add("touchpad:palm", touchpad_palm_detect_touch_size_horizontal, LITEST_APPLE_CLICKPAD, LITEST_ANY);
 
 	litest_add("touchpad:left-handed", touchpad_left_handed, LITEST_TOUCHPAD|LITEST_BUTTON, LITEST_CLICKPAD);
 	litest_add_for_device("touchpad:left-handed", touchpad_left_handed_appletouch, LITEST_APPLETOUCH);
-- 
2.9.3



More information about the wayland-devel mailing list