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