[PATCH libinput 3/6] test: split scroll tests out of the main touchpad tests

Peter Hutterer peter.hutterer at who-t.net
Tue Jul 19 03:18:54 UTC 2016


A set of long-running tests better off in their own binary for parallelization

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 test/Makefile.am       |   5 +
 test/touchpad-scroll.c | 873 +++++++++++++++++++++++++++++++++++++++++++++++++
 test/touchpad.c        | 845 -----------------------------------------------
 3 files changed, 878 insertions(+), 845 deletions(-)
 create mode 100644 test/touchpad-scroll.c

diff --git a/test/Makefile.am b/test/Makefile.am
index be9c1df..9ea8e5e 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -79,6 +79,7 @@ endif
 
 run_tests = \
 	touchpad.test \
+	touchpad-scroll.test \
 	touchpad-tap.test \
 	touchpad-tap-1fg.test \
 	touchpad-buttons.test \
@@ -141,6 +142,10 @@ touchpad_test_SOURCES = touchpad.c
 touchpad_test_LDADD = $(TEST_LIBS)
 touchpad_test_LDFLAGS = -no-install
 
+touchpad_scroll_test_SOURCES = touchpad-scroll.c
+touchpad_scroll_test_LDADD = $(TEST_LIBS)
+touchpad_scroll_test_LDFLAGS = -no-install
+
 touchpad_tap_test_SOURCES = touchpad-tap.c
 touchpad_tap_test_LDADD = $(TEST_LIBS)
 touchpad_tap_test_LDFLAGS = -no-install
