diff options
| author | Horu <73709188+HigherOrderLogic@users.noreply.github.com> | 2025-07-01 13:02:25 +0700 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2025-07-14 14:56:11 +0300 |
| commit | df00f0328e21b4fd2a9230d11d23a1cd3ce90aaa (patch) | |
| tree | b4ad2bfbfa5c1df95116655bd0d6627f8080a49f /src/dbus | |
| parent | d85eaf97990da6a265dd2e09fe110418f7c873ca (diff) | |
| download | niri-df00f0328e21b4fd2a9230d11d23a1cd3ce90aaa.tar.gz niri-df00f0328e21b4fd2a9230d11d23a1cd3ce90aaa.tar.bz2 niri-df00f0328e21b4fd2a9230d11d23a1cd3ce90aaa.zip | |
Register `org.freedesktop.ScreenSaver` at `/ScreenSaver`
Diffstat (limited to 'src/dbus')
| -rw-r--r-- | src/dbus/freedesktop_screensaver.rs | 31 |
1 files changed, 20 insertions, 11 deletions
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<AtomicBool>, is_broken: Arc<AtomicBool>, inhibitors: Arc<Mutex<HashMap<u32, OwnedUniqueName>>>, - counter: u32, + counter: Arc<AtomicU32>, monitor_task: Arc<OnceLock<Task<()>>>, } @@ -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(); |
