rewriting X wrapper
This commit is contained in:
parent
801f8b6265
commit
7748132fca
3 changed files with 69 additions and 0 deletions
45
src/xwrap/display.rs
Normal file
45
src/xwrap/display.rs
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
use std::{env, ffi, ptr};
|
||||||
|
|
||||||
|
use x11::xlib::{self, BadGC};
|
||||||
|
|
||||||
|
use super::error;
|
||||||
|
|
||||||
|
pub struct Display {
|
||||||
|
ptr: *mut xlib::Display,
|
||||||
|
name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display {
|
||||||
|
/// Call XOpenDisplay to open a display.
|
||||||
|
/// If `display_name` is `None`, the value of the `DISPLAY` environment variable will be used.
|
||||||
|
pub fn open(display_name: Option<String>) -> anyhow::Result<Self> {
|
||||||
|
let name = ffi::CString::new(if let Some(name) = display_name {
|
||||||
|
name
|
||||||
|
} else {
|
||||||
|
env::var("DISPLAY")?
|
||||||
|
})?;
|
||||||
|
|
||||||
|
let name_ptr = name.as_bytes().as_ptr();
|
||||||
|
|
||||||
|
// try to open display and get either display pointer or null
|
||||||
|
let display_ptr = unsafe { xlib::XOpenDisplay(name_ptr as *const i8) };
|
||||||
|
|
||||||
|
// if display is null, return an error, otherwise return instance successfully
|
||||||
|
if display_ptr == ptr::null_mut::<xlib::_XDisplay>() {
|
||||||
|
Err(error::XError::OpenDisplayError(name.into_string()?).into())
|
||||||
|
} else {
|
||||||
|
Ok(Self {
|
||||||
|
ptr: display_ptr,
|
||||||
|
name: name.into_string()?,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for Display {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
if unsafe { xlib::XCloseDisplay(self.ptr) } == BadGC.into() {
|
||||||
|
eprintln!("BadGC Error when closing display '{}'.", self.name);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
22
src/xwrap/error.rs
Normal file
22
src/xwrap/error.rs
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
|
/// Various errors to be used in this wrapper
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum XError {
|
||||||
|
OpenDisplayError(String),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Display for XError {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"{}",
|
||||||
|
match self {
|
||||||
|
XError::OpenDisplayError(display_name) =>
|
||||||
|
format!("error when opening display '{}'", display_name),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::error::Error for XError {}
|
2
src/xwrap/mod.rs
Normal file
2
src/xwrap/mod.rs
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
pub mod display;
|
||||||
|
pub mod error;
|
Loading…
Reference in a new issue