From df00f0328e21b4fd2a9230d11d23a1cd3ce90aaa Mon Sep 17 00:00:00 2001 From: Horu <73709188+HigherOrderLogic@users.noreply.github.com> Date: Tue, 1 Jul 2025 13:02:25 +0700 Subject: Register `org.freedesktop.ScreenSaver` at `/ScreenSaver` --- src/dbus/freedesktop_screensaver.rs | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'src/dbus') diff --git a/src/dbus/freedesktop_screensaver.rs b/src/dbus/freedesktop_screensaver.rs index 2ed874aa..facb2f21 100644 --- a/src/dbus/freedesktop_screensaver.rs +++ b/src/dbus/freedesktop_screensaver.rs @@ -1,6 +1,6 @@ use std::collections::hash_map::Entry; use std::collections::HashMap; -use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::atomic::{AtomicBool, AtomicU32, Ordering}; use std::sync::{Arc, Mutex, OnceLock}; use anyhow::Context; @@ -13,11 +13,12 @@ use zbus::{interface, Task}; use super::Start; +#[derive(Clone)] pub struct ScreenSaver { is_inhibited: Arc, is_broken: Arc, inhibitors: Arc>>, - counter: u32, + counter: Arc, monitor_task: Arc>>, } @@ -43,16 +44,16 @@ impl ScreenSaver { let mut cookie = None; for _ in 0..3 { - // Start from 1 because some clients don't like 0. - self.counter = self.counter.wrapping_add(1); - if self.counter == 0 { - self.counter += 1; + let mut inhibitor_key = self.counter.fetch_add(1, Ordering::SeqCst); + if inhibitor_key == 0 { + // Some clients don't like 0, add one more. + inhibitor_key = self.counter.fetch_add(1, Ordering::SeqCst); } - if let Entry::Vacant(entry) = inhibitors.entry(self.counter) { + if let Entry::Vacant(entry) = inhibitors.entry(inhibitor_key) { entry.insert(name); self.is_inhibited.store(true, Ordering::SeqCst); - cookie = Some(self.counter); + let _ = cookie.insert(inhibitor_key); break; } } @@ -83,7 +84,8 @@ impl ScreenSaver { is_inhibited, is_broken: Arc::new(AtomicBool::new(false)), inhibitors: Arc::new(Mutex::new(HashMap::new())), - counter: 0, + // Start from 1 because some clients don't like 0. + counter: Arc::new(AtomicU32::new(1)), monitor_task: Arc::new(OnceLock::new()), } } @@ -138,8 +140,15 @@ impl Start for ScreenSaver { | RequestNameFlags::ReplaceExisting | RequestNameFlags::DoNotQueue; - conn.object_server() - .at("/org/freedesktop/ScreenSaver", self)?; + let org_fd_ss_registered = conn + .object_server() + .at("/org/freedesktop/ScreenSaver", self.clone())?; + let ss_registered = conn.object_server().at("/ScreenSaver", self)?; + + if !org_fd_ss_registered && !ss_registered { + anyhow::bail!("failed to register any org.freedesktop.ScreenSaver interface") + } + conn.request_name_with_flags("org.freedesktop.ScreenSaver", flags)?; let async_conn = conn.inner(); -- cgit