From: Peter Hutterer Date: Mon, 23 Dec 2013 04:16:03 +0000 (+1000) Subject: udev: notify about a removed seat when the last device is removed X-Git-Tag: 0.1.0~94 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=93fbb5e05f184de84c6e4b0b11a9dc8303a11f23;p=platform%2Fupstream%2Flibinput.git 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 --- diff --git a/src/udev-seat.c b/src/udev-seat.c index 08e7ada7..97f8259c 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); } }