[PATCH libinput 1/2] touchpad: split the switch event handlers up

Peter Hutterer peter.hutterer at who-t.net
Wed May 16 06:28:39 UTC 2018


Because we register the handler separately (once for lid, once for
tablet-mode) the handler is called twice for the same event. This causes a
double-suspend of the touchpad, though it doesn't seem to have any real
effect.

Split it up so that each handler function only does one thing.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 src/evdev-mt-touchpad.c | 42 +++++++++++++++++++++++++++++++-----------
 1 file changed, 31 insertions(+), 11 deletions(-)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 47bfe228..ba19d842 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -2201,34 +2201,54 @@ tp_pair_trackpoint(struct evdev_device *touchpad,
 }
 
 static void
-tp_switch_event(uint64_t time, struct libinput_event *event, void *data)
+tp_lid_switch_event(uint64_t time, struct libinput_event *event, void *data)
 {
 	struct tp_dispatch *tp = data;
 	struct libinput_event_switch *swev;
-	const char *which = NULL;
 
 	if (libinput_event_get_type(event) != LIBINPUT_EVENT_SWITCH_TOGGLE)
 		return;
 
 	swev = libinput_event_get_switch_event(event);
+	if (libinput_event_switch_get_switch(swev) != LIBINPUT_SWITCH_LID)
+		return;
 
-	switch (libinput_event_switch_get_switch(swev)) {
-	case LIBINPUT_SWITCH_LID:
-		which = "lid";
+	switch (libinput_event_switch_get_switch_state(swev)) {
+	case LIBINPUT_SWITCH_STATE_OFF:
+		tp_resume_conditional(tp, tp->device, NO_EXCLUDED_DEVICE);
+		evdev_log_debug(tp->device, "lid: resume touchpad\n");
 		break;
-	case LIBINPUT_SWITCH_TABLET_MODE:
-		which = "tablet-mode";
+	case LIBINPUT_SWITCH_STATE_ON:
+		tp_suspend(tp, tp->device);
+		evdev_log_debug(tp->device, "lid: suspending touchpad\n");
 		break;
 	}
+}
+
+static void
+tp_tablet_mode_switch_event(uint64_t time,
+			    struct libinput_event *event,
+			    void *data)
+{
+	struct tp_dispatch *tp = data;
+	struct libinput_event_switch *swev;
+
+	if (libinput_event_get_type(event) != LIBINPUT_EVENT_SWITCH_TOGGLE)
+		return;
+
+	swev = libinput_event_get_switch_event(event);
+	if (libinput_event_switch_get_switch(swev) !=
+	    LIBINPUT_SWITCH_TABLET_MODE)
+		return;
 
 	switch (libinput_event_switch_get_switch_state(swev)) {
 	case LIBINPUT_SWITCH_STATE_OFF:
 		tp_resume_conditional(tp, tp->device, NO_EXCLUDED_DEVICE);
-		evdev_log_debug(tp->device, "%s: resume touchpad\n", which);
+		evdev_log_debug(tp->device, "tablet-mode: resume touchpad\n");
 		break;
 	case LIBINPUT_SWITCH_STATE_ON:
 		tp_suspend(tp, tp->device);
-		evdev_log_debug(tp->device, "%s: suspending touchpad\n", which);
+		evdev_log_debug(tp->device, "tablet-mode: suspending touchpad\n");
 		break;
 	}
 }
@@ -2250,7 +2270,7 @@ tp_pair_lid_switch(struct evdev_device *touchpad,
 
 		libinput_device_add_event_listener(&lid_switch->base,
 						   &tp->lid_switch.listener,
-						   tp_switch_event, tp);
+						   tp_lid_switch_event, tp);
 		tp->lid_switch.lid_switch = lid_switch;
 	}
 }
@@ -2274,7 +2294,7 @@ tp_pair_tablet_mode_switch(struct evdev_device *touchpad,
 
 	libinput_device_add_event_listener(&tablet_mode_switch->base,
 				&tp->tablet_mode_switch.listener,
-				tp_switch_event, tp);
+				tp_tablet_mode_switch_event, tp);
 	tp->tablet_mode_switch.tablet_mode_switch = tablet_mode_switch;
 
 	if (evdev_device_switch_get_state(tablet_mode_switch,
-- 
2.14.3



More information about the wayland-devel mailing list