commit 26ab019c2611d4783ac26811bfd2af15bb0b6456 Author: naoto Date: Tue Sep 27 20:34:27 2022 +0200 Initial version Basic functionality - printing idle time in miliseconds diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..23e2441 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,32 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "libc" +version = "0.2.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f80d65747a3e43d1596c7c5492d95d5edddaabd45a7fcdb02b95f644164966" + +[[package]] +name = "pkg-config" +version = "0.3.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + +[[package]] +name = "rs-idle" +version = "0.1.0" +dependencies = [ + "x11", +] + +[[package]] +name = "x11" +version = "2.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7ae97874a928d821b061fce3d1fc52f08071dd53c89a6102bc06efcac3b2908" +dependencies = [ + "libc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..b92df20 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "rs-idle" +version = "0.1.0" +edition = "2021" + +[profile.release] +strip = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +x11 = { version = "2.20.0", features = ["xss", "xlib"] } diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..86f7b09 --- /dev/null +++ b/Readme.md @@ -0,0 +1,5 @@ +# rs-idle - X idle time checker written in Rust (xprintidle alternative) + +## Todo +- Simple cli interface +- Parameter to choose time format (currently only miliseconds) diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..6ea84bd --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,99 @@ +mod xinterface { + use x11::xlib::{XCloseDisplay, XDefaultRootWindow, XFree, XOpenDisplay}; + use x11::xss::{XScreenSaverAllocInfo, XScreenSaverQueryExtension, XScreenSaverQueryInfo}; + use std::ffi::c_void; + + pub struct Display { + display_ptr: *mut x11::xlib::Display, + } + + impl Display { + pub fn open() -> Result { + let display_ptr; + unsafe { + display_ptr = XOpenDisplay(std::ptr::null()); + } + + if display_ptr.is_null() { + return Err(()); + } else { + return Ok(Display { display_ptr }); + } + } + pub fn has_screen_saver_extesnsion(&self) -> bool { + let mut event_basep: i32 = 0; + let mut error_basep: i32 = 0; + unsafe { + XScreenSaverQueryExtension( + self.display_ptr, + &mut event_basep, + &mut error_basep + ) != 0 + } + } + + pub fn get_screen_saver_info(&self) -> Result { + let xssi_ptr; + unsafe { + xssi_ptr = XScreenSaverAllocInfo(); + } + if xssi_ptr.is_null() { + return Err(()); + } + unsafe { + let root_window = XDefaultRootWindow(self.display_ptr); + if XScreenSaverQueryInfo(self.display_ptr, root_window, xssi_ptr) == 0 { + return Err(()); + } + } + Ok(ScreenSaverInfo { xssi_ptr }) + } + } + + impl Drop for Display { + fn drop(&mut self) { + unsafe { + XCloseDisplay(self.display_ptr); + } + } + } + + pub struct ScreenSaverInfo { + xssi_ptr: *mut x11::xss::XScreenSaverInfo, + } + + impl ScreenSaverInfo { + pub fn idle_time(&self) -> u64 { + unsafe { (*self.xssi_ptr).idle } + } + } + + impl Drop for ScreenSaverInfo { + fn drop(&mut self) { + unsafe { + XFree(self.xssi_ptr as *mut c_void); + } + } + } +} + +use xinterface::Display; + +pub fn get_idle_time() -> u64 { + let display = Display::open().unwrap_or_else(|_| { + println!("Cannot open display"); + std::process::exit(1); + }); + + if !display.has_screen_saver_extesnsion() { + println!("Screen doesn't have screen saver extension"); + std::process::exit(1); + } + + let screen_saver_info = display.get_screen_saver_info().unwrap_or_else(|_| { + println!("Cannot get screen saver info"); + std::process::exit(1); + }); + + screen_saver_info.idle_time() +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..bf19ba8 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("{}", rs_idle::get_idle_time()); +}