Initial version

Basic functionality - printing idle time in miliseconds
This commit is contained in:
naoto 2022-09-27 20:34:27 +02:00
commit 26ab019c26
6 changed files with 152 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/target

32
Cargo.lock generated Normal file
View file

@ -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",
]

12
Cargo.toml Normal file
View file

@ -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"] }

5
Readme.md Normal file
View file

@ -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)

99
src/lib.rs Normal file
View file

@ -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<Display, ()> {
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<ScreenSaverInfo, ()> {
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()
}

3
src/main.rs Normal file
View file

@ -0,0 +1,3 @@
fn main() {
println!("{}", rs_idle::get_idle_time());
}