use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
use tiny_xlib::Display;
static WAS_CALLED: AtomicBool = AtomicBool::new(false);
unsafe extern "C" fn prev_handler(
_conn: *mut x11_dl::xlib::Display,
_event: *mut x11_dl::xlib::XErrorEvent,
) -> i32 {
WAS_CALLED.store(true, Ordering::SeqCst);
0
}
#[test]
fn replace_old_handler() {
tracing_subscriber::fmt::try_init().ok();
unsafe {
(x11_dl::xlib::Xlib::open().unwrap().XSetErrorHandler)(Some(prev_handler));
}
let flag = Arc::new(AtomicBool::new(false));
tiny_xlib::register_error_handler({
let flag = flag.clone();
Box::new(move |_, _| {
flag.store(true, Ordering::SeqCst);
false
})
})
.unwrap();
let display = Display::new(None).unwrap();
trigger_error(&display);
assert!(flag.load(Ordering::SeqCst));
assert!(WAS_CALLED.load(Ordering::SeqCst));
}
fn trigger_error(display: &Display) {
let xlib = x11_dl::xlib::Xlib::open().unwrap();
unsafe {
(xlib.XCreateGC)(display.as_ptr().cast(), 0x1337, 0, std::ptr::null_mut());
(xlib.XSync)(display.as_ptr().cast(), 0);
}
}