xkbcommon_dl/
x11.rs

1use std::os::raw::c_int;
2
3use once_cell::sync::OnceCell;
4
5pub type xcb_connection_t = c_void;
6
7use super::*;
8
9pub const XKB_X11_MIN_MAJOR_XKB_VERSION: u16 = 1;
10pub const XKB_X11_MIN_MINOR_XKB_VERSION: u16 = 0;
11
12#[repr(C)]
13#[derive(Copy, Clone, Debug, PartialEq)]
14pub enum xkb_x11_setup_xkb_extension_flags {
15    /// Do not apply any flags.
16    XKB_X11_SETUP_XKB_EXTENSION_NO_FLAGS = 0,
17}
18
19dlopen_external_library!(XkbCommonX11,
20functions:
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
45pub fn xkbcommon_x11_option() -> Option<&'static XkbCommonX11> {
46    static XKBCOMMON_X11_OPTION: OnceCell<Option<XkbCommonX11>> = OnceCell::new();
47    XKBCOMMON_X11_OPTION
48        .get_or_init(|| {
49            open_with_sonames(
50                &["libxkbcommon-x11.so.0", "libxkbcommon-x11.so"],
51                None,
52                |name| unsafe { XkbCommonX11::open(name) },
53            )
54        })
55        .as_ref()
56}
57
58pub fn xkbcommon_x11_handle() -> &'static XkbCommonX11 {
59    xkbcommon_x11_option().expect("Library libxkbcommon-x11.so could not be loaded.")
60}