mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2025-12-25 08:10:05 +01:00
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:
parent
6fcaf7699c
commit
93fbb5e05f
1 changed files with 11 additions and 0 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue