diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4657b86..8250cea 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,7 +41,7 @@ jobs: - { target: i686-pc-windows-gnu, os: windows-latest, host: -i686-pc-windows-gnu } - { target: i686-unknown-linux-gnu, os: ubuntu-latest, } - { target: x86_64-unknown-linux-gnu, os: ubuntu-latest, } - - { target: x86_64-unknown-linux-gnu, os: ubuntu-latest, options: --no-default-features, features: x11 } + - { target: x86_64-unknown-linux-gnu, os: ubuntu-latest, options: --no-default-features, features: "x11,x11-dlopen" } - { target: x86_64-unknown-linux-gnu, os: ubuntu-latest, options: --no-default-features, features: "wayland,wayland-dlopen" } - { target: x86_64-unknown-redox, os: ubuntu-latest, } - { target: x86_64-unknown-freebsd, os: ubuntu-latest, } diff --git a/Cargo.toml b/Cargo.toml index f16f618..7a550e8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,24 +17,26 @@ name = "buffer_mut" harness = false [features] -default = ["x11", "wayland", "wayland-dlopen"] +default = ["x11", "x11-dlopen", "wayland", "wayland-dlopen"] wayland = ["wayland-backend", "wayland-client", "memmap2", "nix", "fastrand"] wayland-dlopen = ["wayland-sys/dlopen"] -x11 = ["bytemuck", "nix", "x11rb", "x11-dl"] +x11 = ["as-raw-xcb-connection", "bytemuck", "nix", "tiny-xlib", "x11rb"] +x11-dlopen = ["tiny-xlib/dlopen", "x11rb/dl-libxcb"] [dependencies] log = "0.4.17" raw-window-handle = "0.5.0" [target.'cfg(all(unix, not(any(target_vendor = "apple", target_os = "android", target_os = "redox"))))'.dependencies] +as-raw-xcb-connection = { version = "1.0.0", optional = true } bytemuck = { version = "1.12.3", optional = true } memmap2 = { version = "0.6.1", optional = true } nix = { version = "0.26.1", optional = true } +tiny-xlib = { version = "0.2.1", optional = true } wayland-backend = { version = "0.1.0", features = ["client_system"], optional = true } wayland-client = { version = "0.30.0", optional = true } wayland-sys = "0.30.0" -x11-dl = { version = "2.19.1", optional = true } -x11rb = { version = "0.12.0", features = ["allow-unsafe-code", "dl-libxcb", "shm"], optional = true } +x11rb = { version = "0.12.0", features = ["allow-unsafe-code", "shm"], optional = true } [target.'cfg(all(unix, not(any(target_vendor = "apple", target_os = "android", target_os = "redox", target_os = "linux", target_os = "freebsd"))))'.dependencies] fastrand = { version = "1.8.0", optional = true } diff --git a/src/x11.rs b/src/x11.rs index f9edd44..e8b273c 100644 --- a/src/x11.rs +++ b/src/x11.rs @@ -17,9 +17,7 @@ use std::{ slice, }; -use x11_dl::xlib::Display; -use x11_dl::xlib_xcb::Xlib_xcb; - +use as_raw_xcb_connection::AsRawXcbConnection; use x11rb::connection::{Connection, SequenceNumber}; use x11rb::cookie::Cookie; use x11rb::errors::{ConnectionError, ReplyError, ReplyOrIdError}; @@ -39,9 +37,6 @@ impl X11DisplayImpl { pub(crate) unsafe fn from_xlib( display_handle: XlibDisplayHandle, ) -> Result { - // Try to open the XlibXCB shared library. - let lib_xcb = Xlib_xcb::open().swbuf_err("Failed to open XlibXCB shared library")?; - // Validate the display handle to ensure we can use it. if display_handle.display.is_null() { return Err(SoftBufferError::IncompleteDisplayHandle); @@ -49,12 +44,14 @@ impl X11DisplayImpl { // Get the underlying XCB connection. // SAFETY: The user has asserted that the display handle is valid. - let connection = - unsafe { (lib_xcb.XGetXCBConnection)(display_handle.display as *mut Display) }; + let connection = unsafe { + let display = tiny_xlib::Display::from_ptr(display_handle.display); + display.as_raw_xcb_connection() + }; // Construct the equivalent XCB display and window handles. let mut xcb_display_handle = XcbDisplayHandle::empty(); - xcb_display_handle.connection = connection; + xcb_display_handle.connection = connection.cast(); xcb_display_handle.screen = display_handle.screen; // SAFETY: If the user passed in valid Xlib handles, then these are valid XCB handles.