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

  1. Avoid VT/seat switching while the Slint KMS app is running (lock the kiosk session)
  2. Run the app in a dedicated single-session environment (kiosk autologin without switching)
  3. 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

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


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)