{"record":{"id":"9f0462dd23f7edce","repo":"slint-ui/slint","slug":"seat-deactivation-is-not-implemented","errorCode":null,"errorMessage":"Seat deactivation is not implemented","messagePattern":"Seat deactivation is not implemented","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"internal/backends/linuxkms/calloop_backend.rs","lineNumber":128,"sourceCode":"                );\n                crate::renderer::try_skia_then_femtovg_then_software\n            }\n        };\n\n        #[cfg(feature = \"libseat\")]\n        let seat_active = Rc::new(RefCell::new(false));\n\n        //libseat::set_log_level(libseat::LogLevel::Debug);\n\n        #[cfg(feature = \"libseat\")]\n        let mut seat = {\n            let seat_active = seat_active.clone();\n            libseat::Seat::open(move |_seat, event| match event {\n                libseat::SeatEvent::Enable => {\n                    *seat_active.borrow_mut() = true;\n                }\n                libseat::SeatEvent::Disable => {\n                    unimplemented!(\"Seat deactivation is not implemented\");\n                }\n            })\n            .map_err(|e| format!(\"Error opening session with libseat: {e}\"))?\n        };\n\n        #[cfg(feature = \"libseat\")]\n        while !(*seat_active.borrow()) {\n            if seat.dispatch(5000).map_err(|e| format!(\"Error waiting for seat activation: {e}\"))?\n                == 0\n            {\n                return Err(\"Timeout while waiting to activate session\".to_string().into());\n            }\n        }\n\n        Ok(Backend {\n            context: Default::default(),\n            #[cfg(feature = \"libseat\")]\n            seat: Rc::new(RefCell::new(seat)),","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/slint-ui/slint/blob/a9ea814a5813e7460fa1a867924872095a4d678d/internal/backends/linuxkms/calloop_backend.rs#L110-L146","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["While the app runs, avoid VT switches/session lock/suspend — keep it the sole active session.","Build or run without the libseat feature (direct DRM master path) if your deployment allows it.","Use the default winit backend on general-purpose desktop sessions instead of linuxkms.","Patch internal/backends/linuxkms/calloop_backend.rs to handle Disable (disable rendering, call seat.disable(), re-arm on Enable) instead of unimplemented!().","Track/file the upstream issue so proper seat deactivation lands."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Do not VT-switch, lock the session, or suspend while a linuxkms+libseat slint app is running.","Consider building without the libseat feature for single-session kiosk deployments.","Prefer the winit backend when running inside a normal desktop session.","Carry a local patch that handles SeatEvent::Disable (ack with seat.disable()) until upstream implements it."],"tags":["linuxkms","libseat","linux","panic","embedded","drm"],"backgroundTag":"seat-session-deactivation","analyzedSha":"a9ea814a5813e7460fa1a867924872095a4d678d","analyzedAt":"2026-08-16T22:39:12.830Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}