[PATCH libinput 04/11] touchpad: Change how we deal with scroll methods

Hans de Goede hdegoede at redhat.com
Wed Feb 18 04:26:47 PST 2015


With the upcoming gesture support 2fg scrolling will be handled as part of
the main gesture state machine, where as edge scrolling has its own state
machine, our current way of dispatching scroll "actions" does not play well
with this.

Change the scroll method handling to treat edge and 2fg scrolling as 2
separate state machines. The double scroll calls this introduces will mostly
be removed when the gesture handling code lands.

Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 src/evdev-mt-touchpad-edge-scroll.c |  3 ++
 src/evdev-mt-touchpad.c             | 73 +++++++------------------------------
 2 files changed, 17 insertions(+), 59 deletions(-)

diff --git a/src/evdev-mt-touchpad-edge-scroll.c b/src/evdev-mt-touchpad-edge-scroll.c
index 8d0a13e..df181d5 100644
--- a/src/evdev-mt-touchpad-edge-scroll.c
+++ b/src/evdev-mt-touchpad-edge-scroll.c
@@ -317,6 +317,9 @@ tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t time)
 	enum libinput_pointer_axis axis;
 	double dx, dy, *delta;
 
+	if (tp->scroll.method != LIBINPUT_CONFIG_SCROLL_EDGE)
+		return 0;
+
 	tp_for_each_touch(tp, t) {
 		if (!t->dirty)
 			continue;
diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index ae37ab1..a6de661 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -581,6 +581,9 @@ tp_twofinger_scroll_post_events(struct tp_dispatch *tp, uint64_t time)
 	struct tp_touch *t;
 	int nfingers_down = 0;
 
+	if (tp->scroll.method != LIBINPUT_CONFIG_SCROLL_2FG)
+		return 0;
+
 	/* No 2fg scrolling during tap-n-drag */
 	if (tp_tap_dragging(tp))
 		return 0;
@@ -606,60 +609,6 @@ tp_twofinger_scroll_post_events(struct tp_dispatch *tp, uint64_t time)
 }
 
 static void
-tp_scroll_handle_state(struct tp_dispatch *tp, uint64_t time)
-{
-	/* Note this must be always called, so that it knows the state of
-	 * touches when the scroll-mode changes.
-	 */
-	tp_edge_scroll_handle_state(tp, time);
-}
-
-static int
-tp_post_scroll_events(struct tp_dispatch *tp, uint64_t time)
-{
-	struct libinput *libinput = tp->device->base.seat->libinput;
-
-	switch (tp->scroll.method) {
-	case LIBINPUT_CONFIG_SCROLL_NO_SCROLL:
-		break;
-	case LIBINPUT_CONFIG_SCROLL_2FG:
-		return tp_twofinger_scroll_post_events(tp, time);
-	case LIBINPUT_CONFIG_SCROLL_EDGE:
-		return tp_edge_scroll_post_events(tp, time);
-	case LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN:
-		log_bug_libinput(libinput, "Unexpected scroll mode\n");
-		break;
-	}
-	return 0;
-}
-
-static void
-tp_stop_scroll_events(struct tp_dispatch *tp, uint64_t time)
-{
-	struct libinput *libinput = tp->device->base.seat->libinput;
-
-	switch (tp->scroll.method) {
-	case LIBINPUT_CONFIG_SCROLL_NO_SCROLL:
-		break;
-	case LIBINPUT_CONFIG_SCROLL_2FG:
-		tp_twofinger_stop_scroll(tp, time);
-		break;
-	case LIBINPUT_CONFIG_SCROLL_EDGE:
-		tp_edge_scroll_stop_events(tp, time);
-		break;
-	case LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN:
-		log_bug_libinput(libinput, "Unexpected scroll mode\n");
-		break;
-	}
-}
-
-static void
-tp_remove_scroll(struct tp_dispatch *tp)
-{
-	tp_remove_edge_scroll(tp);
-}
-
-static void
 tp_unhover_touches(struct tp_dispatch *tp, uint64_t time)
 {
 	struct tp_touch *t;
@@ -749,7 +698,7 @@ tp_process_state(struct tp_dispatch *tp, uint64_t time)
 	}
 
 	tp_button_handle_state(tp, time);
-	tp_scroll_handle_state(tp, time);
+	tp_edge_scroll_handle_state(tp, time);
 
 	/*
 	 * We have a physical button down event on a clickpad. To avoid
@@ -862,11 +811,14 @@ tp_post_events(struct tp_dispatch *tp, uint64_t time)
 	filter_motion |= tp_post_button_events(tp, time);
 
 	if (filter_motion || tp->sendevents.trackpoint_active) {
-		tp_stop_scroll_events(tp, time);
+		tp_edge_scroll_stop_events(tp, time);
+		tp_twofinger_stop_scroll(tp, time);
 		return;
 	}
 
-	if (tp_post_scroll_events(tp, time) != 0)
+	if (tp_edge_scroll_post_events(tp, time) != 0)
+		return;
+	if (tp_twofinger_scroll_post_events(tp, time) != 0)
 		return;
 
 	tp_post_pointer_motion(tp, time);
@@ -925,7 +877,7 @@ tp_remove(struct evdev_dispatch *dispatch)
 	tp_remove_tap(tp);
 	tp_remove_buttons(tp);
 	tp_remove_sendevents(tp);
-	tp_remove_scroll(tp);
+	tp_remove_edge_scroll(tp);
 }
 
 static void
@@ -1255,11 +1207,14 @@ tp_scroll_config_scroll_method_set_method(struct libinput_device *device,
 {
 	struct evdev_device *evdev = (struct evdev_device*)device;
 	struct tp_dispatch *tp = (struct tp_dispatch*)evdev->dispatch;
+	uint64_t time = libinput_now(device->seat->libinput);
 
 	if (method == tp->scroll.method)
 		return LIBINPUT_CONFIG_STATUS_SUCCESS;
 
-	tp_stop_scroll_events(tp, libinput_now(device->seat->libinput));
+	tp_edge_scroll_stop_events(tp, time);
+	tp_twofinger_stop_scroll(tp, time);
+
 	tp->scroll.method = method;
 
 	return LIBINPUT_CONFIG_STATUS_SUCCESS;
-- 
2.1.0



More information about the wayland-devel mailing list