screensaver: Catch activeness changes
This commit is contained in:
@ -1,5 +1,6 @@
|
||||
# Dependencies which change based on build flags
|
||||
# Dependencies and tools which change based on build flags
|
||||
# For the newer-than-Byzantium config
|
||||
|
||||
bitflags = "1.3.*"
|
||||
clap = { version = "3.2.*", features=["std"], default-features = false }
|
||||
zbus = "1.9.*"
|
||||
|
||||
@ -22,6 +22,7 @@ path = "@path@/examples/find_orphan_layouts.rs"
|
||||
|
||||
[features]
|
||||
glib_v0_14 = []
|
||||
zbus_v1_5 = []
|
||||
|
||||
# Dependencies which don't change based on build flags
|
||||
[dependencies]
|
||||
|
||||
@ -99,7 +99,7 @@ cargo_toml_base = configure_file(
|
||||
cargo_patch = []
|
||||
|
||||
if get_option('newer') == true
|
||||
cargo_build_flags += ['--features', 'glib_v0_14']
|
||||
cargo_build_flags += ['--features', 'glib_v0_14,zbus_v1_5']
|
||||
cargo_deps = files('Cargo.deps.newer')
|
||||
cargo_lock = files('Cargo.lock.newer')
|
||||
else
|
||||
|
||||
2
src/actors/external/mod.rs
vendored
2
src/actors/external/mod.rs
vendored
@ -7,3 +7,5 @@
|
||||
/*! Contains actors with custom event loops, not based off of the event_loop module. */
|
||||
|
||||
pub mod debug;
|
||||
#[cfg(feature = "zbus_v1_5")]
|
||||
pub mod screensaver;
|
||||
67
src/actors/external/screensaver.rs
vendored
Normal file
67
src/actors/external/screensaver.rs
vendored
Normal file
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright (C) 2022 Purism SPC
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*/
|
||||
use std::thread;
|
||||
use zbus::{Connection, dbus_proxy};
|
||||
|
||||
use crate::logging;
|
||||
|
||||
|
||||
#[derive(Debug)]
|
||||
enum Event {
|
||||
ScreensaverActive(bool),
|
||||
}
|
||||
|
||||
#[dbus_proxy(
|
||||
interface = "org.freedesktop.ScreenSaver",
|
||||
default_service = "org.freedesktop.ScreenSaver",
|
||||
default_path = "/org/freedesktop/ScreenSaver"
|
||||
)]
|
||||
pub trait Manager {
|
||||
#[dbus_proxy(signal)]
|
||||
fn active_changed(&self, active: bool) -> fdo::Result<()>;
|
||||
}
|
||||
|
||||
pub struct Destination;
|
||||
|
||||
impl Destination {
|
||||
fn send(&self, event: Event) {
|
||||
dbg!(event);
|
||||
}
|
||||
}
|
||||
|
||||
/// Listens to screensaver (screen lock) changes
|
||||
pub fn init(destination: Destination) {
|
||||
thread::spawn(move || {
|
||||
if let Err(e) = start(destination) {
|
||||
log_print!(
|
||||
logging::Level::Surprise,
|
||||
"Could not track screensaver status, giving up: {:?}",
|
||||
e,
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
fn start(destination: Destination) -> Result<(), zbus::Error> {
|
||||
let conn = Connection::new_session()?;
|
||||
let manager = ManagerProxy::new(&conn)?;
|
||||
|
||||
manager.connect_active_changed(move |m| {
|
||||
destination.send(Event::ScreensaverActive(m));
|
||||
Ok(())
|
||||
})?;
|
||||
|
||||
loop {
|
||||
match manager.next_signal() {
|
||||
Ok(None) => {}
|
||||
other => log_print!(
|
||||
logging::Level::Bug,
|
||||
"Encountered unhandled event: {:?}",
|
||||
other,
|
||||
),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -23,7 +23,7 @@ mod assert_matches;
|
||||
mod logging;
|
||||
|
||||
mod action;
|
||||
mod actors;
|
||||
pub mod actors;
|
||||
mod animation;
|
||||
pub mod data;
|
||||
mod drawing;
|
||||
|
||||
@ -121,6 +121,10 @@ mod c {
|
||||
};
|
||||
let submission = Submission::new(vk, imservice);
|
||||
|
||||
// dummy for now
|
||||
#[cfg(feature = "zbus_v1_5")]
|
||||
crate::actors::external::screensaver::init(crate::actors::external::screensaver::Destination);
|
||||
|
||||
RsObjects {
|
||||
submission: Wrapped::new(submission),
|
||||
state_manager: Wrapped::new(state_manager),
|
||||
|
||||
Reference in New Issue
Block a user