Basic screen idle timer daemon
- Use x11 ScreenSaver extension to track idle time - Placeholder lock function and hardcoded timer
This commit is contained in:
parent
77fd195759
commit
a544e4821e
@ -6,3 +6,4 @@ description = "Screen idle time tracker daemon for glock screenlock"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
glock-conf = { version = "0.1.0", path = "../glock-conf" }
|
glock-conf = { version = "0.1.0", path = "../glock-conf" }
|
||||||
|
x11rb = { version = "0.13.2", features = ["screensaver"] }
|
||||||
|
|||||||
@ -1,3 +1,54 @@
|
|||||||
fn main() {
|
// Screen idle timeout daemon that triggers the screen locker.
|
||||||
println!("Hello, world!");
|
//
|
||||||
|
// This daemon runs continuously, queries the X server for global
|
||||||
|
// user idle time, and triggers the screen locker once the idle
|
||||||
|
// timeout is exceeded.
|
||||||
|
|
||||||
|
use std::thread;
|
||||||
|
use std::time::Duration;
|
||||||
|
|
||||||
|
use x11rb::connection::Connection;
|
||||||
|
use x11rb::protocol::screensaver;
|
||||||
|
|
||||||
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
// Daemon entry point.
|
||||||
|
// For now, this only prints when the screen should be locked.
|
||||||
|
println!("glock-d: starting idle tracker daemon");
|
||||||
|
|
||||||
|
// Hard-coded idle timeout in milliseconds.
|
||||||
|
// This will later be loaded from the config crate.
|
||||||
|
let idle_timeout_ms: u64 = 60_000;
|
||||||
|
|
||||||
|
// Interval between idle checks.
|
||||||
|
// Short enough to feel responsive, long enough to stay efficient.
|
||||||
|
let poll_interval = Duration::from_millis(500);
|
||||||
|
|
||||||
|
// Connect to the X server using the default display.
|
||||||
|
// The screen number is required to access the root window.
|
||||||
|
let (conn, screen_num) = x11rb::connect(None)?;
|
||||||
|
|
||||||
|
// The root window represents the entire screen.
|
||||||
|
// XScreenSaver reports idle time relative to this window.
|
||||||
|
let root = conn.setup().roots[screen_num].root;
|
||||||
|
|
||||||
|
// Main daemon loop.
|
||||||
|
// This loop runs forever unless the process is terminated.
|
||||||
|
loop {
|
||||||
|
// Sleep before querying to avoid busy-looping and CPU waste.
|
||||||
|
thread::sleep(poll_interval);
|
||||||
|
|
||||||
|
// Query the XScreenSaver extension for idle information.
|
||||||
|
// The value returned is milliseconds since last keyboard or mouse input.
|
||||||
|
let reply = screensaver::query_info(&conn, root)?.reply()?;
|
||||||
|
let idle_ms = u64::from(reply.ms_since_user_input);
|
||||||
|
|
||||||
|
// If the user has been idle longer than the timeout,
|
||||||
|
// trigger the screen lock.
|
||||||
|
if idle_ms >= idle_timeout_ms {
|
||||||
|
// Placeholder for the real locker invocation.
|
||||||
|
// In the final version, this will spawn the glock locker
|
||||||
|
// and wait for it to exit before continuing.
|
||||||
|
println!("screen lock");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user