udev: notify about a removed seat when the last device is removed

When the last device is removed from a seat, destroy the seat.
This guarantees seat removal events on libinput_suspend() as well.

Note that the seat must be manually unlinked, we can't rely on the unlinking
in libinput_seat_destroy. After the event, the seat's refcount is always > 1,
so the seat will live on until the event is destroyed. We need to make sure
it's not in the list anymore though.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2013-12-23 14:16:03 +10:00
parent 6fcaf7699c
commit 93fbb5e05f

View file

@ -198,6 +198,8 @@ evdev_udev_handler(void *data)
device->devname, device->devnode);
close_restricted(libinput, device->fd);
evdev_device_remove(device);
if (list_empty(&seat->base.devices_list))
notify_removed_seat(&seat->base);
libinput_seat_unref(&seat->base);
break;
}
@ -219,6 +221,15 @@ udev_input_remove_devices(struct udev_input *input)
&seat->base.devices_list, base.link) {
close_restricted(&input->base, device->fd);
evdev_device_remove(device);
if (list_empty(&seat->base.devices_list)) {
notify_removed_seat(&seat->base);
/* seat is referenced by the event, so make
sure it's dropped from the seat list now,
to be freed whenever the device is
removed */
list_remove(&seat->base.link);
list_init(&seat->base.link);
}
libinput_seat_unref(&seat->base);
}
}