use x11_dl::{error, xlib};
use std::ptr;
pub struct Xlib {
connection: xlib::Xlib,
}
impl Xlib {
pub fn open() -> Result<Self> {
let connection = xlib::Xlib::open()?;
Ok(Self { connection })
}
pub unsafe fn open_display(&self, dpy: Option<&str>) -> Result<*mut xlib::Display> {
let res = match dpy {
Some(dp) => (self.connection.XOpenDisplay)(dp.as_ptr() as *const i8),
None => (self.connection.XOpenDisplay)(ptr::null()),
};
if res.is_null() {
Err(Error::DisplayOpenError(
dpy.unwrap_or("[DEFAULT]").to_owned(),
))
} else {
Ok(res)
}
}
}
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("Failed to open XDisplay with name: {0}")]
DisplayOpenError(String),
#[error(transparent)]
XlibOpenError(#[from] error::OpenError),
}
type Result<T> = std::result::Result<T, Error>;