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 | |