diff --git a/test/touchpad-scroll.c b/test/touchpad-scroll.c
new file mode 100644
index 0000000..7310fda
--- /dev/null
+++ b/test/touchpad-scroll.c
@@ -0,0 +1,873 @@
+/*
+ * Copyright © 2014 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <check.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <libinput.h>
+#include <unistd.h>
+
+#include "libinput-util.h"
+#include "litest.h"
+
+static void
+test_2fg_scroll(struct litest_device *dev, double dx, double dy, int want_sleep)
+{
+	struct libinput *li = dev->libinput;
+
+	litest_touch_down(dev, 0, 49, 50);
+	litest_touch_down(dev, 1, 51, 50);
+
+	litest_touch_move_two_touches(dev, 49, 50, 51, 50, dx, dy, 10, 0);
+
+	/* Avoid a small scroll being seen as a tap */
+	if (want_sleep) {
+		libinput_dispatch(li);
+		litest_timeout_tap();
+		libinput_dispatch(li);
+	}
+
+	litest_touch_up(dev, 1);
+	litest_touch_up(dev, 0);
+
+	libinput_dispatch(li);
+}
+
+START_TEST(touchpad_2fg_scroll)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	if (!litest_has_2fg_scroll(dev))
+		return;
+
+	litest_enable_2fg_scroll(dev);
+	litest_drain_events(li);
+
+	test_2fg_scroll(dev, 0.1, 40, 0);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, 10);
+	test_2fg_scroll(dev, 0.1, -40, 0);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, -10);
+	test_2fg_scroll(dev, 40, 0.1, 0);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, 10);
+	test_2fg_scroll(dev, -40, 0.1, 0);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, -10);
+
+	/* 2fg scroll smaller than the threshold should not generate events */
+	test_2fg_scroll(dev, 0.1, 0.1, 1);
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_2fg_scroll_diagonal)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	struct libinput_event *event;
+	struct libinput_event_pointer *ptrev;
+	int i;
+
+	if (!litest_has_2fg_scroll(dev))
+		return;
+
+	litest_enable_2fg_scroll(dev);
+	litest_drain_events(li);
+
+	litest_touch_down(dev, 0, 45, 30);
+	litest_touch_down(dev, 1, 55, 30);
+
+	litest_touch_move_two_touches(dev, 45, 30, 55, 30, 10, 10, 10, 0);
+	libinput_dispatch(li);
+	litest_wait_for_event_of_type(li,
+				      LIBINPUT_EVENT_POINTER_AXIS,
+				      -1);
+	litest_drain_events(li);
+
+	/* get rid of any touch history still adding x deltas sideways */
+	for (i = 0; i < 5; i++)
+		litest_touch_move(dev, 0, 55, 41 + i);
+	litest_drain_events(li);
+
+	for (i = 6; i < 10; i++) {
+		litest_touch_move(dev, 0, 55, 41 + i);
+		libinput_dispatch(li);
+
+		event = libinput_get_event(li);
+		ptrev = litest_is_axis_event(event,
+				LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
+				LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
+		ck_assert(!libinput_event_pointer_has_axis(ptrev,
+				LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL));
+		libinput_event_destroy(event);
+	}
+
+	litest_touch_up(dev, 1);
+	litest_touch_up(dev, 0);
+	libinput_dispatch(li);
+}
+END_TEST
+
+START_TEST(touchpad_2fg_scroll_slow_distance)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	struct libinput_event *event;
+	struct libinput_event_pointer *ptrev;
+	double width, height;
+	double y_move = 100;
+
+	if (!litest_has_2fg_scroll(dev))
+		return;
+
+	/* We want to move > 5 mm. */
+	ck_assert_int_eq(libinput_device_get_size(dev->libinput_device,
+						  &width,
+						  &height), 0);
+	y_move = 100.0/height * 7;
+
+	litest_enable_2fg_scroll(dev);
+	litest_drain_events(li);
+
+	litest_touch_down(dev, 0, 49, 50);
+	litest_touch_down(dev, 1, 51, 50);
+	litest_touch_move_two_touches(dev, 49, 50, 51, 50, 0, y_move, 100, 10);
+	litest_touch_up(dev, 1);
+	litest_touch_up(dev, 0);
+	libinput_dispatch(li);
+
+	event = libinput_get_event(li);
+	ck_assert_notnull(event);
+
+	/* last event is value 0, tested elsewhere */
+	while (libinput_next_event_type(li) != LIBINPUT_EVENT_NONE) {
+		double axisval;
+		ck_assert_int_eq(libinput_event_get_type(event),
+				 LIBINPUT_EVENT_POINTER_AXIS);
+		ptrev = libinput_event_get_pointer_event(event);
+
+		axisval = libinput_event_pointer_get_axis_value(ptrev,
+				LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
+		ck_assert(axisval > 0.0);
+
+		/* this is to verify we test the right thing, if the value
+		   is greater than scroll.threshold we triggered the wrong
+		   condition */
+		ck_assert(axisval < 5.0);
+
+		libinput_event_destroy(event);
+		event = libinput_get_event(li);
+	}
+
+	litest_assert_empty_queue(li);
+	libinput_event_destroy(event);
+}
+END_TEST
+
+START_TEST(touchpad_2fg_scroll_source)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	struct libinput_event *event;
+	struct libinput_event_pointer *ptrev;
+
+	if (!litest_has_2fg_scroll(dev))
+		return;
+
+	litest_enable_2fg_scroll(dev);
+	litest_drain_events(li);
+
+	test_2fg_scroll(dev, 0, 30, 0);
+	litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS, -1);
+
+	while ((event = libinput_get_event(li))) {
+		ck_assert_int_eq(libinput_event_get_type(event),
+				 LIBINPUT_EVENT_POINTER_AXIS);
+		ptrev = libinput_event_get_pointer_event(event);
+		ck_assert_int_eq(libinput_event_pointer_get_axis_source(ptrev),
+				 LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
+		libinput_event_destroy(event);
+	}
+}
+END_TEST
+
+START_TEST(touchpad_2fg_scroll_semi_mt)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	if (!litest_has_2fg_scroll(dev))
+		return;
+
+	litest_enable_2fg_scroll(dev);
+	litest_drain_events(li);
+
+	litest_touch_down(dev, 0, 20, 20);
+	litest_touch_down(dev, 1, 30, 20);
+	libinput_dispatch(li);
+	litest_touch_move_two_touches(dev,
+				      20, 20,
+				      30, 20,
+				      30, 40,
+				      10, 1);
+
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
+}
+END_TEST
+
+START_TEST(touchpad_2fg_scroll_return_to_motion)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	if (!litest_has_2fg_scroll(dev))
+		return;
+
+	litest_enable_2fg_scroll(dev);
+	litest_drain_events(li);
+
+	/* start with motion */
+	litest_touch_down(dev, 0, 70, 70);
+	litest_touch_move_to(dev, 0, 70, 70, 49, 50, 10, 0);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
+
+	/* 2fg scroll */
+	litest_touch_down(dev, 1, 51, 50);
+	litest_touch_move_two_touches(dev, 49, 50, 51, 50, 0, 20, 5, 0);
+	litest_touch_up(dev, 1);
+	libinput_dispatch(li);
+	litest_timeout_finger_switch();
+	libinput_dispatch(li);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
+
+	litest_touch_move_to(dev, 0, 49, 70, 49, 50, 10, 0);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
+
+	/* back to 2fg scroll, lifting the other finger */
+	litest_touch_down(dev, 1, 51, 50);
+	litest_touch_move_two_touches(dev, 49, 50, 51, 50, 0, 20, 5, 0);
+	litest_touch_up(dev, 0);
+	libinput_dispatch(li);
+	litest_timeout_finger_switch();
+	libinput_dispatch(li);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
+
+	/* move with second finger */
+	litest_touch_move_to(dev, 1, 51, 70, 51, 50, 10, 0);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
+
+	litest_touch_up(dev, 1);
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_scroll_natural_defaults)
+{
+	struct litest_device *dev = litest_current_device();
+
+	ck_assert_int_ge(libinput_device_config_scroll_has_natural_scroll(dev->libinput_device), 1);
+	ck_assert_int_eq(libinput_device_config_scroll_get_natural_scroll_enabled(dev->libinput_device), 0);
+	ck_assert_int_eq(libinput_device_config_scroll_get_default_natural_scroll_enabled(dev->libinput_device), 0);
+}
+END_TEST
+
+START_TEST(touchpad_scroll_natural_enable_config)
+{
+	struct litest_device *dev = litest_current_device();
+	enum libinput_config_status status;
+
+	status = libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device, 1);
+	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
+	ck_assert_int_eq(libinput_device_config_scroll_get_natural_scroll_enabled(dev->libinput_device), 1);
+
+	status = libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device, 0);
+	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
+	ck_assert_int_eq(libinput_device_config_scroll_get_natural_scroll_enabled(dev->libinput_device), 0);
+}
+END_TEST
+
+START_TEST(touchpad_scroll_natural_2fg)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	if (!litest_has_2fg_scroll(dev))
+		return;
+
+	litest_enable_2fg_scroll(dev);
+	litest_drain_events(li);
+
+	libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device, 1);
+
+	test_2fg_scroll(dev, 0.1, 40, 0);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, -10);
+	test_2fg_scroll(dev, 0.1, -40, 0);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, 10);
+	test_2fg_scroll(dev, 40, 0.1, 0);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, -10);
+	test_2fg_scroll(dev, -40, 0.1, 0);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, 10);
+
+}
+END_TEST
+
+START_TEST(touchpad_scroll_natural_edge)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_enable_edge_scroll(dev);
+	litest_drain_events(li);
+
+	libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device, 1);
+
+	litest_touch_down(dev, 0, 99, 20);
+	litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10, 0);
+	litest_touch_up(dev, 0);
+
+	libinput_dispatch(li);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, -4);
+	litest_assert_empty_queue(li);
+
+	litest_touch_down(dev, 0, 99, 80);
+	litest_touch_move_to(dev, 0, 99, 80, 99, 20, 10, 0);
+	litest_touch_up(dev, 0);
+
+	libinput_dispatch(li);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, 4);
+	litest_assert_empty_queue(li);
+
+}
+END_TEST
+
+START_TEST(touchpad_edge_scroll_vert)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_drain_events(li);
+	litest_enable_edge_scroll(dev);
+
+	litest_touch_down(dev, 0, 99, 20);
+	litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10, 0);
+	litest_touch_up(dev, 0);
+
+	libinput_dispatch(li);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, 4);
+	litest_assert_empty_queue(li);
+
+	litest_touch_down(dev, 0, 99, 80);
+	litest_touch_move_to(dev, 0, 99, 80, 99, 20, 10, 0);
+	litest_touch_up(dev, 0);
+
+	libinput_dispatch(li);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, -4);
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+static int
+touchpad_has_horiz_edge_scroll_size(struct litest_device *dev)
+{
+	double width, height;
+	int rc;
+
+	rc = libinput_device_get_size(dev->libinput_device, &width, &height);
+
+	return rc == 0 && height >= 50;
+}
+
+START_TEST(touchpad_edge_scroll_horiz)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	if (!touchpad_has_horiz_edge_scroll_size(dev))
+		return;
+
+	litest_drain_events(li);
+	litest_enable_edge_scroll(dev);
+
+	litest_touch_down(dev, 0, 20, 99);
+	litest_touch_move_to(dev, 0, 20, 99, 70, 99, 10, 0);
+	litest_touch_up(dev, 0);
+
+	libinput_dispatch(li);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, 4);
+	litest_assert_empty_queue(li);
+
+	litest_touch_down(dev, 0, 70, 99);
+	litest_touch_move_to(dev, 0, 70, 99, 20, 99, 10, 0);
+	litest_touch_up(dev, 0);
+
+	libinput_dispatch(li);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, -4);
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_edge_scroll_horiz_clickpad)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_drain_events(li);
+	litest_enable_edge_scroll(dev);
+
+	litest_touch_down(dev, 0, 20, 99);
+	litest_touch_move_to(dev, 0, 20, 99, 70, 99, 10, 0);
+	litest_touch_up(dev, 0);
+
+	libinput_dispatch(li);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, 4);
+	litest_assert_empty_queue(li);
+
+	litest_touch_down(dev, 0, 70, 99);
+	litest_touch_move_to(dev, 0, 70, 99, 20, 99, 10, 0);
+	litest_touch_up(dev, 0);
+
+	libinput_dispatch(li);
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, -4);
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_edge_scroll_no_horiz)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	if (touchpad_has_horiz_edge_scroll_size(dev))
+		return;
+
+	litest_drain_events(li);
+	litest_enable_edge_scroll(dev);
+
+	litest_touch_down(dev, 0, 20, 99);
+	litest_touch_move_to(dev, 0, 20, 99, 70, 99, 10, 0);
+	litest_touch_up(dev, 0);
+
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
+
+	litest_touch_down(dev, 0, 70, 99);
+	litest_touch_move_to(dev, 0, 70, 99, 20, 99, 10, 0);
+	litest_touch_up(dev, 0);
+
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
+}
+END_TEST
+
+START_TEST(touchpad_scroll_defaults)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput_device *device = dev->libinput_device;
+	struct libevdev *evdev = dev->evdev;
+	enum libinput_config_scroll_method method, expected;
+	enum libinput_config_status status;
+
+	method = libinput_device_config_scroll_get_methods(device);
+	ck_assert(method & LIBINPUT_CONFIG_SCROLL_EDGE);
+	if (libevdev_get_num_slots(evdev) > 1)
+		ck_assert(method & LIBINPUT_CONFIG_SCROLL_2FG);
+	else
+		ck_assert((method & LIBINPUT_CONFIG_SCROLL_2FG) == 0);
+
+	if (libevdev_get_num_slots(evdev) > 1)
+		expected = LIBINPUT_CONFIG_SCROLL_2FG;
+	else
+		expected = LIBINPUT_CONFIG_SCROLL_EDGE;
+
+	method = libinput_device_config_scroll_get_method(device);
+	ck_assert_int_eq(method, expected);
+	method = libinput_device_config_scroll_get_default_method(device);
+	ck_assert_int_eq(method, expected);
+
+	status = libinput_device_config_scroll_set_method(device,
+					  LIBINPUT_CONFIG_SCROLL_EDGE);
+	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
+	status = libinput_device_config_scroll_set_method(device,
+					  LIBINPUT_CONFIG_SCROLL_2FG);
+
+	if (libevdev_get_num_slots(evdev) > 1)
+		ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
+	else
+		ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
+}
+END_TEST
+
+START_TEST(touchpad_edge_scroll_timeout)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	struct libinput_event *event;
+	struct libinput_event_pointer *ptrev;
+	double width = 0, height = 0;
+	int nevents = 0;
+	double mm; /* one mm in percent of the device */
+
+	ck_assert_int_eq(libinput_device_get_size(dev->libinput_device,
+						  &width,
+						  &height), 0);
+	mm = 100.0/height;
+
+	/* timeout-based scrolling is disabled when software buttons are
+	 * active, so switch to clickfinger. Not all test devices support
+	 * that, hence the extra check. */
+	if (libinput_device_config_click_get_methods(dev->libinput_device) &
+	    LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER)
+		litest_enable_clickfinger(dev);
+
+	litest_drain_events(li);
+	litest_enable_edge_scroll(dev);
+
+	/* move 0.5mm, enough to load up the motion history, but less than
+	 * the scroll threshold of 2mm */
+	litest_touch_down(dev, 0, 99, 20);
+	litest_touch_move_to(dev, 0, 99, 20, 99, 20 + mm/2, 8, 0);
+	libinput_dispatch(li);
+	litest_assert_empty_queue(li);
+
+	litest_timeout_edgescroll();
+	libinput_dispatch(li);
+
+	litest_assert_empty_queue(li);
+
+	/* now move slowly up to the 2mm scroll threshold. we expect events */
+	litest_touch_move_to(dev, 0, 99, 20 + mm/2, 99, 20 + mm * 2, 20, 0);
+	litest_touch_up(dev, 0);
+	libinput_dispatch(li);
+
+	litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS, -1);
+
+	while ((event = libinput_get_event(li))) {
+		double value;
+
+		ptrev = litest_is_axis_event(event,
+					     LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
+					     0);
+		value = libinput_event_pointer_get_axis_value(ptrev,
+							      LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
+		ck_assert_double_lt(value, 5.0);
+		libinput_event_destroy(event);
+		nevents++;
+	}
+
+	/* we sent 20 events but allow for some to be swallowed by rounding
+	 * errors, the hysteresis, etc. */
+	ck_assert_int_ge(nevents, 10);
+
+	litest_assert_empty_queue(li);
+	libinput_event_destroy(event);
+}
+END_TEST
+
+START_TEST(touchpad_edge_scroll_no_motion)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_drain_events(li);
+	litest_enable_edge_scroll(dev);
+
+	litest_touch_down(dev, 0, 99, 10);
+	litest_touch_move_to(dev, 0, 99, 10, 99, 70, 12, 0);
+	/* moving outside -> no motion event */
+	litest_touch_move_to(dev, 0, 99, 70, 20, 80, 12, 0);
+	/* moving down outside edge once scrolling had started -> scroll */
+	litest_touch_move_to(dev, 0, 20, 80, 40, 99, 12, 0);
+	litest_touch_up(dev, 0);
+	libinput_dispatch(li);
+
+	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, 4);
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_edge_scroll_no_edge_after_motion)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_drain_events(li);
+	litest_enable_edge_scroll(dev);
+
+	/* moving into the edge zone must not trigger scroll events */
+	litest_touch_down(dev, 0, 20, 20);
+	litest_touch_move_to(dev, 0, 20, 20, 99, 20, 12, 0);
+	litest_touch_move_to(dev, 0, 99, 20, 99, 80, 12, 0);
+	litest_touch_up(dev, 0);
+	libinput_dispatch(li);
+
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_edge_scroll_source)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	struct libinput_event *event;
+	struct libinput_event_pointer *ptrev;
+
+	litest_drain_events(li);
+	litest_enable_edge_scroll(dev);
+
+	litest_touch_down(dev, 0, 99, 20);
+	litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10, 0);
+	litest_touch_up(dev, 0);
+
+	litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS, -1);
+
+	while ((event = libinput_get_event(li))) {
+		ck_assert_int_eq(libinput_event_get_type(event),
+				 LIBINPUT_EVENT_POINTER_AXIS);
+		ptrev = libinput_event_get_pointer_event(event);
+		ck_assert_int_eq(libinput_event_pointer_get_axis_source(ptrev),
+				 LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
+		libinput_event_destroy(event);
+	}
+}
+END_TEST
+
+START_TEST(touchpad_edge_scroll_no_2fg)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_drain_events(li);
+	litest_enable_edge_scroll(dev);
+
+	litest_touch_down(dev, 0, 49, 50);
+	litest_touch_down(dev, 1, 51, 50);
+	litest_touch_move_two_touches(dev, 49, 50, 51, 50, 20, 30, 5, 0);
+	libinput_dispatch(li);
+	litest_touch_up(dev, 0);
+	litest_touch_up(dev, 1);
+	libinput_dispatch(li);
+
+	litest_assert_empty_queue(li);
+}
+END_TEST
+
+START_TEST(touchpad_edge_scroll_into_buttonareas)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_enable_buttonareas(dev);
+	litest_enable_edge_scroll(dev);
+	litest_drain_events(li);
+
+	litest_touch_down(dev, 0, 99, 40);
+	litest_touch_move_to(dev, 0, 99, 40, 99, 95, 10, 0);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
+	/* in the button zone now, make sure we still get events */
+	litest_touch_move_to(dev, 0, 99, 95, 99, 100, 10, 0);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
+
+	/* and out of the zone again */
+	litest_touch_move_to(dev, 0, 99, 100, 99, 70, 10, 0);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
+
+	/* still out of the zone */
+	litest_touch_move_to(dev, 0, 99, 70, 99, 50, 10, 0);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
+}
+END_TEST
+
+START_TEST(touchpad_edge_scroll_within_buttonareas)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_enable_buttonareas(dev);
+	litest_enable_edge_scroll(dev);
+	litest_drain_events(li);
+
+	litest_touch_down(dev, 0, 20, 99);
+
+	/* within left button */
+	litest_touch_move_to(dev, 0, 20, 99, 40, 99, 10, 0);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
+
+	/* over to right button */
+	litest_touch_move_to(dev, 0, 40, 99, 60, 99, 10, 0);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
+
+	/* within right button */
+	litest_touch_move_to(dev, 0, 60, 99, 80, 99, 10, 0);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
+}
+END_TEST
+
+START_TEST(touchpad_edge_scroll_buttonareas_click_stops_scroll)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	struct libinput_event *event;
+	struct libinput_event_pointer *ptrev;
+	double val;
+
+	litest_enable_buttonareas(dev);
+	litest_enable_edge_scroll(dev);
+	litest_drain_events(li);
+
+	litest_touch_down(dev, 0, 20, 95);
+	litest_touch_move_to(dev, 0, 20, 95, 70, 95, 10, 5);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
+
+	litest_button_click(dev, BTN_LEFT, true);
+	libinput_dispatch(li);
+
+	event = libinput_get_event(li);
+	ptrev = litest_is_axis_event(event,
+				     LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
+				     LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
+	val = libinput_event_pointer_get_axis_value(ptrev,
+				    LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
+	ck_assert(val == 0.0);
+	libinput_event_destroy(event);
+
+	event = libinput_get_event(li);
+	ptrev = litest_is_button_event(event,
+				       BTN_RIGHT,
+				       LIBINPUT_BUTTON_STATE_PRESSED);
+
+	libinput_event_destroy(event);
+
+	/* within button areas -> no movement */
+	litest_touch_move_to(dev, 0, 70, 95, 90, 95, 10, 0);
+	litest_assert_empty_queue(li);
+
+	litest_button_click(dev, BTN_LEFT, false);
+
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
+
+	litest_touch_up(dev, 0);
+}
+END_TEST
+
+START_TEST(touchpad_edge_scroll_clickfinger_click_stops_scroll)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+	struct libinput_event *event;
+	struct libinput_event_pointer *ptrev;
+	double val;
+
+	litest_enable_clickfinger(dev);
+	litest_enable_edge_scroll(dev);
+	litest_drain_events(li);
+
+	litest_touch_down(dev, 0, 20, 95);
+	litest_touch_move_to(dev, 0, 20, 95, 70, 95, 10, 5);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
+
+	litest_button_click(dev, BTN_LEFT, true);
+	libinput_dispatch(li);
+
+	event = libinput_get_event(li);
+	ptrev = litest_is_axis_event(event,
+				     LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
+				     LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
+	val = libinput_event_pointer_get_axis_value(ptrev,
+				    LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
+	ck_assert(val == 0.0);
+	libinput_event_destroy(event);
+
+	event = libinput_get_event(li);
+	ptrev = litest_is_button_event(event,
+				       BTN_LEFT,
+				       LIBINPUT_BUTTON_STATE_PRESSED);
+
+	libinput_event_destroy(event);
+
+	/* clickfinger releases pointer -> expect movement */
+	litest_touch_move_to(dev, 0, 70, 95, 90, 95, 10, 0);
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
+	litest_assert_empty_queue(li);
+
+	litest_button_click(dev, BTN_LEFT, false);
+
+	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
+
+	litest_touch_up(dev, 0);
+}
+END_TEST
+
+START_TEST(touchpad_edge_scroll_into_area)
+{
+	struct litest_device *dev = litest_current_device();
+	struct libinput *li = dev->libinput;
+
+	litest_enable_edge_scroll(dev);
+	litest_drain_events(li);
+
+	/* move into area, move vertically, move back to edge */
+
+	litest_touch_down(dev, 0, 99, 20);
+	litest_touch_move_to(dev, 0, 99, 20, 99, 50, 15, 2);
+	litest_touch_move_to(dev, 0, 99, 50, 20, 50, 15, 2);
+	litest_assert_only_typed_events(li,
+					LIBINPUT_EVENT_POINTER_AXIS);
+	litest_touch_move_to(dev, 0, 20, 50, 20, 20, 15, 2);
+	litest_touch_move_to(dev, 0, 20, 20, 99, 20, 15, 2);
+	litest_assert_empty_queue(li);
+
+	litest_touch_move_to(dev, 0, 99, 20, 99, 50, 15, 2);
+	litest_assert_only_typed_events(li,
+					LIBINPUT_EVENT_POINTER_AXIS);
+}
+END_TEST
+
+void
+litest_setup_tests(void)
+{
+	litest_add("touchpad:scroll", touchpad_2fg_scroll, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH|LITEST_SEMI_MT);
+	litest_add("touchpad:scroll", touchpad_2fg_scroll_diagonal, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH|LITEST_SEMI_MT);
+	litest_add("touchpad:scroll", touchpad_2fg_scroll_slow_distance, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:scroll", touchpad_2fg_scroll_return_to_motion, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:scroll", touchpad_2fg_scroll_source, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:scroll", touchpad_2fg_scroll_semi_mt, LITEST_SEMI_MT, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:scroll", touchpad_scroll_natural_defaults, LITEST_TOUCHPAD, LITEST_ANY);
+	litest_add("touchpad:scroll", touchpad_scroll_natural_enable_config, LITEST_TOUCHPAD, LITEST_ANY);
+	litest_add("touchpad:scroll", touchpad_scroll_natural_2fg, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:scroll", touchpad_scroll_natural_edge, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:scroll", touchpad_scroll_defaults, LITEST_TOUCHPAD, LITEST_ANY);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_vert, LITEST_TOUCHPAD, LITEST_ANY);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_horiz, LITEST_TOUCHPAD, LITEST_CLICKPAD);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_horiz_clickpad, LITEST_CLICKPAD, LITEST_ANY);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_no_horiz, LITEST_TOUCHPAD, LITEST_CLICKPAD);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_no_motion, LITEST_TOUCHPAD, LITEST_ANY);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_no_edge_after_motion, LITEST_TOUCHPAD, LITEST_ANY);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_timeout, LITEST_TOUCHPAD, LITEST_ANY);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_source, LITEST_TOUCHPAD, LITEST_ANY);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_no_2fg, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_into_buttonareas, LITEST_CLICKPAD, LITEST_ANY);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_within_buttonareas, LITEST_CLICKPAD, LITEST_ANY);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_buttonareas_click_stops_scroll, LITEST_CLICKPAD, LITEST_ANY);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_clickfinger_click_stops_scroll, LITEST_CLICKPAD, LITEST_ANY);
+	litest_add("touchpad:scroll", touchpad_edge_scroll_into_area, LITEST_TOUCHPAD, LITEST_ANY);
+}
diff --git a/test/touchpad.c b/test/touchpad.c
index 57e4712..12f1926 100644
--- a/test/touchpad.c
+++ b/test/touchpad.c
@@ -95,825 +95,6 @@ START_TEST(touchpad_2fg_no_motion)
 }
 END_TEST
 
