summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorU. Artie Eoff <ullysses.a.eoff@intel.com>2014-04-17 07:53:25 -0700
committerKristian Høgsberg <krh@bitplanet.net>2014-04-21 14:37:16 -0700
commit161c6c56944cdfbda9a1af7a8a2c34e8f7d41dae (patch)
treefab4fe013f6495ca8165319d720350e92460967d
parentcd9e54537a5cb8acb00e99fbe6eeb74eafdd29fe (diff)
downloadweston-161c6c56944cdfbda9a1af7a8a2c34e8f7d41dae.tar.gz
input: fix input device map to output if it doesn't exist.
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@intel.com>
-rw-r--r--src/evdev.c5
-rw-r--r--src/libinput-device.c5
-rw-r--r--src/libinput-seat.c4
-rw-r--r--src/udev-seat.c4
4 files changed, 16 insertions, 2 deletions
diff --git a/src/evdev.c b/src/evdev.c
index d9b7d320..bc8e5efe 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 2105aded..6a321a4c 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 7aca969f..358c9fdc 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 7e4330a3..f875e09f 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);