Blame 0001-lid-re-init-the-event-listener-after-removing-it.patch

Peter Hutterer 9ceb958
From 98eca5257c1d3d62ebaaf0ed8ee262381f3dc256 Mon Sep 17 00:00:00 2001
Peter Hutterer 4e5ee47
From: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer 4e5ee47
Date: Thu, 4 May 2017 14:50:31 +1000
Peter Hutterer 4e5ee47
Subject: [PATCH libinput] lid: re-init the event listener after removing it
Peter Hutterer 4e5ee47
Peter Hutterer 4e5ee47
We may call remove on it again and that segfaults if it hasn't been
Peter Hutterer 4e5ee47
initialized.
Peter Hutterer 4e5ee47
Peter Hutterer 9ceb958
https://bugzilla.redhat.com/show_bug.cgi?id=1440927
Peter Hutterer 9ceb958
Peter Hutterer 4e5ee47
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer 4e5ee47
---
Peter Hutterer 9ceb958
 src/evdev-lid.c         | 23 ++++++++++++++++++++---
Peter Hutterer 9ceb958
 src/evdev-mt-touchpad.c |  6 ++++++
Peter Hutterer 9ceb958
 2 files changed, 26 insertions(+), 3 deletions(-)
Peter Hutterer 4e5ee47
Peter Hutterer 4e5ee47
diff --git a/src/evdev-lid.c b/src/evdev-lid.c
Peter Hutterer 9ceb958
index 8db7f37c..b7ff065e 100644
Peter Hutterer 4e5ee47
--- a/src/evdev-lid.c
Peter Hutterer 4e5ee47
+++ b/src/evdev-lid.c
Peter Hutterer 4e5ee47
@@ -98,7 +98,9 @@ lid_switch_toggle_keyboard_listener(struct lid_switch_dispatch *dispatch,
Peter Hutterer 4e5ee47
 					   dispatch);
Peter Hutterer 4e5ee47
 	} else {
Peter Hutterer 4e5ee47
 		libinput_device_remove_event_listener(
Peter Hutterer 4e5ee47
-						      &dispatch->keyboard.listener);
Peter Hutterer 4e5ee47
+					&dispatch->keyboard.listener);
Peter Hutterer 4e5ee47
+		libinput_device_init_event_listener(
Peter Hutterer 4e5ee47
+					&dispatch->keyboard.listener);
Peter Hutterer 4e5ee47
 	}
Peter Hutterer 4e5ee47
 }
Peter Hutterer 4e5ee47
 
Peter Hutterer 9ceb958
@@ -174,6 +176,17 @@ evdev_read_switch_reliability_prop(struct evdev_device *device)
Peter Hutterer 9ceb958
 }
Peter Hutterer 9ceb958
 
Peter Hutterer 9ceb958
 static void
Peter Hutterer 9ceb958
+lid_switch_remove(struct evdev_dispatch *evdev_dispatch)
Peter Hutterer 9ceb958
+{
Peter Hutterer 9ceb958
+	struct lid_switch_dispatch *dispatch = lid_dispatch(evdev_dispatch);
Peter Hutterer 9ceb958
+
Peter Hutterer 9ceb958
+	if (!dispatch->keyboard.keyboard)
Peter Hutterer 9ceb958
+		return;
Peter Hutterer 9ceb958
+
Peter Hutterer 9ceb958
+	libinput_device_remove_event_listener(&dispatch->keyboard.listener);
Peter Hutterer 9ceb958
+}
Peter Hutterer 9ceb958
+
Peter Hutterer 9ceb958
+static void
Peter Hutterer 9ceb958
 lid_switch_destroy(struct evdev_dispatch *evdev_dispatch)