-static void
-test_2fg_scroll(struct litest_device *dev, double dx, double dy, int want_sleep)
-{
-	struct libinput *li = dev->libinput;
-
-	litest_touch_down(dev, 0, 49, 50);
-	litest_touch_down(dev, 1, 51, 50);
-
-	litest_touch_move_two_touches(dev, 49, 50, 51, 50, dx, dy, 10, 0);
-
-	/* Avoid a small scroll being seen as a tap */
-	if (want_sleep) {
-		libinput_dispatch(li);
-		litest_timeout_tap();
-		libinput_dispatch(li);
-	}
-
-	litest_touch_up(dev, 1);
-	litest_touch_up(dev, 0);
-
-	libinput_dispatch(li);
-}
-
-START_TEST(touchpad_2fg_scroll)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	if (!litest_has_2fg_scroll(dev))
-		return;
-
-	litest_enable_2fg_scroll(dev);
-	litest_drain_events(li);
-
-	test_2fg_scroll(dev, 0.1, 40, 0);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, 10);
-	test_2fg_scroll(dev, 0.1, -40, 0);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, -10);
-	test_2fg_scroll(dev, 40, 0.1, 0);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, 10);
-	test_2fg_scroll(dev, -40, 0.1, 0);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, -10);
-
-	/* 2fg scroll smaller than the threshold should not generate events */
-	test_2fg_scroll(dev, 0.1, 0.1, 1);
-	litest_assert_empty_queue(li);
-}
-END_TEST
-
-START_TEST(touchpad_2fg_scroll_diagonal)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-	struct libinput_event *event;
-	struct libinput_event_pointer *ptrev;
-	int i;
-
-	if (!litest_has_2fg_scroll(dev))
-		return;
-
-	litest_enable_2fg_scroll(dev);
-	litest_drain_events(li);
-
-	litest_touch_down(dev, 0, 45, 30);
-	litest_touch_down(dev, 1, 55, 30);
-
-	litest_touch_move_two_touches(dev, 45, 30, 55, 30, 10, 10, 10, 0);
-	libinput_dispatch(li);
-	litest_wait_for_event_of_type(li,
-				      LIBINPUT_EVENT_POINTER_AXIS,
-				      -1);
-	litest_drain_events(li);
-
-	/* get rid of any touch history still adding x deltas sideways */
-	for (i = 0; i < 5; i++)
-		litest_touch_move(dev, 0, 55, 41 + i);
-	litest_drain_events(li);
-
-	for (i = 6; i < 10; i++) {
-		litest_touch_move(dev, 0, 55, 41 + i);
-		libinput_dispatch(li);
-
-		event = libinput_get_event(li);
-		ptrev = litest_is_axis_event(event,
-				LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
-				LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
-		ck_assert(!libinput_event_pointer_has_axis(ptrev,
-				LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL));
-		libinput_event_destroy(event);
-	}
-
-	litest_touch_up(dev, 1);
-	litest_touch_up(dev, 0);
-	libinput_dispatch(li);
-}
-END_TEST
-
-START_TEST(touchpad_2fg_scroll_slow_distance)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-	struct libinput_event *event;
-	struct libinput_event_pointer *ptrev;
-	double width, height;
-	double y_move = 100;
-
-	if (!litest_has_2fg_scroll(dev))
-		return;
-
-	/* We want to move > 5 mm. */
-	ck_assert_int_eq(libinput_device_get_size(dev->libinput_device,
-						  &width,
-						  &height), 0);
-	y_move = 100.0/height * 7;
-
-	litest_enable_2fg_scroll(dev);
-	litest_drain_events(li);
-
-	litest_touch_down(dev, 0, 49, 50);
-	litest_touch_down(dev, 1, 51, 50);
-	litest_touch_move_two_touches(dev, 49, 50, 51, 50, 0, y_move, 100, 10);
-	litest_touch_up(dev, 1);
-	litest_touch_up(dev, 0);
-	libinput_dispatch(li);
-
-	event = libinput_get_event(li);
-	ck_assert_notnull(event);
-
-	/* last event is value 0, tested elsewhere */
-	while (libinput_next_event_type(li) != LIBINPUT_EVENT_NONE) {
-		double axisval;
-		ck_assert_int_eq(libinput_event_get_type(event),
-				 LIBINPUT_EVENT_POINTER_AXIS);
-		ptrev = libinput_event_get_pointer_event(event);
-
-		axisval = libinput_event_pointer_get_axis_value(ptrev,
-				LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
-		ck_assert(axisval > 0.0);
-
-		/* this is to verify we test the right thing, if the value
-		   is greater than scroll.threshold we triggered the wrong
-		   condition */
-		ck_assert(axisval < 5.0);
-
-		libinput_event_destroy(event);
-		event = libinput_get_event(li);
-	}
-
-	litest_assert_empty_queue(li);
-	libinput_event_destroy(event);
-}
-END_TEST
-
-START_TEST(touchpad_2fg_scroll_source)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-	struct libinput_event *event;
-	struct libinput_event_pointer *ptrev;
-
-	if (!litest_has_2fg_scroll(dev))
-		return;
-
-	litest_enable_2fg_scroll(dev);
-	litest_drain_events(li);
-
-	test_2fg_scroll(dev, 0, 30, 0);
-	litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS, -1);
-
-	while ((event = libinput_get_event(li))) {
-		ck_assert_int_eq(libinput_event_get_type(event),
-				 LIBINPUT_EVENT_POINTER_AXIS);
-		ptrev = libinput_event_get_pointer_event(event);
-		ck_assert_int_eq(libinput_event_pointer_get_axis_source(ptrev),
-				 LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
-		libinput_event_destroy(event);
-	}
-}
-END_TEST
-
-START_TEST(touchpad_2fg_scroll_semi_mt)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	if (!litest_has_2fg_scroll(dev))
-		return;
-
-	litest_enable_2fg_scroll(dev);
-	litest_drain_events(li);
-
-	litest_touch_down(dev, 0, 20, 20);
-	litest_touch_down(dev, 1, 30, 20);
-	libinput_dispatch(li);
-	litest_touch_move_two_touches(dev,
-				      20, 20,
-				      30, 20,
-				      30, 40,
-				      10, 1);
-
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
-}
-END_TEST
-
-START_TEST(touchpad_2fg_scroll_return_to_motion)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	if (!litest_has_2fg_scroll(dev))
-		return;
-
-	litest_enable_2fg_scroll(dev);
-	litest_drain_events(li);
-
-	/* start with motion */
-	litest_touch_down(dev, 0, 70, 70);
-	litest_touch_move_to(dev, 0, 70, 70, 49, 50, 10, 0);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
-
-	/* 2fg scroll */
-	litest_touch_down(dev, 1, 51, 50);
-	litest_touch_move_two_touches(dev, 49, 50, 51, 50, 0, 20, 5, 0);
-	litest_touch_up(dev, 1);
-	libinput_dispatch(li);
-	litest_timeout_finger_switch();
-	libinput_dispatch(li);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
-
-	litest_touch_move_to(dev, 0, 49, 70, 49, 50, 10, 0);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
-
-	/* back to 2fg scroll, lifting the other finger */
-	litest_touch_down(dev, 1, 51, 50);
-	litest_touch_move_two_touches(dev, 49, 50, 51, 50, 0, 20, 5, 0);
-	litest_touch_up(dev, 0);
-	libinput_dispatch(li);
-	litest_timeout_finger_switch();
-	libinput_dispatch(li);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
-
-	/* move with second finger */
-	litest_touch_move_to(dev, 1, 51, 70, 51, 50, 10, 0);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
-
-	litest_touch_up(dev, 1);
-	litest_assert_empty_queue(li);
-}
-END_TEST
-
-START_TEST(touchpad_scroll_natural_defaults)
-{
-	struct litest_device *dev = litest_current_device();
-
-	ck_assert_int_ge(libinput_device_config_scroll_has_natural_scroll(dev->libinput_device), 1);
-	ck_assert_int_eq(libinput_device_config_scroll_get_natural_scroll_enabled(dev->libinput_device), 0);
-	ck_assert_int_eq(libinput_device_config_scroll_get_default_natural_scroll_enabled(dev->libinput_device), 0);
-}
-END_TEST
-
-START_TEST(touchpad_scroll_natural_enable_config)
-{
-	struct litest_device *dev = litest_current_device();
-	enum libinput_config_status status;
-
-	status = libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device, 1);
-	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
-	ck_assert_int_eq(libinput_device_config_scroll_get_natural_scroll_enabled(dev->libinput_device), 1);
-
-	status = libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device, 0);
-	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
-	ck_assert_int_eq(libinput_device_config_scroll_get_natural_scroll_enabled(dev->libinput_device), 0);
-}
-END_TEST
-
-START_TEST(touchpad_scroll_natural_2fg)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	if (!litest_has_2fg_scroll(dev))
-		return;
-
-	litest_enable_2fg_scroll(dev);
-	litest_drain_events(li);
-
-	libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device, 1);
-
-	test_2fg_scroll(dev, 0.1, 40, 0);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, -10);
-	test_2fg_scroll(dev, 0.1, -40, 0);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, 10);
-	test_2fg_scroll(dev, 40, 0.1, 0);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, -10);
-	test_2fg_scroll(dev, -40, 0.1, 0);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, 10);
-
-}
-END_TEST
-
-START_TEST(touchpad_scroll_natural_edge)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	litest_enable_edge_scroll(dev);
-	litest_drain_events(li);
-
-	libinput_device_config_scroll_set_natural_scroll_enabled(dev->libinput_device, 1);
-
-	litest_touch_down(dev, 0, 99, 20);
-	litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10, 0);
-	litest_touch_up(dev, 0);
-
-	libinput_dispatch(li);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, -4);
-	litest_assert_empty_queue(li);
-
-	litest_touch_down(dev, 0, 99, 80);
-	litest_touch_move_to(dev, 0, 99, 80, 99, 20, 10, 0);
-	litest_touch_up(dev, 0);
-
-	libinput_dispatch(li);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, 4);
-	litest_assert_empty_queue(li);
-
-}
-END_TEST
-
-START_TEST(touchpad_edge_scroll_vert)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	litest_drain_events(li);
-	litest_enable_edge_scroll(dev);
-
-	litest_touch_down(dev, 0, 99, 20);
-	litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10, 0);
-	litest_touch_up(dev, 0);
-
-	libinput_dispatch(li);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, 4);
-	litest_assert_empty_queue(li);
-
-	litest_touch_down(dev, 0, 99, 80);
-	litest_touch_move_to(dev, 0, 99, 80, 99, 20, 10, 0);
-	litest_touch_up(dev, 0);
-
-	libinput_dispatch(li);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, -4);
-	litest_assert_empty_queue(li);
-}
-END_TEST
-
-static int
-touchpad_has_horiz_edge_scroll_size(struct litest_device *dev)
-{
-	double width, height;
-	int rc;
-
-	rc = libinput_device_get_size(dev->libinput_device, &width, &height);
-
-	return rc == 0 && height >= 50;
-}
-
-START_TEST(touchpad_edge_scroll_horiz)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	if (!touchpad_has_horiz_edge_scroll_size(dev))
-		return;
-
-	litest_drain_events(li);
-	litest_enable_edge_scroll(dev);
-
-	litest_touch_down(dev, 0, 20, 99);
-	litest_touch_move_to(dev, 0, 20, 99, 70, 99, 10, 0);
-	litest_touch_up(dev, 0);
-
-	libinput_dispatch(li);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, 4);
-	litest_assert_empty_queue(li);
-
-	litest_touch_down(dev, 0, 70, 99);
-	litest_touch_move_to(dev, 0, 70, 99, 20, 99, 10, 0);
-	litest_touch_up(dev, 0);
-
-	libinput_dispatch(li);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, -4);
-	litest_assert_empty_queue(li);
-}
-END_TEST
-
-START_TEST(touchpad_edge_scroll_horiz_clickpad)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	litest_drain_events(li);
-	litest_enable_edge_scroll(dev);
-
-	litest_touch_down(dev, 0, 20, 99);
-	litest_touch_move_to(dev, 0, 20, 99, 70, 99, 10, 0);
-	litest_touch_up(dev, 0);
-
-	libinput_dispatch(li);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, 4);
-	litest_assert_empty_queue(li);
-
-	litest_touch_down(dev, 0, 70, 99);
-	litest_touch_move_to(dev, 0, 70, 99, 20, 99, 10, 0);
-	litest_touch_up(dev, 0);
-
-	libinput_dispatch(li);
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL, -4);
-	litest_assert_empty_queue(li);
-}
-END_TEST
-
-START_TEST(touchpad_edge_scroll_no_horiz)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	if (touchpad_has_horiz_edge_scroll_size(dev))
-		return;
-
-	litest_drain_events(li);
-	litest_enable_edge_scroll(dev);
-
-	litest_touch_down(dev, 0, 20, 99);
-	litest_touch_move_to(dev, 0, 20, 99, 70, 99, 10, 0);
-	litest_touch_up(dev, 0);
-
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
-
-	litest_touch_down(dev, 0, 70, 99);
-	litest_touch_move_to(dev, 0, 70, 99, 20, 99, 10, 0);
-	litest_touch_up(dev, 0);
-
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
-}
-END_TEST
-
-START_TEST(touchpad_scroll_defaults)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput_device *device = dev->libinput_device;
-	struct libevdev *evdev = dev->evdev;
-	enum libinput_config_scroll_method method, expected;
-	enum libinput_config_status status;
-
-	method = libinput_device_config_scroll_get_methods(device);
-	ck_assert(method & LIBINPUT_CONFIG_SCROLL_EDGE);
-	if (libevdev_get_num_slots(evdev) > 1)
-		ck_assert(method & LIBINPUT_CONFIG_SCROLL_2FG);
-	else
-		ck_assert((method & LIBINPUT_CONFIG_SCROLL_2FG) == 0);
-
-	if (libevdev_get_num_slots(evdev) > 1)
-		expected = LIBINPUT_CONFIG_SCROLL_2FG;
-	else
-		expected = LIBINPUT_CONFIG_SCROLL_EDGE;
-
-	method = libinput_device_config_scroll_get_method(device);
-	ck_assert_int_eq(method, expected);
-	method = libinput_device_config_scroll_get_default_method(device);
-	ck_assert_int_eq(method, expected);
-
-	status = libinput_device_config_scroll_set_method(device,
-					  LIBINPUT_CONFIG_SCROLL_EDGE);
-	ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
-	status = libinput_device_config_scroll_set_method(device,
-					  LIBINPUT_CONFIG_SCROLL_2FG);
-
-	if (libevdev_get_num_slots(evdev) > 1)
-		ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS);
-	else
-		ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_UNSUPPORTED);
-}
-END_TEST
-
-START_TEST(touchpad_edge_scroll_timeout)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-	struct libinput_event *event;
-	struct libinput_event_pointer *ptrev;
-	double width = 0, height = 0;
-	int nevents = 0;
-	double mm; /* one mm in percent of the device */
-
-	ck_assert_int_eq(libinput_device_get_size(dev->libinput_device,
-						  &width,
-						  &height), 0);
-	mm = 100.0/height;
-
-	/* timeout-based scrolling is disabled when software buttons are
-	 * active, so switch to clickfinger. Not all test devices support
-	 * that, hence the extra check. */
-	if (libinput_device_config_click_get_methods(dev->libinput_device) &
-	    LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER)
-		litest_enable_clickfinger(dev);
-
-	litest_drain_events(li);
-	litest_enable_edge_scroll(dev);
-
-	/* move 0.5mm, enough to load up the motion history, but less than
-	 * the scroll threshold of 2mm */
-	litest_touch_down(dev, 0, 99, 20);
-	litest_touch_move_to(dev, 0, 99, 20, 99, 20 + mm/2, 8, 0);
-	libinput_dispatch(li);
-	litest_assert_empty_queue(li);
-
-	litest_timeout_edgescroll();
-	libinput_dispatch(li);
-
-	litest_assert_empty_queue(li);
-
-	/* now move slowly up to the 2mm scroll threshold. we expect events */
-	litest_touch_move_to(dev, 0, 99, 20 + mm/2, 99, 20 + mm * 2, 20, 0);
-	litest_touch_up(dev, 0);
-	libinput_dispatch(li);
-
-	litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS, -1);
-
-	while ((event = libinput_get_event(li))) {
-		double value;
-
-		ptrev = litest_is_axis_event(event,
-					     LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
-					     0);
-		value = libinput_event_pointer_get_axis_value(ptrev,
-							      LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
-		ck_assert_double_lt(value, 5.0);
-		libinput_event_destroy(event);
-		nevents++;
-	}
-
-	/* we sent 20 events but allow for some to be swallowed by rounding
-	 * errors, the hysteresis, etc. */
-	ck_assert_int_ge(nevents, 10);
-
-	litest_assert_empty_queue(li);
-	libinput_event_destroy(event);
-}
-END_TEST
-
-START_TEST(touchpad_edge_scroll_no_motion)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	litest_drain_events(li);
-	litest_enable_edge_scroll(dev);
-
-	litest_touch_down(dev, 0, 99, 10);
-	litest_touch_move_to(dev, 0, 99, 10, 99, 70, 12, 0);
-	/* moving outside -> no motion event */
-	litest_touch_move_to(dev, 0, 99, 70, 20, 80, 12, 0);
-	/* moving down outside edge once scrolling had started -> scroll */
-	litest_touch_move_to(dev, 0, 20, 80, 40, 99, 12, 0);
-	litest_touch_up(dev, 0);
-	libinput_dispatch(li);
-
-	litest_assert_scroll(li, LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL, 4);
-	litest_assert_empty_queue(li);
-}
-END_TEST
-
-START_TEST(touchpad_edge_scroll_no_edge_after_motion)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	litest_drain_events(li);
-	litest_enable_edge_scroll(dev);
-
-	/* moving into the edge zone must not trigger scroll events */
-	litest_touch_down(dev, 0, 20, 20);
-	litest_touch_move_to(dev, 0, 20, 20, 99, 20, 12, 0);
-	litest_touch_move_to(dev, 0, 99, 20, 99, 80, 12, 0);
-	litest_touch_up(dev, 0);
-	libinput_dispatch(li);
-
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
-	litest_assert_empty_queue(li);
-}
-END_TEST
-
-START_TEST(touchpad_edge_scroll_source)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-	struct libinput_event *event;
-	struct libinput_event_pointer *ptrev;
-
-	litest_drain_events(li);
-	litest_enable_edge_scroll(dev);
-
-	litest_touch_down(dev, 0, 99, 20);
-	litest_touch_move_to(dev, 0, 99, 20, 99, 80, 10, 0);
-	litest_touch_up(dev, 0);
-
-	litest_wait_for_event_of_type(li, LIBINPUT_EVENT_POINTER_AXIS, -1);
-
-	while ((event = libinput_get_event(li))) {
-		ck_assert_int_eq(libinput_event_get_type(event),
-				 LIBINPUT_EVENT_POINTER_AXIS);
-		ptrev = libinput_event_get_pointer_event(event);
-		ck_assert_int_eq(libinput_event_pointer_get_axis_source(ptrev),
-				 LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
-		libinput_event_destroy(event);
-	}
-}
-END_TEST
-
-START_TEST(touchpad_edge_scroll_no_2fg)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	litest_drain_events(li);
-	litest_enable_edge_scroll(dev);
-
-	litest_touch_down(dev, 0, 49, 50);
-	litest_touch_down(dev, 1, 51, 50);
-	litest_touch_move_two_touches(dev, 49, 50, 51, 50, 20, 30, 5, 0);
-	libinput_dispatch(li);
-	litest_touch_up(dev, 0);
-	litest_touch_up(dev, 1);
-	libinput_dispatch(li);
-
-	litest_assert_empty_queue(li);
-}
-END_TEST
-
-START_TEST(touchpad_edge_scroll_into_buttonareas)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	litest_enable_buttonareas(dev);
-	litest_enable_edge_scroll(dev);
-	litest_drain_events(li);
-
-	litest_touch_down(dev, 0, 99, 40);
-	litest_touch_move_to(dev, 0, 99, 40, 99, 95, 10, 0);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
-	/* in the button zone now, make sure we still get events */
-	litest_touch_move_to(dev, 0, 99, 95, 99, 100, 10, 0);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
-
-	/* and out of the zone again */
-	litest_touch_move_to(dev, 0, 99, 100, 99, 70, 10, 0);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
-
-	/* still out of the zone */
-	litest_touch_move_to(dev, 0, 99, 70, 99, 50, 10, 0);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
-}
-END_TEST
-
-START_TEST(touchpad_edge_scroll_within_buttonareas)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	if (!touchpad_has_horiz_edge_scroll_size(dev))
-		return;
-
-	litest_enable_buttonareas(dev);
-	litest_enable_edge_scroll(dev);
-	litest_drain_events(li);
-
-	litest_touch_down(dev, 0, 20, 99);
-
-	/* within left button */
-	litest_touch_move_to(dev, 0, 20, 99, 40, 99, 10, 0);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
-
-	/* over to right button */
-	litest_touch_move_to(dev, 0, 40, 99, 60, 99, 10, 0);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
-
-	/* within right button */
-	litest_touch_move_to(dev, 0, 60, 99, 80, 99, 10, 0);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
-}
-END_TEST
-
-START_TEST(touchpad_edge_scroll_buttonareas_click_stops_scroll)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-	struct libinput_event *event;
-	struct libinput_event_pointer *ptrev;
-	double val;
-
-	if (!touchpad_has_horiz_edge_scroll_size(dev))
-		return;
-
-	litest_enable_buttonareas(dev);
-	litest_enable_edge_scroll(dev);
-	litest_drain_events(li);
-
-	litest_touch_down(dev, 0, 20, 95);
-	litest_touch_move_to(dev, 0, 20, 95, 70, 95, 10, 5);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
-
-	litest_button_click(dev, BTN_LEFT, true);
-	libinput_dispatch(li);
-
-	event = libinput_get_event(li);
-	ptrev = litest_is_axis_event(event,
-				     LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
-				     LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
-	val = libinput_event_pointer_get_axis_value(ptrev,
-				    LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
-	ck_assert(val == 0.0);
-	libinput_event_destroy(event);
-
-	event = libinput_get_event(li);
-	ptrev = litest_is_button_event(event,
-				       BTN_RIGHT,
-				       LIBINPUT_BUTTON_STATE_PRESSED);
-
-	libinput_event_destroy(event);
-
-	/* within button areas -> no movement */
-	litest_touch_move_to(dev, 0, 70, 95, 90, 95, 10, 0);
-	litest_assert_empty_queue(li);
-
-	litest_button_click(dev, BTN_LEFT, false);
-
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
-
-	litest_touch_up(dev, 0);
-}
-END_TEST
-
-START_TEST(touchpad_edge_scroll_clickfinger_click_stops_scroll)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-	struct libinput_event *event;
-	struct libinput_event_pointer *ptrev;
-	double val;
-
-	if (!touchpad_has_horiz_edge_scroll_size(dev))
-		return;
-
-	litest_enable_clickfinger(dev);
-	litest_enable_edge_scroll(dev);
-	litest_drain_events(li);
-
-	litest_touch_down(dev, 0, 20, 95);
-	litest_touch_move_to(dev, 0, 20, 95, 70, 95, 10, 5);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_AXIS);
-
-	litest_button_click(dev, BTN_LEFT, true);
-	libinput_dispatch(li);
-
-	event = libinput_get_event(li);
-	ptrev = litest_is_axis_event(event,
-				     LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
-				     LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
-	val = libinput_event_pointer_get_axis_value(ptrev,
-				    LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
-	ck_assert(val == 0.0);
-	libinput_event_destroy(event);
-
-	event = libinput_get_event(li);
-	ptrev = litest_is_button_event(event,
-				       BTN_LEFT,
-				       LIBINPUT_BUTTON_STATE_PRESSED);
-
-	libinput_event_destroy(event);
-
-	/* clickfinger releases pointer -> expect movement */
-	litest_touch_move_to(dev, 0, 70, 95, 90, 95, 10, 0);
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
-	litest_assert_empty_queue(li);
-
-	litest_button_click(dev, BTN_LEFT, false);
-
-	litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_BUTTON);
-
-	litest_touch_up(dev, 0);
-}
-END_TEST
-
-START_TEST(touchpad_edge_scroll_into_area)
-{
-	struct litest_device *dev = litest_current_device();
-	struct libinput *li = dev->libinput;
-
-	litest_enable_edge_scroll(dev);
-	litest_drain_events(li);
-
-	/* move into area, move vertically, move back to edge */
-
-	litest_touch_down(dev, 0, 99, 20);
-	litest_touch_move_to(dev, 0, 99, 20, 99, 50, 15, 2);
-	litest_touch_move_to(dev, 0, 99, 50, 20, 50, 15, 2);
-	litest_assert_only_typed_events(li,
-					LIBINPUT_EVENT_POINTER_AXIS);
-	litest_touch_move_to(dev, 0, 20, 50, 20, 20, 15, 2);
-	litest_touch_move_to(dev, 0, 20, 20, 99, 20, 15, 2);
-	litest_assert_empty_queue(li);
-
-	litest_touch_move_to(dev, 0, 99, 20, 99, 50, 15, 2);
-	litest_assert_only_typed_events(li,
-					LIBINPUT_EVENT_POINTER_AXIS);
-}
-END_TEST
-
 static int
 touchpad_has_palm_detect_size(struct litest_device *dev)
 {
@@ -4143,32 +3324,6 @@ litest_setup_tests(void)
 	litest_add("touchpad:motion", touchpad_1fg_motion, LITEST_TOUCHPAD, LITEST_ANY);
 	litest_add("touchpad:motion", touchpad_2fg_no_motion, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
 
-	litest_add("touchpad:scroll", touchpad_2fg_scroll, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH|LITEST_SEMI_MT);
-	litest_add("touchpad:scroll", touchpad_2fg_scroll_diagonal, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH|LITEST_SEMI_MT);
-	litest_add("touchpad:scroll", touchpad_2fg_scroll_slow_distance, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
-	litest_add("touchpad:scroll", touchpad_2fg_scroll_return_to_motion, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
-	litest_add("touchpad:scroll", touchpad_2fg_scroll_source, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
-	litest_add("touchpad:scroll", touchpad_2fg_scroll_semi_mt, LITEST_SEMI_MT, LITEST_SINGLE_TOUCH);
-	litest_add("touchpad:scroll", touchpad_scroll_natural_defaults, LITEST_TOUCHPAD, LITEST_ANY);
-	litest_add("touchpad:scroll", touchpad_scroll_natural_enable_config, LITEST_TOUCHPAD, LITEST_ANY);
-	litest_add("touchpad:scroll", touchpad_scroll_natural_2fg, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
-	litest_add("touchpad:scroll", touchpad_scroll_natural_edge, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
-	litest_add("touchpad:scroll", touchpad_scroll_defaults, LITEST_TOUCHPAD, LITEST_ANY);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_vert, LITEST_TOUCHPAD, LITEST_ANY);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_horiz, LITEST_TOUCHPAD, LITEST_CLICKPAD);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_horiz_clickpad, LITEST_CLICKPAD, LITEST_ANY);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_no_horiz, LITEST_TOUCHPAD, LITEST_CLICKPAD);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_no_motion, LITEST_TOUCHPAD, LITEST_ANY);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_no_edge_after_motion, LITEST_TOUCHPAD, LITEST_ANY);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_timeout, LITEST_TOUCHPAD, LITEST_ANY);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_source, LITEST_TOUCHPAD, LITEST_ANY);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_no_2fg, LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_into_buttonareas, LITEST_CLICKPAD, LITEST_ANY);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_within_buttonareas, LITEST_CLICKPAD, LITEST_ANY);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_buttonareas_click_stops_scroll, LITEST_CLICKPAD, LITEST_ANY);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_clickfinger_click_stops_scroll, LITEST_CLICKPAD, LITEST_ANY);
-	litest_add("touchpad:scroll", touchpad_edge_scroll_into_area, LITEST_TOUCHPAD, LITEST_ANY);
-
 	litest_add("touchpad:palm", touchpad_palm_detect_at_edge, LITEST_TOUCHPAD, LITEST_ANY);
 	litest_add("touchpad:palm", touchpad_palm_detect_at_bottom_corners, LITEST_TOUCHPAD, LITEST_CLICKPAD);
 	litest_add("touchpad:palm", touchpad_palm_detect_at_top_corners, LITEST_TOUCHPAD, LITEST_TOPBUTTONPAD);
-- 
2.7.4



More information about the wayland-devel mailing list