[PATCH libinput 7/7] test: add some tests for jumping fingers on touchpads

Peter Hutterer peter.hutterer at who-t.net
Wed Sep 17 21:20:23 PDT 2014


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

diff --git a/test/touchpad.c b/test/touchpad.c
index ea02f47..37df992 100644
--- a/test/touchpad.c
+++ b/test/touchpad.c
@@ -1623,6 +1623,255 @@ START_TEST(touchpad_palm_detect_no_palm_moving_into_edges)
 }
 END_TEST
 
+START_TEST(touchpad_jump_finger_up)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_drain_events(li);
+	litest_touch_down(dev, 0, 20, 30);
+	litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
+	litest_drain_events(li);
+
+	/* no motion event caused by jump*/
+	litest_touch_move_to(dev, 0, 90, 30, 20, 90, 1);
+	litest_touch_up(dev, 0);
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_jump_finger_up_2fg_scroll)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_drain_events(li);
+	litest_touch_down(dev, 0, 20, 30);
+	litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
+	litest_drain_events(li);
+
+	litest_push_event_frame(dev);
+	litest_touch_move_to(dev, 0, 90, 30, 20, 90, 1);
+	litest_touch_down(dev, 1, 50, 50);
+	litest_pop_event_frame(dev);
+
+	litest_assert_empty_queue(li);
+
+	/* Now move the first finger, expect scroll */
+	litest_touch_move_to(dev, 0, 90, 30, 20, 40, 10);
+	litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS, -1);
+}
+END_TEST
+
+START_TEST(touchpad_jump_finger_up_2fg_tap)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	libinput_device_config_tap_set_enabled(dev->libinput_device,
+					       LIBINPUT_CONFIG_TAP_ENABLED);
+
+	litest_drain_events(li);
+	litest_touch_down(dev, 0, 20, 30);
+	litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
+	litest_drain_events(li);
+
+	litest_push_event_frame(dev);
+	litest_touch_move_to(dev, 0, 90, 30, 20, 90, 1);
+	litest_touch_down(dev, 1, 50, 50);
+	litest_pop_event_frame(dev);
+
+	litest_assert_empty_queue(li);
+
+	/* expect two-finger tap */
+
+	litest_touch_up(dev, 0);
+	litest_touch_up(dev, 1);
+
+	litest_assert_button_event(li,
+				   BTN_RIGHT,
+				   LIBINPUT_BUTTON_STATE_PRESSED);
+	litest_assert_button_event(li,
+				   BTN_RIGHT,
+				   LIBINPUT_BUTTON_STATE_RELEASED);
+
+}
+END_TEST
+
+START_TEST(touchpad_jump_finger_up_release)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_drain_events(li);
+	litest_touch_down(dev, 0, 20, 30);
+	litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
+	litest_button_click(dev, BTN_LEFT, 1);
+	litest_drain_events(li);
+
+	/* send BTN_LEFT release on touch jump */
+	litest_push_event_frame(dev);
+	litest_touch_move_to(dev, 0, 90, 30, 20, 90, 1);
+	litest_event(dev, EV_KEY, BTN_LEFT, 0);
+	litest_pop_event_frame(dev);
+	litest_touch_up(dev, 0);
+
+	litest_assert_button_event(li,
+				   BTN_LEFT,
+				   LIBINPUT_BUTTON_STATE_RELEASED);
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_jump_finger_up_press)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_drain_events(li);
+	litest_touch_down(dev, 0, 20, 30);
+	litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
+	litest_drain_events(li);
+
+	/* send BTN_LEFT press on touch jump */
+	litest_push_event_frame(dev);
+	litest_touch_move_to(dev, 0, 90, 30, 20, 90, 1);
+	litest_event(dev, EV_KEY, BTN_LEFT, 1);
+	litest_pop_event_frame(dev);
+	litest_touch_up(dev, 0);
+
+	litest_assert_button_event(li,
+				   BTN_LEFT,
+				   LIBINPUT_BUTTON_STATE_PRESSED);
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_jump_finger_up_tap)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	struct libinput_event *event;
+	struct libinput_event_pointer *ptrev;
+
+	libinput_device_config_tap_set_enabled(dev->libinput_device,
+					       LIBINPUT_CONFIG_TAP_ENABLED);
+	litest_drain_events(li);
+	litest_touch_down(dev, 0, 20, 30);
+	litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
+	litest_drain_events(li);
+
+	/* jumping finger counts as new finger, so we get tap events */
+	litest_touch_move_to(dev, 0, 90, 30, 20, 90, 1);
+	litest_touch_up(dev, 0);
+
+	litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_BUTTON, -1);
+	event = libinput_get_event(li);
+	ptrev = libinput_event_get_pointer_event(event);
+	ck_assert_int_eq(libinput_event_pointer_get_button_state(ptrev),
+			 LIBINPUT_BUTTON_STATE_PRESSED);
+	libinput_event_destroy(event);
+
+	litest_timeout_tap(); /* tap timeout */
+	libinput_dispatch(li);
+
+	litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_BUTTON, -1);
+	event = libinput_get_event(li);
+	ptrev = libinput_event_get_pointer_event(event);
+	ck_assert_int_eq(libinput_event_pointer_get_button_state(ptrev),
+			 LIBINPUT_BUTTON_STATE_RELEASED);
+	libinput_event_destroy(event);
+}
+END_TEST
+
+START_TEST(touchpad_jump_finger_motion)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	struct libinput_event *ev;
+	struct libinput_event_pointer *ptrev;
+	enum libinput_event_type type;
+
+	litest_drain_events(li);
+	litest_touch_down(dev, 0, 20, 30);
+	litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
+	litest_drain_events(li);
+
+	litest_touch_move_to(dev, 0, 90, 30, 20, 80, 1);
+	litest_assert_empty_queue(li);
+	litest_touch_move_to(dev, 0, 20, 80, 80, 90, 50);
+	litest_touch_up(dev, 0);
+
+	/* expect lots of little events, no big jump */
+	litest_wait_for_event(li);
+	type = libinput_next_event_type(li);
+	do {
+		double dx, dy;
+		ck_assert_int_eq(type, LIBINPUT_EVENT_POINTER_MOTION);
+		ev = libinput_get_event(li);
+
+		ptrev = libinput_event_get_pointer_event(ev);
+		dx = libinput_event_pointer_get_dx(ptrev);
+		dy = libinput_event_pointer_get_dy(ptrev);
+		ck_assert_int_lt(abs(dx), 50);
+		ck_assert_int_lt(abs(dy), 50);
+
+		libinput_event_destroy(ev);
+		type = libinput_next_event_type(li);
+		libinput_dispatch(li);
+	} while (type != LIBINPUT_EVENT_NONE);
+}
+END_TEST
+
+START_TEST(touchpad_jump_finger_softbutton)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_drain_events(li);
+	litest_touch_down(dev, 0, 20, 30);
+	litest_touch_move_to(dev, 0, 20, 30, 90, 0, 10);
+	litest_drain_events(li);
+
+	/* send BTN_LEFT press on touch jump */
+	litest_push_event_frame(dev);
+	litest_touch_move_to(dev, 0, 90, 0, 90, 90, 1);
+	litest_event(dev, EV_KEY, BTN_LEFT, 1);
+	litest_pop_event_frame(dev);
+	litest_touch_up(dev, 0);
+
+	litest_assert_button_event(li,
+				   BTN_RIGHT,
+				   LIBINPUT_BUTTON_STATE_PRESSED);
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_jump_finger_2fg_clickfinger)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_drain_events(li);
+	litest_touch_down(dev, 0, 20, 30);
+	litest_touch_move_to(dev, 0, 20, 30, 90, 30, 10);
+	litest_drain_events(li);
+
+	/* send BTN_LEFT press on touch jump */
+	litest_push_event_frame(dev);
+	litest_touch_move_to(dev, 0, 90, 30, 90, 90, 1);
+	litest_touch_down(dev, 1, 70, 90);
+	litest_event(dev, EV_KEY, BTN_LEFT, 1);
+	litest_pop_event_frame(dev);
+	litest_touch_up(dev, 0);
+
+	litest_assert_button_event(li,
+				   BTN_RIGHT,
+				   LIBINPUT_BUTTON_STATE_PRESSED);
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
 int main(int argc, char **argv) {
 
 	litest_add("touchpad:motion", touchpad_1fg_motion, LITEST_TOUCHPAD, LITEST_ANY);
@@ -1689,5 +1938,15 @@ int main(int argc, char **argv) {
 	litest_add("touchpad:palm", touchpad_palm_detect_palm_stays_palm, LITEST_TOUCHPAD, LITEST_ANY);
 	litest_add("touchpad:palm", touchpad_palm_detect_no_palm_moving_into_edges, LITEST_TOUCHPAD, LITEST_ANY);
 
+	litest_add("touchpad:jumps", touchpad_jump_finger_up_2fg_tap, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:jumps", touchpad_jump_finger_up_2fg_scroll, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:jumps", touchpad_jump_finger_up_release, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:jumps", touchpad_jump_finger_up_press, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:jumps", touchpad_jump_finger_up_tap, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:jumps", touchpad_jump_finger_up, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:jumps", touchpad_jump_finger_motion, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:jumps", touchpad_jump_finger_softbutton, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
+	litest_add("touchpad:jumps", touchpad_jump_finger_2fg_clickfinger, LITEST_APPLE_CLICKPAD, LITEST_ANY);
+
 	return litest_run(argc, argv);
 }
-- 
1.9.3



More information about the wayland-devel mailing list