aboutsummaryrefslogtreecommitdiff
path: root/src/dbus
diff options
context:
space:
mode:
authorHoru <73709188+HigherOrderLogic@users.noreply.github.com>2025-07-01 13:02:25 +0700
committerIvan Molodetskikh <yalterz@gmail.com>2025-07-14 14:56:11 +0300
commitdf00f0328e21b4fd2a9230d11d23a1cd3ce90aaa (patch)
treeb4ad2bfbfa5c1df95116655bd0d6627f8080a49f /src/dbus
parentd85eaf97990da6a265dd2e09fe110418f7c873ca (diff)
downloadniri-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.rs31
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();