diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2013-12-23 14:16:03 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2014-01-10 11:08:24 +1000 |
commit | 93fbb5e05f184de84c6e4b0b11a9dc8303a11f23 (patch) | |
tree | 52c8975bbb88f56ccd1f941555b8e1b60bbb6fce /src/udev-seat.c | |
parent | 6fcaf7699c3b5ee1bc0a8199044a8989b2c6145f (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.c | 11 |
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); } } |