WIP org.freedesktop.ScreenSaver
This commit is contained in:
parent
163356f012
commit
a0ddfa80b7
2 changed files with 59 additions and 1 deletions
46
src/freedesktop_screensaver.rs
Normal file
46
src/freedesktop_screensaver.rs
Normal file
|
|
@ -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<u32, Inhibitor>,
|
||||||
|
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(())
|
||||||
|
}
|
||||||
14
src/main.rs
14
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},
|
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);
|
const FADE_TIME: Duration = Duration::from_millis(2000);
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
@ -238,7 +240,7 @@ fn main() {
|
||||||
let seat = globals
|
let seat = globals
|
||||||
.bind::<wl_seat::WlSeat, _, _>(&qh, 1..=1, ())
|
.bind::<wl_seat::WlSeat, _, _>(&qh, 1..=1, ())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
seat.get_pointer(&qh, ()); // XXX
|
seat.get_pointer(&qh, ());
|
||||||
|
|
||||||
let compositor = globals
|
let compositor = globals
|
||||||
.bind::<wl_compositor::WlCompositor, _, _>(&qh, 1..=1, ())
|
.bind::<wl_compositor::WlCompositor, _, _>(&qh, 1..=1, ())
|
||||||
|
|
@ -330,6 +332,16 @@ fn main() {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.unwrap();
|
.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
|
event_loop
|
||||||
.handle()
|
.handle()
|
||||||
.insert_source(executor, |_, _, _| {})
|
.insert_source(executor, |_, _, _| {})
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue