| 1 | use std::os::raw::c_int; |
| 2 | |
| 3 | use once_cell::sync::OnceCell; |
| 4 | |
| 5 | pub type xcb_connection_t = c_void; |
| 6 | |
| 7 | use super::*; |
| 8 | |
| 9 | pub const XKB_X11_MIN_MAJOR_XKB_VERSION: u16 = 1; |
| 10 | pub const XKB_X11_MIN_MINOR_XKB_VERSION: u16 = 0; |
| 11 | |
| 12 | #[repr (C)] |
| 13 | #[derive (Copy, Clone, Debug, PartialEq)] |
| 14 | pub enum xkb_x11_setup_xkb_extension_flags { |
| 15 | /// Do not apply any flags. |
| 16 | XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS = 0, |
| 17 | } |
| 18 | |
| 19 | dlopen_external_library!(XkbCommonX11, |
| 20 | functions: |
| 21 | fn xkb_x11_setup_xkb_extension( |
| 22 | *mut xcb_connection_t, |
| 23 | u16, |
| 24 | u16, |
| 25 | xkb_x11_setup_xkb_extension_flags, |
| 26 | *mut u16, |
| 27 | *mut u16, |
| 28 | *mut u8, |
| 29 | *mut u8 |
| 30 | ) -> c_int, |
| 31 | fn xkb_x11_get_core_keyboard_device_id(*mut xcb_connection_t) -> i32, |
| 32 | fn xkb_x11_keymap_new_from_device( |
| 33 | *mut xkb_context, |
| 34 | *mut xcb_connection_t, |
| 35 | i32, |
| 36 | xkb_keymap_compile_flags |
| 37 | ) -> *mut xkb_keymap, |
| 38 | fn xkb_x11_state_new_from_device( |
| 39 | *mut xkb_keymap, |
| 40 | *mut xcb_connection_t, |
| 41 | i32 |
| 42 | ) -> *mut xkb_state, |
| 43 | ); |
| 44 | |
| 45 | pub fn xkbcommon_x11_option() -> Option<&'static XkbCommonX11> { |
| 46 | static XKBCOMMON_X11_OPTION: OnceCell<Option<XkbCommonX11>> = OnceCell::new(); |
| 47 | XKBCOMMON_X11_OPTION&Option |
| 48 | .get_or_init(|| { |
| 49 | open_with_sonames( |
| 50 | &["libxkbcommon-x11.so.0" , "libxkbcommon-x11.so" ], |
| 51 | module:None, |
| 52 | |name: &str| unsafe { XkbCommonX11::open(name) }, |
| 53 | ) |
| 54 | }) |
| 55 | .as_ref() |
| 56 | } |
| 57 | |
| 58 | pub fn xkbcommon_x11_handle() -> &'static XkbCommonX11 { |
| 59 | xkbcommon_x11_option().expect(msg:"Library libxkbcommon-x11.so could not be loaded." ) |
| 60 | } |
| 61 | |