{"record":{"id":"72da297d6f6d5c31","repo":"niri-wm/niri","slug":"failed-to-register-any-org-freedesktop-screensaver","errorCode":null,"errorMessage":"failed to register any org.freedesktop.ScreenSaver interface","messagePattern":"failed to register any org\\.freedesktop\\.ScreenSaver interface","errorType":"console","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/dbus/freedesktop_screensaver.rs","lineNumber":149,"sourceCode":"impl Start for ScreenSaver {\n    fn start(self) -> anyhow::Result<zbus::blocking::Connection> {\n        let is_inhibited = self.is_inhibited.clone();\n        let is_broken = self.is_broken.clone();\n        let inhibitors = self.inhibitors.clone();\n        let monitor_task = self.monitor_task.clone();\n\n        let conn = zbus::blocking::Connection::session()?;\n        let flags = RequestNameFlags::AllowReplacement\n            | RequestNameFlags::ReplaceExisting\n            | RequestNameFlags::DoNotQueue;\n\n        let org_fd_ss_registered = conn\n            .object_server()\n            .at(\"/org/freedesktop/ScreenSaver\", self.clone())?;\n        let ss_registered = conn.object_server().at(\"/ScreenSaver\", self)?;\n\n        if !org_fd_ss_registered && !ss_registered {\n            anyhow::bail!(\"failed to register any org.freedesktop.ScreenSaver interface\")\n        }\n\n        conn.request_name_with_flags(\"org.freedesktop.ScreenSaver\", flags)?;\n\n        let async_conn = conn.inner();\n        let future = {\n            let conn = async_conn.clone();\n            async move {\n                if let Err(err) =\n                    monitor_disappeared_clients(&conn, is_inhibited.clone(), inhibitors.clone())\n                        .await\n                {\n                    warn!(\"error monitoring org.freedesktop.ScreenSaver clients: {err:?}\");\n                    is_broken.store(true, Ordering::SeqCst);\n                    is_inhibited.store(false, Ordering::SeqCst);\n                    inhibitors.lock().unwrap().clear();\n                }\n            }","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/niri-wm/niri/blob/606284464d4a99bb35710fee68192bc71085ee7c/src/dbus/freedesktop_screensaver.rs#L131-L167","documentation":"niri's idle-inhibit D-Bus server exports its ScreenSaver implementation at both /org/freedesktop/ScreenSaver and /ScreenSaver on the session bus; zbus's object_server().at() returns Ok(false) when an interface with that name is already registered at the path. If BOTH paths are taken, niri bails with this message — some other process in the session is already serving org.freedesktop.ScreenSaver, so registering would silently shadow it.","triggerScenarios":"Running niri while another screen-saver provider owns those object paths: a leftover/nested niri instance, xdg-desktop-portal or a portal frontend, or a desktop session manager (e.g. GNOME components started via systemd user units) that also implements org.freedesktop.ScreenSaver on the same session bus.","commonSituations":"Starting niri from within an existing desktop session (GNOME/KDE services still running); a stale niri process after a crash-logout-login cycle; running two compositors side by side for testing on the same DBUS_SESSION_BUS_ADDRESS; systemd user services from a previous DE still active.","solutions":["Find the current owner: 'busctl --user tree | grep -i screensaver' or 'gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.ListNames', then stop that conflicting service.","Kill leftover instances: 'pgrep -a niri' should show exactly one; 'pkill niri' and also check for stale Xwayland/portal processes.","If nested inside another DE, reset the session bus context: 'systemctl --user stop gnome-session.target xdg-desktop-portal*' or run niri under its own bus (dbus-run-session niri).","If two compositors must coexist, give the second one a private bus so the name/object paths do not collide."],"exampleFix":"# before: conflicting owner on the session bus -> \"failed to register any org.freedesktop.ScreenSaver interface\"\nniri &\n# after: clean up the previous owner first\nbusctl --user tree | grep -i screensaver   # identify it\nsystemctl --user stop xdg-desktop-portal.service\npkill -x niri\nniri","handlingStrategy":"try-catch","validationCode":"// Rust (zbus): check for an existing owner before exporting your interfaces\nlet dbus = zbus::blocking::fdo::DBusProxy::new(&conn)?;\nlet has_owner = dbus.name_has_owner(\"org.freedesktop.ScreenSaver\".into())?;\nif has_owner {\n    warn!(\"another ScreenSaver provider is active; skipping registration\");\n}","typeGuard":null,"tryCatchPattern":"let a = conn.object_server().at(\"/org/freedesktop/ScreenSaver\", iface.clone()).is_ok();\nlet b = conn.object_server().at(\"/ScreenSaver\", iface).is_ok();\nif !a && !b {\n    // degraded mode: feature unavailable, not fatal — log and continue serving everything else\n    warn!(\"failed to register any org.freedesktop.ScreenSaver interface\");\n}","preventionTips":["One session bus, one ScreenSaver provider: stop the previous compositor before starting a new one.","When nesting or testing, isolate with 'dbus-run-session' so object paths cannot collide.","At startup, probe org.freedesktop.DBus.NameHasOwner before exporting to fail soft instead of hard.","Keep systemd user units from previous DEs from lingering: 'systemctl --user stop' xdg-desktop-portal* and session targets."],"tags":["dbus","zbus","screensaver","session-bus","name-conflict","idle-inhibit"],"backgroundTag":"dbus-name-conflict","analyzedSha":"606284464d4a99bb35710fee68192bc71085ee7c","analyzedAt":"2026-08-16T21:48:00.228Z","schemaVersion":2},"datasetVersion":"2026-08-18T00:17:09.346Z"}