[PATCH weston 4/4] input: Fix errors due to initializing input before creating outputs
Ander Conselvan de Oliveira
conselvan2 at gmail.com
Wed Apr 23 07:34:32 PDT 2014
From: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>
Make sure that we don't map a device to an invalid output pointer and
intead remap devices when an output is created.
---
src/evdev.c | 2 +-
src/libinput-device.c | 2 +-
src/libinput-seat.c | 6 +++++-
src/udev-seat.c | 8 ++++++--
4 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/src/evdev.c b/src/evdev.c
index ff951d3..888dfbd 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -601,7 +601,7 @@ notify_output_destroy(struct wl_listener *listener, void *data)
struct weston_compositor *c = device->seat->compositor;
struct weston_output *output;
- if (!device->output_name) {
+ if (!device->output_name && !wl_list_empty(&c->output_list)) {
output = container_of(c->output_list.next,
struct weston_output, link);
evdev_device_set_output(device, output);
diff --git a/src/libinput-device.c b/src/libinput-device.c
index 753583a..4605a76 100644
--- a/src/libinput-device.c
+++ b/src/libinput-device.c
@@ -264,7 +264,7 @@ notify_output_destroy(struct wl_listener *listener, void *data)
struct weston_compositor *c = device->seat->compositor;
struct weston_output *output;
- if (!device->output_name) {
+ if (!device->output_name && !wl_list_empty(&c->output_list)) {
output = container_of(c->output_list.next,
struct weston_output, link);
evdev_device_set_output(device, output);
diff --git a/src/libinput-seat.c b/src/libinput-seat.c
index 8bf538c..e900744 100644
--- a/src/libinput-seat.c
+++ b/src/libinput-seat.c
@@ -316,11 +316,15 @@ notify_output_create(struct wl_listener *listener, void *data)
struct evdev_device *device;
struct weston_output *output = data;
- wl_list_for_each(device, &seat->devices_list, link)
+ wl_list_for_each(device, &seat->devices_list, link) {
if (device->output_name &&
strcmp(output->name, device->output_name) == 0) {
evdev_device_set_output(device, output);
}
+
+ if (device->output_name == NULL && device->output == NULL)
+ evdev_device_set_output(device, output);
+ }
}
static struct udev_seat *
diff --git a/src/udev-seat.c b/src/udev-seat.c
index dfeb17f..93984e1 100644
--- a/src/udev-seat.c
+++ b/src/udev-seat.c
@@ -125,7 +125,7 @@ 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) {
+ } else if (device->output == NULL && !wl_list_empty(&c->output_list)) {
output = container_of(c->output_list.next,
struct weston_output, link);
evdev_device_set_output(device, output);
@@ -357,11 +357,15 @@ notify_output_create(struct wl_listener *listener, void *data)
struct evdev_device *device;
struct weston_output *output = data;
- wl_list_for_each(device, &seat->devices_list, link)
+ wl_list_for_each(device, &seat->devices_list, link) {
if (device->output_name &&
strcmp(output->name, device->output_name) == 0) {
evdev_device_set_output(device, output);
}
+
+ if (device->output_name == NULL && device->output == NULL)
+ evdev_device_set_output(device, output);
+ }
}
static struct udev_seat *
--
1.8.3.2
More information about the wayland-devel
mailing list