slint-ui/slint · critical

Seat deactivation is not implemented

Error message

Seat deactivation is not implemented

What it means

In the Linux KMS/DRM backend with the libseat feature, the seat's Disable callback — the signal that the session lost the seat (VT switch away, session lock, DRM master being taken elsewhere) — hits `unimplemented!()` and panics instead of disabling the seat and acknowledging with seat.disable(). Any libseat session deactivation therefore crashes the process.

Source

Thrown at internal/backends/linuxkms/calloop_backend.rs:128

                );
                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 a9ea814a58)

Solutions

  1. While the app runs, avoid VT switches/session lock/suspend — keep it the sole active session.
  2. Build or run without the libseat feature (direct DRM master path) if your deployment allows it.
  3. Use the default winit backend on general-purpose desktop sessions instead of linuxkms.
  4. Patch internal/backends/linuxkms/calloop_backend.rs to handle Disable (disable rendering, call seat.disable(), re-arm on Enable) instead of unimplemented!().
  5. Track/file the upstream issue so proper seat deactivation lands.
Defensive patterns

Strategy: fallback

Prevention

When it happens

Trigger: Running a slint app with the linuxkms backend + libseat (e.g. SLINT_BACKEND=linuxkms on a logind-managed seat) and then switching virtual terminals (Ctrl+Alt+F2), locking the session, suspending, or letting another compositor grab DRM master.

Common situations: Kiosk/embedded fullscreen apps launched from a seat session; testing on a desktop by VT-switching away; system suspend while the slint app holds DRM master.

Related errors


AI-assisted analysis of slint-ui/slint@a9ea814a58 (2026-08-16). Data as JSON: /api/errors/9f0462dd23f7edce. Report an issue: GitHub.