From a7caef964bb8a67a555af8dbe2d8a7e4b2797454 Mon Sep 17 00:00:00 2001 From: Ander Conselvan de Oliveira Date: Thu, 24 Apr 2014 15:11:17 +0300 Subject: [PATCH] input: Fix errors due to initializing input before creating outputs Make sure that we don't map a device to an invalid output pointer and intead remap devices when an output is created. v2: fix the error with libinput too. --- src/evdev.c | 2 +- src/libinput-device.c | 2 +- src/libinput-seat.c | 8 ++++++-- src/udev-seat.c | 8 ++++++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/evdev.c b/src/evdev.c index ff951d33..888dfbdb 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 753583a0..4605a769 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 e92834f9..a38d4705 100644 --- a/src/libinput-seat.c +++ b/src/libinput-seat.c @@ -84,7 +84,7 @@ 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) { + } 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); @@ -314,11 +314,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 c8468989..8e7405d0 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 *