diff --git a/src/libei-seat.c b/src/libei-seat.c index 004c839..37e130a 100644 --- a/src/libei-seat.c +++ b/src/libei-seat.c @@ -332,7 +332,7 @@ ei_seat_unbind_capabilities(struct ei_seat *seat, ...) return; } - uint32_t mask = 0; + uint32_t old_mask = seat->capabilities_bound; enum ei_device_capability cap; va_list args; @@ -341,14 +341,19 @@ ei_seat_unbind_capabilities(struct ei_seat *seat, ...) if (!is_known_cap(cap)) continue; - mask_add(mask, cap); + mask_remove(seat->capabilities_bound, cap); } - mask = seat->capabilities & ~mask; - - if (seat->capabilities_bound == mask) + if (seat->capabilities_bound == old_mask) return; - seat->capabilities_bound = mask; + if (seat->capabilities_bound == 0) { + struct ei_device *device; + list_for_each(device, &seat->devices, link) { + if (ei_device_has_capability(device, cap)) + ei_device_close(device); + } + } + ei_seat_send_bind(seat, seat->capabilities_bound); }