slint-ui/slint · error
Seat deactivation is not implemented
Error message
Seat deactivation is not implemented
What it means
The linuxkms backend's libseat integration raises this unimplemented!() when the seat is deactivated (libseat SeatEvent::Disable). Slint's DRM backend does not yet support losing the seat, so it aborts rather than rendering to a device it no longer controls.
Solutions
- Avoid VT/seat switching while the Slint KMS app is running (lock the kiosk session)
- Run the app in a dedicated single-session environment (kiosk autologin without switching)
- Patch the backend to handle SeatEvent::Disable (pause rendering and release DRM devices) or subscribe to pause/resume events
Defensive patterns
Strategy: fallback
Validate before calling
// before starting the backend, ensure the session won't switch:
// run under logind with the seat locked, or check current VT is the active one
if !is_active_vt() { eprintln!("refusing to start: seat may be deactivated"); exit(1); } Try / catch
// unimplemented! aborts the process; supervise and restart the UI service // systemd: Restart=on-failure so a VT-switch abort relaunches when the seat returns [Service] Restart=on-failure
Prevention
- Deploy kiosk apps in single-session environments with VT switching disabled
- Add systemd Restart=on-failure to recover from the abort after a seat switch
- Contribute/patch handling of libseat SeatEvent::Disable (release DRM, pause rendering)
When it happens
Trigger: While a Slint app runs on Linux KMS/DRM via libseat, the session/seat is deactivated — e.g. VT switch away, another session taking the seat, or a session manager pausing the seat.
Common situations: User presses Ctrl+Alt+F2 to switch VTs while a kiosk app runs; systemd-logind hands the seat to another session; fast user switching on an embedded Linux panel.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- Unable to quit event loop multiple times
- a setter belongs to a field
- an identifier
- binding was of the wrong type
- C++: NativeWindowHandle created with null hwnd
AI-assisted analysis of slint-ui/slint@bb937076de (2026-09-16).
Data as JSON: /api/errors/9f0462dd23f7edce.
Report an issue: GitHub.
Appendix: source
Thrown at internal/backends/linuxkms/calloop_backend.rs:134
);
crate::renderer::try_skia_then_femtovg_then_software
}
};
#[cfg(feature = "libseat")]
let seat_active = Rc::new(RefCell::new(false));
//libseat::set_log_level(libseat::LogLevel::Debug);
#[cfg(feature = "libseat")]
let mut seat = {
let seat_active = seat_active.clone();
libseat::Seat::open(move |_seat, event| match event {
libseat::SeatEvent::Enable => {
*seat_active.borrow_mut() = true;
}
libseat::SeatEvent::Disable => {
unimplemented!("Seat deactivation is not implemented");
}
})
.map_err(|e| format!("Error opening session with libseat: {e}"))?
};
#[cfg(feature = "libseat")]
while !(*seat_active.borrow()) {
if seat.dispatch(5000).map_err(|e| format!("Error waiting for seat activation: {e}"))?
== 0
{
return Err("Timeout while waiting to activate session".to_string().into());
}
}
Ok(Backend {
context: Default::default(),
#[cfg(feature = "libseat")]
seat: Rc::new(RefCell::new(seat)),View on GitHub (pinned to bb937076de)