Initial version
Basic functionality - printing idle time in miliseconds
This commit is contained in:
commit
26ab019c26
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/target
|
32
Cargo.lock
generated
Normal file
32
Cargo.lock
generated
Normal 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
12
Cargo.toml
Normal 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
5
Readme.md
Normal 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
99
src/lib.rs
Normal 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
3
src/main.rs
Normal file
|
@ -0,0 +1,3 @@
|
|||
fn main() {
|
||||
println!("{}", rs_idle::get_idle_time());
|
||||
}
|
Loading…
Reference in a new issue