use std::ffi::{c_int, c_uint, c_ulong, c_void};
#[allow(clippy::upper_case_acronyms)]
type XID = c_ulong;
#[derive(Eq, PartialEq, Clone, Copy)]
#[repr(transparent)]
pub struct Bool(c_int);
#[repr(transparent)]
pub struct Window(XID);
#[repr(transparent)]
pub struct Display(c_void);
#[repr(transparent)]
pub struct Screen(c_void);
#[repr(transparent)]
pub struct Atom(XID);
#[allow(non_upper_case_globals)]
pub const True: Bool = Bool(1);
#[allow(non_upper_case_globals)]
pub const False: Bool = Bool(0);
#[allow(non_upper_case_globals)]
pub const None: Window = Window(0);
pub type KeyCode = u8;
pub type KeySym = XID;
#[allow(non_upper_case_globals)]
pub const NoSymbol: KeySym = 0;
#[repr(C)]
pub struct XModifierKeymap {
pub max_keypermod: c_int,
pub modifiermap: *const KeyCode,
}
#[link(name = "X11")]
extern {
pub fn XOpenDisplay(display_name: *const u8) -> *mut Display;
pub fn XCloseDisplay(display: *mut Display) -> c_int;
pub fn XDefaultScreen(display: *mut Display) -> c_int;
pub fn XScreenOfDisplay(display: *mut Display, screen_number: c_int) -> *mut Screen;
pub fn XRootWindowOfScreen(screen: *mut Screen) -> Window;
pub fn XWidthOfScreen(screen: *mut Screen) -> c_int;
pub fn XHeightOfScreen(screen: *mut Screen) -> c_int;
pub fn XRootWindow(display: *mut Display, screen_number: c_int) -> Window;
pub fn XQueryPointer(
display: *mut Display,
w: Window,
root_return: *mut Window,
child_return: *mut Window,
root_x_return: *mut c_int,
root_y_return: *mut c_int,
win_x_return: *mut c_int,
win_y_return: *mut c_int,
mask_return: *mut c_uint,
) -> Bool;
pub fn XWarpPointer(
display: *mut Display,
src_w: Window,
dest_w: Window,
src_x: c_int,
src_y: c_int,
src_width: c_uint,
src_height: c_uint,
dest_x: c_int,
dest_y: c_int,
) -> c_int;
pub fn XSync(display: *mut Display, discard: Bool) -> c_int;
pub fn XFlush(display: *mut Display) -> c_int;
pub fn XDisplayKeycodes(
display: *mut Display,
min_keycodes_return: &mut c_int,
max_keycodes_return: &mut c_int,
) -> c_int;
pub fn XGetModifierMapping(display: *mut Display) -> *const XModifierKeymap;
pub fn XGetKeyboardMapping(
display: *mut Display,
first_keycode: KeyCode,
keycode_count: c_int,
keysyms_per_keycode_return: *mut c_int,
) -> *const KeySym;
pub fn XFree(data: *const KeySym) -> c_int;
pub fn XKeysymToString(keysym: KeySym) -> *const u8;
pub fn XChangeKeyboardMapping(
display: *mut Display,
first_keycode: c_int,
keysyms_per_keycode: c_int,
keysyms: *const KeySym,
num_codes: c_int,
);
pub fn XFreeModifiermap(modmap: *const XModifierKeymap);
}