use std::{ffi::c_void, os::raw::c_char, ptr::null, time::Duration};
use anyhow::anyhow;
use x11::{
xlib::{XCloseDisplay, XDefaultScreen, XFree, XOpenDisplay, XRootWindow},
xss::{XScreenSaverAllocInfo, XScreenSaverQueryInfo},
};
use crate::Result;
#[inline]
pub fn get_idle_time() -> Result<Duration> {
let info = unsafe { XScreenSaverAllocInfo() };
let display = unsafe { XOpenDisplay(null::<c_char>()) };
if (display.is_null()) {
return Err(anyhow!("Failed to open display"));
}
let screen = unsafe { XDefaultScreen(display) };
let root_window = unsafe { XRootWindow(display, screen) };
let status = unsafe { XScreenSaverQueryInfo(display, root_window, info) };
let time = unsafe { (*info).idle };
unsafe {
XFree(info.cast::<c_void>());
}
unsafe {
XCloseDisplay(display);
}
if status == 1 {
Ok(Duration::from_millis(time))
} else {
Err(anyhow!("XScreenSaverQueryInfo is not OK"))
}
}