use crate::wrappers::xlib::xlib_connection::XlibConnection;
use std::error::Error;
use std::ops::Deref;
use std::os::raw::c_int;
use x11_dl::xlib::Display;
use x11_dl::xlib_xcb::Xlib_xcb;
use x11rb::xcb_ffi::XCBConnection;
pub struct XlibXcbConnection {
xcb_connection: XCBConnection,
xlib_connection: XlibConnection,
}
impl XlibXcbConnection {
pub fn open() -> Result<Self, Box<dyn Error>> {
let xlib_xcb = Xlib_xcb::open()?;
let xlib_connection = XlibConnection::open()?;
xlib_connection.set_xcb_queue_owner(&xlib_xcb);
let xcb_connection = unsafe { (xlib_xcb.XGetXCBConnection)(xlib_connection.as_raw()) };
assert!(!xcb_connection.is_null());
let xcb_connection =
unsafe { XCBConnection::from_raw_xcb_connection(xcb_connection, false)? };
Ok(Self { xcb_connection, xlib_connection })
}
pub fn default_screen(&self) -> c_int {
self.xlib_connection.default_screen_index()
}
pub fn xlib_display(&self) -> *mut Display {
self.xlib_connection.as_raw()
}
pub fn xcb_connection(&self) -> &XCBConnection {
&self.xcb_connection
}
#[cfg(feature = "opengl")]
pub fn xlib_connection(&self) -> &XlibConnection {
&self.xlib_connection
}
}
impl Deref for XlibXcbConnection {
type Target = XCBConnection;
fn deref(&self) -> &Self::Target {
&self.xcb_connection
}
}