[PATCH weston v2 4/5] input: fix input device map to output if it doesn't exist.

U. Artie Eoff ullysses.a.eoff at intel.com
Thu Apr 17 07:53:25 PDT 2014


If an input device wants to map to an output that does not
exist, then just map it to the first output.

Also, if a device is mapped to an output that gets unplugged then
it gets default mapped to the first output in the output destroy
listener.  However, the original output destroy listener needs to
be removed before adding the new listener for the first output,
otherwise the list gets corrupted.

Later if the other output is plugged back in, we remap the device
to it.  In that case, we should remove the destroy listener for
the first output.

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=77341

Signed-off-by: U. Artie Eoff <ullysses.a.eoff at intel.com>
---
 src/evdev.c           | 5 +++++
 src/libinput-device.c | 5 +++++
 src/libinput-seat.c   | 4 +++-
 src/udev-seat.c       | 4 +++-
 4 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/evdev.c b/src/evdev.c
index d9b7d32..bc8e5ef 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -615,6 +615,11 @@ void
 evdev_device_set_output(struct evdev_device *device,
 			struct weston_output *output)
 {
+	if (device->output_destroy_listener.notify) {
+		wl_list_remove(&device->output_destroy_listener.link);
+		device->output_destroy_listener.notify = NULL;
+	}
+
 	device->output = output;
 	device->output_destroy_listener.notify = notify_output_destroy;
 	wl_signal_add(&output->destroy_signal,
diff --git a/src/libinput-device.c b/src/libinput-device.c
index 2105ade..6a321a4 100644
--- a/src/libinput-device.c
+++ b/src/libinput-device.c
@@ -259,6 +259,11 @@ void
 evdev_device_set_output(struct evdev_device *device,
 			struct weston_output *output)
 {
+	if (device->output_destroy_listener.notify) {
+		wl_list_remove(&device->output_destroy_listener.link);
+		device->output_destroy_listener.notify = NULL;
+	}
+
 	device->output = output;
 	device->output_destroy_listener.notify = notify_output_destroy;
 	wl_signal_add(&output->destroy_signal,
diff --git a/src/libinput-seat.c b/src/libinput-seat.c
index 7aca969..358c9fd 100644
--- a/src/libinput-seat.c
+++ b/src/libinput-seat.c
@@ -84,7 +84,9 @@ device_added(struct udev_input *input, struct libinput_device *libinput_device)
 		wl_list_for_each(output, &c->output_list, link)
 			if (strcmp(output->name, device->output_name) == 0)
 				evdev_device_set_output(device, output);
-	} else if (device->output == NULL) {
+	}
+
+	if (device->output == NULL) {
 		output = container_of(c->output_list.next,
 				      struct weston_output, link);
 		evdev_device_set_output(device, output);
diff --git a/src/udev-seat.c b/src/udev-seat.c
index 7e4330a..f875e09 100644
--- a/src/udev-seat.c
+++ b/src/udev-seat.c
@@ -125,7 +125,9 @@ device_added(struct udev_device *udev_device, struct udev_input *input)
 		wl_list_for_each(output, &c->output_list, link)
 			if (strcmp(output->name, device->output_name) == 0)
 				evdev_device_set_output(device, output);
-	} else if (device->output == NULL) {
+	}
+
+	if (device->output == NULL) {
 		output = container_of(c->output_list.next,
 				      struct weston_output, link);
 		evdev_device_set_output(device, output);
-- 
1.8.5.3



More information about the wayland-devel mailing list