From a0ddfa80b7a2128f1b99ee7a2e384c3b97c6fa37 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Mon, 28 Oct 2024 10:22:22 -0700 Subject: [PATCH] WIP `org.freedesktop.ScreenSaver` --- src/freedesktop_screensaver.rs | 46 ++++++++++++++++++++++++++++++++++ src/main.rs | 14 ++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/freedesktop_screensaver.rs diff --git a/src/freedesktop_screensaver.rs b/src/freedesktop_screensaver.rs new file mode 100644 index 0000000..2c491e9 --- /dev/null +++ b/src/freedesktop_screensaver.rs @@ -0,0 +1,46 @@ +// https://specifications.freedesktop.org/idle-inhibit-spec/latest + +use std::collections::HashMap; + +#[derive(Debug)] +struct Inhibitor { + application_name: String, + reason_for_inhibit: String, +} + +#[derive(Default)] +pub struct Screensaver { + inhibitors: HashMap, + last_cookie: u32, +} + +#[zbus::interface(name = "org.freedesktop.ScreenSaver")] +impl Screensaver { + fn inhibit(&mut self, application_name: String, reason_for_inhibit: String) -> u32 { + self.last_cookie += 1; + self.inhibitors.insert( + self.last_cookie, + Inhibitor { + application_name, + reason_for_inhibit, + }, + ); + self.last_cookie + } + + fn un_inhibit(&mut self, cookie: u32) { + self.inhibitors.remove(&cookie); + } +} + +pub async fn serve(conn: &zbus::Connection) -> zbus::Result<()> { + conn.request_name_with_flags( + "org.freedesktop.ScreenSaver", + zbus::fdo::RequestNameFlags::ReplaceExisting.into(), + ) + .await?; + conn.object_server() + .at("/org/freedesktop/ScreenSaver", Screensaver::default()) + .await?; + Ok(()) +} diff --git a/src/main.rs b/src/main.rs index 198c91a..34599eb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,6 +32,8 @@ use wayland_protocols_wlr::{ output_power_management::v1::client::{zwlr_output_power_manager_v1, zwlr_output_power_v1}, }; +mod freedesktop_screensaver; + const FADE_TIME: Duration = Duration::from_millis(2000); #[derive(Debug)] @@ -238,7 +240,7 @@ fn main() { let seat = globals .bind::(&qh, 1..=1, ()) .unwrap(); - seat.get_pointer(&qh, ()); // XXX + seat.get_pointer(&qh, ()); let compositor = globals .bind::(&qh, 1..=1, ()) @@ -330,6 +332,16 @@ fn main() { } }) .unwrap(); + scheduler + .schedule(async { + if let Ok(connection) = zbus::Connection::session().await { + if let Err(err) = freedesktop_screensaver::serve(&connection).await { + log::error!("failed to serve FreeDesktop screensaver interface: {}", err); + } + std::future::pending::<()>().await; + } + }) + .unwrap(); event_loop .handle() .insert_source(executor, |_, _, _| {})