cabytcini/src/xsetroot.rs

57 lines
1.2 KiB
Rust

#![allow(unsafe_code)]
use anyhow::{anyhow, Result};
use std::ffi::CString;
use std::os::raw::c_char;
use std::ptr;
use x11::xlib;
pub(crate) struct XSetRoot {
display: *mut xlib::Display,
root_window: xlib::Window,
}
impl XSetRoot {
pub(crate) fn init() -> Result<Self> {
unsafe {
let display = xlib::XOpenDisplay(ptr::null());
if display.is_null() {
return Err(anyhow!("cannot open display"));
}
let screen = xlib::XDefaultScreen(display);
let root_window = xlib::XRootWindow(display, screen);
Ok(Self {
display,
root_window,
})
}
}
pub(crate) fn render(&self, text: String) -> Result<()> {
let status_c = CString::new(text)?;
unsafe {
xlib::XStoreName(
self.display,
self.root_window,
status_c.as_ptr() as *mut c_char,
);
xlib::XFlush(self.display);
}
Ok(())
}
}
impl Drop for XSetRoot {
fn drop(&mut self) {
unsafe {
xlib::XCloseDisplay(self.display);
}
}
}