Peter Hutterer 9ceb958
 {
Peter Hutterer 9ceb958
 	struct lid_switch_dispatch *dispatch = lid_dispatch(evdev_dispatch);
Peter Hutterer 9ceb958
@@ -197,7 +210,9 @@ lid_switch_pair_keyboard(struct evdev_device *lid_switch,
Peter Hutterer 4e5ee47
 	if (dispatch->keyboard.keyboard) {
Peter Hutterer 4e5ee47
 		if (bus_kbd != BUS_I8042)
Peter Hutterer 4e5ee47
 			return;
Peter Hutterer 4e5ee47
+
Peter Hutterer 4e5ee47
 		libinput_device_remove_event_listener(&dispatch->keyboard.listener);
Peter Hutterer 4e5ee47
+		libinput_device_init_event_listener(&dispatch->keyboard.listener);
Peter Hutterer 4e5ee47
 	}
Peter Hutterer 4e5ee47
 
Peter Hutterer 4e5ee47
 	dispatch->keyboard.keyboard = keyboard;
Peter Hutterer 9ceb958
@@ -225,7 +240,9 @@ lid_switch_interface_device_removed(struct evdev_device *device,
Peter Hutterer 4e5ee47
 
Peter Hutterer 4e5ee47
 	if (removed_device == dispatch->keyboard.keyboard) {
Peter Hutterer 4e5ee47
 		libinput_device_remove_event_listener(
Peter Hutterer 4e5ee47
-				      &dispatch->keyboard.listener);
Peter Hutterer 4e5ee47
+					&dispatch->keyboard.listener);
Peter Hutterer 4e5ee47
+		libinput_device_init_event_listener(
Peter Hutterer 4e5ee47
+					&dispatch->keyboard.listener);
Peter Hutterer 4e5ee47
 		dispatch->keyboard.keyboard = NULL;
Peter Hutterer 4e5ee47
 	}
Peter Hutterer 4e5ee47
 }
Peter Hutterer 9ceb958
@@ -271,7 +288,7 @@ lid_switch_sync_initial_state(struct evdev_device *device,
Peter Hutterer 9ceb958
 struct evdev_dispatch_interface lid_switch_interface = {
Peter Hutterer 9ceb958
 	lid_switch_process,
Peter Hutterer 9ceb958
 	NULL, /* suspend */
Peter Hutterer 9ceb958
-	NULL, /* remove */
Peter Hutterer 9ceb958
+	lid_switch_remove,
Peter Hutterer 9ceb958
 	lid_switch_destroy,
Peter Hutterer 9ceb958
 	lid_switch_interface_device_added,
Peter Hutterer 9ceb958
 	lid_switch_interface_device_removed,
Peter Hutterer 9ceb958
diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
Peter Hutterer 9ceb958
index a35688b1..73f0fdd8 100644
Peter Hutterer 9ceb958
--- a/src/evdev-mt-touchpad.c
Peter Hutterer 9ceb958
+++ b/src/evdev-mt-touchpad.c
Peter Hutterer 9ceb958
@@ -1673,6 +1673,12 @@ tp_interface_device_removed(struct evdev_device *device,
Peter Hutterer 9ceb958
 		tp->dwt.keyboard = NULL;
Peter Hutterer 9ceb958
 	}
Peter Hutterer 9ceb958
 
Peter Hutterer 9ceb958
+	if (removed_device == tp->lid_switch.lid_switch) {
Peter Hutterer 9ceb958
+		libinput_device_remove_event_listener(
Peter Hutterer 9ceb958
+					&tp->lid_switch.lid_switch_listener);
Peter Hutterer 9ceb958
+		tp->lid_switch.lid_switch = NULL;
Peter Hutterer 9ceb958
+	}
Peter Hutterer 9ceb958
+
Peter Hutterer 9ceb958
 	if (tp->sendevents.current_mode !=
Peter Hutterer 9ceb958
 	    LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE)
Peter Hutterer 9ceb958
 		return;
Peter Hutterer 4e5ee47
-- 
Peter Hutterer 4e5ee47
2.12.2
Peter Hutterer 4e5ee47