summaryrefslogtreecommitdiff
path: root/src/udev-seat.c
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-12-23 14:16:03 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2014-01-10 11:08:24 +1000
commit93fbb5e05f184de84c6e4b0b11a9dc8303a11f23 (patch)
tree52c8975bbb88f56ccd1f941555b8e1b60bbb6fce /src/udev-seat.c
parent6fcaf7699c3b5ee1bc0a8199044a8989b2c6145f (diff)
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>
Diffstat (limited to 'src/udev-seat.c')
-rw-r--r--src/udev-seat.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/udev-seat.c b/src/udev-seat.c
index 08e7ada..97f8259 100644
--- a/src/udev-seat.c
+++ b/src/udev-seat.c
@@ -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);
}
}