Improvements for api

Better error handling, focused on using in other crates
This commit is contained in:
naoto 2022-09-28 22:01:22 +02:00
parent 26ab019c26
commit 89a8cad693
3 changed files with 36 additions and 22 deletions

View file

@ -6,7 +6,5 @@ edition = "2021"
[profile.release] [profile.release]
strip = true strip = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
x11 = { version = "2.20.0", features = ["xss", "xlib"] } x11 = { version = "2.20.0", features = ["xss", "xlib"] }

View file

@ -1,7 +1,7 @@
mod xinterface { mod xinterface {
use std::ffi::c_void;
use x11::xlib::{XCloseDisplay, XDefaultRootWindow, XFree, XOpenDisplay}; use x11::xlib::{XCloseDisplay, XDefaultRootWindow, XFree, XOpenDisplay};
use x11::xss::{XScreenSaverAllocInfo, XScreenSaverQueryExtension, XScreenSaverQueryInfo}; use x11::xss::{XScreenSaverAllocInfo, XScreenSaverQueryExtension, XScreenSaverQueryInfo};
use std::ffi::c_void;
pub struct Display { pub struct Display {
display_ptr: *mut x11::xlib::Display, display_ptr: *mut x11::xlib::Display,
@ -24,11 +24,8 @@ mod xinterface {
let mut event_basep: i32 = 0; let mut event_basep: i32 = 0;
let mut error_basep: i32 = 0; let mut error_basep: i32 = 0;
unsafe { unsafe {
XScreenSaverQueryExtension( XScreenSaverQueryExtension(self.display_ptr, &mut event_basep, &mut error_basep)
self.display_ptr, != 0
&mut event_basep,
&mut error_basep
) != 0
} }
} }
@ -79,21 +76,32 @@ mod xinterface {
use xinterface::Display; use xinterface::Display;
pub fn get_idle_time() -> u64 { pub enum Error {
let display = Display::open().unwrap_or_else(|_| { CannotOpenDisplay,
println!("Cannot open display"); NoScreenSaverExtension,
std::process::exit(1); CannotGetScreenSaverinfo,
}); }
impl Error {
pub fn message(&self) -> &'static str {
match self {
Self::CannotOpenDisplay => "Cannot open display",
Self::NoScreenSaverExtension => "Screen doesn't have screen saver extension",
Self::CannotGetScreenSaverinfo => "Cannot get screen saver info",
}
}
}
pub fn get_idle_time() -> Result<u64, Error> {
let display = Display::open().or(Err(Error::CannotOpenDisplay))?;
if !display.has_screen_saver_extesnsion() { if !display.has_screen_saver_extesnsion() {
println!("Screen doesn't have screen saver extension"); return Err(Error::NoScreenSaverExtension);
std::process::exit(1);
} }
let screen_saver_info = display.get_screen_saver_info().unwrap_or_else(|_| { let screen_saver_info = display
println!("Cannot get screen saver info"); .get_screen_saver_info()
std::process::exit(1); .or(Err(Error::CannotGetScreenSaverinfo))?;
});
screen_saver_info.idle_time() Ok(screen_saver_info.idle_time())
} }

View file

@ -1,3 +1,11 @@
fn main() { fn error(error: rs_idle::Error) -> ! {
println!("{}", rs_idle::get_idle_time()); println!("{}", error.message());
std::process::exit(1);
}
fn main() {
println!(
"{}",
rs_idle::get_idle_time().unwrap_or_else(|e| { error(e) })
);
} }