input: Fix errors due to initializing input before creating outputs
authorAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Thu, 24 Apr 2014 12:11:17 +0000 (15:11 +0300)
committerKristian Høgsberg <krh@bitplanet.net>
Fri, 25 Apr 2014 22:04:04 +0000 (15:04 -0700)
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
src/libinput-device.c
src/libinput-seat.c
src/udev-seat.c

index ff951d3..888dfbd 100644 (file)
@@ -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);
index 753583a..4605a76 100644 (file)
@@ -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);
index e92834f..a38d470 100644 (file)
@@ -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 *
index c846898..8e7405d 100644 (file)
@@ -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 *