[PATCH libinput 10/12] evdev: convert button scrolling into a state machine

Peter Hutterer peter.hutterer at who-t.net
Mon Feb 20 20:53:37 UTC 2017


No functional changes, preparation work for adding another state.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev.c | 49 +++++++++++++++++++++++++++++++------------------
 src/evdev.h |  9 +++++++--
 2 files changed, 38 insertions(+), 20 deletions(-)

diff --git a/src/evdev.c b/src/evdev.c
index bf35acb..a50d7fa 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -221,18 +221,18 @@ evdev_button_scroll_timeout(uint64_t time, void *data)
 {
 	struct evdev_device *device = data;
 
-	device->scroll.button_scroll_active = true;
+	device->scroll.button_scroll_state = BUTTONSCROLL_SCROLLING;
 }
 
 static void
 evdev_button_scroll_button(struct evdev_device *device,
 			   uint64_t time, int is_press)
 {
-	device->scroll.button_scroll_btn_pressed = is_press;
-
 	if (is_press) {
 		enum timer_flags flags = TIMER_FLAG_NONE;
 
+		device->scroll.button_scroll_state = BUTTONSCROLL_BUTTON_DOWN;
+
 		/* Special case: if middle button emulation is enabled and
 		 * our scroll button is the left or right button, we only
 		 * get here *after* the middle button timeout has expired
@@ -254,13 +254,12 @@ evdev_button_scroll_button(struct evdev_device *device,
 			  "btnscroll: down\n");
 	} else {
 		libinput_timer_cancel(&device->scroll.timer);
-		if (device->scroll.button_scroll_active) {
-			log_debug(evdev_libinput_context(device),
-				  "btnscroll: up\n");
-			evdev_stop_scroll(device, time,
-					  LIBINPUT_POINTER_AXIS_SOURCE_CONTINUOUS);
-			device->scroll.button_scroll_active = false;
-		} else {
+		switch(device->scroll.button_scroll_state) {
+		case BUTTONSCROLL_IDLE:
+			log_bug_libinput(evdev_libinput_context(device),
+					 "invalid state IDLE for button up\n");
+			break;
+		case BUTTONSCROLL_BUTTON_DOWN:
 			log_debug(evdev_libinput_context(device),
 				  "btnscroll: cancel\n");
 			/* If the button is released quickly enough emit the
@@ -272,7 +271,16 @@ evdev_button_scroll_button(struct evdev_device *device,
 			evdev_pointer_post_button(device, time,
 					device->scroll.button,
 					LIBINPUT_BUTTON_STATE_RELEASED);
+			break;
+		case BUTTONSCROLL_SCROLLING:
+			log_debug(evdev_libinput_context(device),
+				  "btnscroll: up\n");
+			evdev_stop_scroll(device, time,
+					  LIBINPUT_POINTER_AXIS_SOURCE_CONTINUOUS);
+			break;
 		}
+
+		device->scroll.button_scroll_state = BUTTONSCROLL_IDLE;
 	}
 }
 
@@ -381,21 +389,26 @@ evdev_post_trackpoint_scroll(struct evdev_device *device,
 			     struct normalized_coords unaccel,
 			     uint64_t time)
 {
-	if (device->scroll.method != LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN ||
-	    !device->scroll.button_scroll_btn_pressed)
+	if (device->scroll.method != LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN)
 		return false;
 
-	if (device->scroll.button_scroll_active)
-		evdev_post_scroll(device, time,
-				  LIBINPUT_POINTER_AXIS_SOURCE_CONTINUOUS,
-				  &unaccel);
-	else
+	switch(device->scroll.button_scroll_state) {
+	case BUTTONSCROLL_IDLE:
+		return false;
+	case BUTTONSCROLL_BUTTON_DOWN:
 		/* if the button is down but scroll is not active, we're within the
 		   timeout where swallow motion events but don't post scroll buttons */
 		log_debug(evdev_libinput_context(device),
 			  "btnscroll: discarding\n");
+		return true;
+	case BUTTONSCROLL_SCROLLING:
+		evdev_post_scroll(device, time,
+				  LIBINPUT_POINTER_AXIS_SOURCE_CONTINUOUS,
+				  &unaccel);
+		return true;
+	}
 
-	return true;
+	assert(!"invalid scroll button state");
 }
 
 static inline bool
diff --git a/src/evdev.h b/src/evdev.h
index 35eec84..d481d5c 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -129,6 +129,12 @@ enum evdev_device_model {
 	EVDEV_MODEL_LOGITECH_MARBLE_MOUSE = (1 << 26),
 };
 
+enum evdev_button_scroll_state {
+	BUTTONSCROLL_IDLE,
+	BUTTONSCROLL_BUTTON_DOWN,	/* button is down */
+	BUTTONSCROLL_SCROLLING,		/* scrolling */
+};
+
 struct mt_slot {
 	int32_t seat_slot;
 	struct device_coords point;
@@ -188,8 +194,7 @@ struct evdev_device {
 		uint32_t want_button;
 		/* Checks if buttons are down and commits the setting */
 		void (*change_scroll_method)(struct evdev_device *device);
-		bool button_scroll_active;
-		bool button_scroll_btn_pressed;
+		enum evdev_button_scroll_state button_scroll_state;
 		double threshold;
 		double direction_lock_threshold;
 		uint32_t direction;
-- 
2.9.3



More information about the wayland-devel mailing list