Sfoglia il codice sorgente

Merge pull request #3511 from IllusionMan1212/x11-xkb

vendor/x11: some XKB extension procedures and constants
Jeroen van Rijn 1 anno fa
parent
commit
9575d85f1a

+ 74 - 0
vendor/x11/xlib/xlib_const.odin

@@ -1,6 +1,80 @@
 //+build linux, freebsd, openbsd
 package xlib
 
+/* ----  X11/extensions/XKB.h ---------------------------------------------------------*/
+
+XkbMinLegalKeyCode     :: 8
+XkbMaxLegalKeyCode     :: 255
+XkbMaxKeyCount         :: XkbMaxLegalKeyCode - XkbMinLegalKeyCode + 1
+XkbPerKeyBitArraySize  :: (XkbMaxLegalKeyCode + 1) / 8
+XkbKeyNameLength       :: 4
+XkbNumVirtualMods      :: 16
+XkbNumIndicators       :: 32
+XkbNumKbdGroups        :: 4
+XkbAnyActionDataSize   :: 7
+XkbUseCoreKbd          :: 0x0100
+XkbActionMessageLength :: 6
+
+XkbInfoMask :: bit_set[XkbInfoMaskBits; int]
+XkbInfoMaskBits :: enum u32 {
+	KeyTypes           = 0,
+	KeySyms            = 1,
+	ModifierMap        = 2,
+	ExplicitComponents = 3,
+	KeyActions         = 4,
+	KeyBehaviors       = 5,
+	VirtualMods        = 6,
+	VirtualModMap      = 7,
+}
+
+XkbAllClientInfoMask :: XkbInfoMask {
+	.KeyTypes,
+	.KeySyms,
+	.ModifierMap,
+}
+
+XkbAllServerInfoMask :: XkbInfoMask {
+	.ExplicitComponents,
+	.KeyActions,
+	.KeyBehaviors,
+	.VirtualMods,
+	.VirtualModMap,
+}
+
+XkbEventMask :: bit_set[XkbEventType; int]
+XkbEventType :: enum i32 {
+	NewKeyboardNotify     = 0,
+	MapNotify             = 1,
+	StateNotify           = 2,
+	ControlsNotify        = 3,
+	IndicatorStateNotify  = 4,
+	IndicatorMapNotify    = 5,
+	NamesNotify           = 6,
+	CompatMapNotify       = 7,
+	BellNotify            = 8,
+	ActionMessage         = 9,
+	AccessXNotify         = 10,
+	ExtensionDeviceNotify = 11,
+}
+
+XkbAllEventsMask :: XkbEventMask {
+	.NewKeyboardNotify,
+	.MapNotify,
+	.StateNotify,
+	.ControlsNotify,
+	.IndicatorStateNotify,
+	.IndicatorMapNotify,
+	.NamesNotify,
+	.CompatMapNotify,
+	.BellNotify,
+	.ActionMessage,
+	.AccessXNotify,
+	.ExtensionDeviceNotify,
+}
+
+
+/* ----  X11/Xlib.h ---------------------------------------------------------*/
+
 // Special values for many types. Most of these constants
 // aren't attached to a specific type.
 

+ 56 - 1
vendor/x11/xlib/xlib_procs.odin

@@ -79,7 +79,7 @@ foreign xlib {
 	DoesBackingStore    :: proc(screen: ^Screen) -> BackingStore ---
 	DoesSaveUnders      :: proc(screen: ^Screen) -> b32 ---
 	DisplayOfScreen     :: proc(screen: ^Screen) -> ^Display ---
-	ScreenNumberOfScreens :: proc(screen: ^Screen) -> i32 ---
+	ScreenNumberOfScreen :: proc(screen: ^Screen) -> i32 ---
 	EventMaskOfScreen   :: proc(screen: ^Screen) -> EventMask ---
 	WidthOfScreen       :: proc(screen: ^Screen) -> i32 ---
 	HeightOfScreen      :: proc(screen: ^Screen) -> i32 ---
@@ -1637,6 +1637,13 @@ foreign xlib {
 		wm_hints:     ^XWMHints,
 		class_hints:  ^XClassHint,
 	) ---
+	OpenIM :: proc(
+		display: ^Display,
+		rdb:      XrmHashBucket,
+		res_name: cstring,
+		res_class: cstring,
+	) -> XIM ---
+	SetLocaleModifiers :: proc(modifiers: cstring) -> cstring ---
 }
 
 @(default_calling_convention="c")
@@ -1938,4 +1945,52 @@ foreign xlib {
 	XrmInitialize :: proc() ---
 	XrmGetStringDatabase :: proc(data: cstring) -> XrmDatabase ---
 	XrmGetResource :: proc(db: XrmDatabase, name: cstring, class: cstring, type_return: ^cstring, val_return: ^XrmValue) -> b32 ---
+
+	/* ----  X11/XKBlib.h ---------------------------------------------------------*/
+
+	XkbQueryExtension :: proc(
+		display: ^Display,
+		opcode_return: ^i32,
+		event_base_return: ^i32,
+		error_base_return: ^i32,
+		major_return: ^i32,
+		minor_return: ^i32,
+	) -> b32 ---
+	XkbUseExtension :: proc(
+		display: ^Display,
+		major_return: ^i32,
+		minor_return: ^i32,
+	) -> b32 ---
+	XkbGetMap :: proc(
+		display: ^Display,
+		which: XkbInfoMask,
+		device_spec: i32,
+	) -> XkbDescPtr ---
+	XkbGetUpdatedMap :: proc(
+		display: ^Display,
+		which: XkbInfoMask,
+		desc: XkbDescPtr,
+	) -> b32 ---
+	XkbSelectEvents :: proc(
+		display: ^Display,
+		deviceID: u32,
+		bits_to_change: XkbEventMask,
+		values: XkbEventMask,
+	) -> b32 ---
+	XkbSetDetectableAutoRepeat :: proc(
+		display: ^Display,
+		detectable: b32,
+		supported: ^b32,
+	) -> b32 ---
+	XkbGetState :: proc (
+		display: ^Display,
+		device_spec: u32,
+		return_state: XkbStatePtr,
+	) -> Status ---
+	XkbGetKeySyms :: proc(
+		display: ^Display,
+		first: u32,
+		num: u32,
+		xkb: XkbDescPtr,
+	) -> Status ---
 }

+ 761 - 0
vendor/x11/xlib/xlib_types.odin

@@ -1006,6 +1006,767 @@ XConnectionWatchProc :: #type proc "c" (
 	opening: b32,
 	watch_data: rawptr)
 
+/* ----  X11/extensions/XKBlib.h ---------------------------------------------------------*/
+
+XkbAnyEvent :: struct {
+	type: i32,
+	serial: u64,
+	send_event: b32,
+	display: ^Display,
+	time: Time,
+	xkb_type: XkbEventType,
+	device: u32,
+}
+
+XkbNewKeyboardNotifyEvent :: struct {
+	type: i32,
+	serial: u64,
+	send_event: b32,
+	display: ^Display,
+	time: Time,
+	xkb_type: XkbEventType,
+	device: i32,
+	old_device: i32,
+	min_key_code: i32,
+	max_key_code: i32,
+	old_min_key_code: i32,
+	old_max_key_code: i32,
+	changed: u32,
+	req_major: i8,
+	req_minor: i8,
+}
+
+XkbMapNotifyEvent :: struct {
+	type: i32,
+	serial: u64,
+	send_event: b32,
+	display: ^Display,
+	time: Time,
+	xkb_type: XkbEventType,
+	device: i32,
+	changed: u32,
+	flags: u32,
+	first_type: i32,
+	num_types: i32,
+	min_key_code: KeyCode,
+	max_key_code: KeyCode,
+	first_key_sym: KeyCode,
+	first_key_act: KeyCode,
+	first_key_behavior: KeyCode,
+	first_key_explicit: KeyCode,
+	first_modmap_key: KeyCode,
+	first_vmodmap_key: KeyCode,
+	num_key_syms: i32,
+	num_key_acts: i32,
+	num_key_behaviors: i32,
+	num_key_explicit: i32,
+	num_modmap_keys: i32,
+	num_vmodmap_keys: i32,
+	vmods: u32,
+}
+
+XkbStateNotifyEvent :: struct {
+	type: i32,
+	serial: u64,
+	send_event: b32,
+	display: ^Display,
+	time: Time,
+	xkb_type: XkbEventType,
+	device: i32,
+	changed: u32,
+	group: i32,
+	base_group: i32,
+	latched_group: i32,
+	locked_group: i32,
+	mods: u32,
+	base_mods: u32,
+	latched_mods: u32,
+	locked_mods: u32,
+	compat_state: i32,
+	grab_mods: u8,
+	compat_grab_mods: u8,
+	lookup_mods: u8,
+	compat_lookup_mods: u8,
+	ptr_buttons: i32,
+	keycode: KeyCode,
+	event_type: i8, // should be EventType but needs to be i8 instead of i32
+	req_major: i8,
+	req_minor: i8,
+}
+
+XkbControlsNotifyEvent :: struct {
+	type: i32,
+	serial: u64,
+	send_event: b32,
+	display: ^Display,
+	time: Time,
+	xkb_type: XkbEventType,
+	device: i32,
+	changed_ctrls: u32,
+	enabled_ctrls: u32,
+	enabled_ctrls_changes: u32,
+	num_groups: i32,
+	keycode: KeyCode,
+	event_type: i8,
+	req_major: i8,
+	req_minor: i8,
+}
+
+XkbIndicatorNotifyEvent :: struct {
+	type: i32,
+	serial: u64,
+	send_event: b32,
+	display: ^Display,
+	time: Time,
+	xkb_type: XkbEventType,
+	device: i32,
+	changed: u32,
+	state: u32,
+}
+
+XkbNamesNotifyEvent :: struct {
+	type: i32,
+	serial: u64,
+	send_event: b32,
+	display: ^Display,
+	time: Time,
+	xkb_type: XkbEventType,
+	device: i32,
+	changed: u32,
+	first_type: i32,
+	num_types: i32,
+	first_lvl: i32,
+	num_lvls: i32,
+	num_aliases: i32,
+	num_radio_groups: i32,
+	changed_vmods: u32,
+	changed_groups: u32,
+	changed_indicators: u32,
+	first_key: i32,
+	num_keys: i32,
+}
+
+XkbCompatMapNotifyEvent :: struct {
+	type: i32,
+	serial: u64,
+	send_event: b32,
+	display: ^Display,
+	time: Time,
+	xkb_type: XkbEventType,
+	device: i32,
+	changed_groups: u32,
+	first_si: i32,
+	num_si: i32,
+	num_total_si: i32,
+}
+
+XkbBellNotifyEvent :: struct {
+	type: i32,
+	serial: u64,
+	send_event: b32,
+	display: ^Display,
+	time: Time,
+	xkb_type: XkbEventType,
+	device: i32,
+	percent: i32,
+	pitch: i32,
+	duration: i32,
+	bell_class: i32,
+	bell_id: i32,
+	name: Atom,
+	window: Window,
+	event_only: b32,
+}
+
+XkbActionMessageEvent :: struct {
+	type: i32,
+	serial: u64,
+	send_event: b32,
+	display: ^Display,
+	time: Time,
+	xkb_type: XkbEventType,
+	device: i32,
+	keycode: KeyCode,
+	press: b32,
+	key_event_follows: b32,
+	group: i32,
+	mods: u32,
+	message: [XkbActionMessageLength+1]i8,
+}
+
+XkbAccessXNotifyEvent :: struct {
+	type: i32,
+	serial: u64,
+	send_event: b32,
+	display: ^Display,
+	time: Time,
+	xkb_type: XkbEventType,
+	device: i32,
+	detail: i32,
+	keycode: i32,
+	sk_delay: i32,
+	debounce_delay: i32,
+}
+
+XkbExtensionDeviceNotifyEvent :: struct {
+	type: i32,
+	serial: u64,
+	send_event: b32,
+	display: ^Display,
+	time: Time,
+	xkb_type: XkbEventType,
+	device: i32,
+	reason: u32,
+	supported: u32,
+	unsupported: u32,
+	first_btn: i32,
+	num_btns: i32,
+	leds_defined: u32,
+	led_state: u32,
+	led_class: i32,
+	led_id: i32,
+}
+
+XkbEvent :: struct #raw_union {
+	type: XkbEventType,
+	any: XkbAnyEvent,
+	new_kbd: XkbNewKeyboardNotifyEvent,
+	_map: XkbMapNotifyEvent,
+	state: XkbStateNotifyEvent,
+	ctrls: XkbControlsNotifyEvent,
+	indicators: XkbIndicatorNotifyEvent,
+	names: XkbNamesNotifyEvent,
+	compat: XkbCompatMapNotifyEvent,
+	bell: XkbBellNotifyEvent,
+	message: XkbActionMessageEvent,
+	accessx: XkbAccessXNotifyEvent,
+	device: XkbExtensionDeviceNotifyEvent,
+	core: XEvent,
+}
+
+/* ----  X11/extensions/XKBgeom.h ---------------------------------------------------------*/
+
+XkbPointRec :: struct {
+	x: i16,
+	y: i16,
+}
+XkbPointPtr :: ^XkbPointRec
+
+XkbBoundsRec :: struct {
+	x1, x2: i16,
+	y1, y2: i16,
+}
+XkbBoundsPtr :: ^XkbBoundsRec
+
+XkbOutlineRec :: struct {
+	num_points: u16,
+	sz_points: u16,
+	corner_radius: u16,
+	points: [^]XkbPointRec,
+}
+XkbOutlinePtr :: ^XkbOutlineRec
+
+XkbShapeRec :: struct {
+	name: Atom,
+	num_outlines: u16,
+	sz_outlines: u16,
+	outlines: [^]XkbOutlineRec,
+	approx: XkbOutlinePtr,
+	primary: XkbOutlinePtr,
+	bounds: XkbBoundsRec,
+}
+XkbShapePtr :: ^XkbShapeRec
+
+XkbPropertyRec :: struct {
+	name: cstring,
+	value: cstring,
+}
+XkbPropertyPtr :: ^XkbPropertyRec
+
+XkbColorRec :: struct {
+	pixel: u32,
+	spec: ^u8, // cstring?
+}
+XkbColorPtr :: ^XkbColorRec
+
+XkbKeyRec :: struct {
+	name: XkbKeyNameRec,
+	gap: i16,
+	shape_ndx: u8,
+	color_ndx: u8,
+}
+XkbKeyPtr :: ^XkbKeyRec
+
+XkbRowRec :: struct {
+	top: i16,
+	left: i16,
+	num_keys: u16,
+	sz_keys: u16,
+	vertical: i32,
+	keys: [^]XkbKeyRec,
+	bounds: XkbBoundsRec,
+}
+XkbRowPtr :: ^XkbRowRec
+
+XkbAnyDoodadRec :: struct {
+	name: Atom,
+	type: u8,
+	priority: u8,
+	top: i16,
+	left: i16,
+	angle: i16,
+}
+XkbAnyDoodadPtr :: ^XkbAnyDoodadRec
+
+XkbShapeDoodadRec :: struct {
+	name: Atom,
+	type: u8,
+	priority: u8,
+	top: i16,
+	left: i16,
+	angle: i16,
+	color_ndx: u16,
+	shape_ndx: u16,
+}
+XkbShapeDoodadPtr :: ^XkbShapeDoodadRec
+
+XkbTextDoodadRec :: struct {
+	name: Atom,
+	type: u8,
+	priority: u8,
+	top: i16,
+	left: i16,
+	angle: i16,
+	color_ndx: u16,
+	text: cstring,
+	font: cstring,
+}
+XkbTextDoodadPtr :: ^XkbTextDoodadRec
+
+XkbIndicatorDoodadRec :: struct {
+	name: Atom,
+	type: u8,
+	priority: u8,
+	top: i16,
+	left: i16,
+	angle: i16,
+	color_ndx: u16,
+	on_color_ndx: u16,
+	off_color_ndx: u16,
+}
+XkbIndicatorDoodadPtr :: ^XkbIndicatorDoodadRec
+
+XkbLogoDoodadRec :: struct {
+	name: Atom,
+	type: u8,
+	priority: u8,
+	top: i16,
+	left: i16,
+	angle: i16,
+	color_ndx: u16,
+	shape_ndx: u16,
+	logo_name: cstring,
+}
+XkbLogoDoodadPtr :: ^XkbLogoDoodadRec
+
+XkbDoodadRec :: struct #raw_union {
+	any: XkbAnyDoodadRec,
+	shape: XkbShapeDoodadRec,
+	text: XkbTextDoodadRec,
+	indicator: XkbIndicatorDoodadRec,
+	logo: XkbLogoDoodadRec,
+}
+XkbDoodadPtr :: ^XkbDoodadRec
+
+XkbOverlayKeyRec :: struct {
+	over: XkbKeyNameRec,
+	under: XkbKeyNameRec,
+}
+XkbOverlayKeyPtr :: ^XkbOverlayKeyRec
+
+XkbOverlayRowRec :: struct {
+	row_under: u16,
+	num_keys: u16,
+	sz_keys: u16,
+	keys: [^]XkbOverlayKeyRec,
+}
+XkbOverlayRowPtr :: ^XkbOverlayRowRec
+
+XkbOverlayRec :: struct {
+	name: Atom,
+	section_under: XkbSectionPtr,
+	num_rows: u16,
+	sz_rows: u16,
+	rows: [^]XkbOverlayRowRec,
+	bounds: [^]XkbBoundsRec,
+}
+XkbOverlayPtr :: ^XkbOverlayRec
+
+XkbSectionRec :: struct {
+	name: Atom,
+	priority: u8,
+	top: i16,
+	left: i16,
+	width: u16,
+	height: u16,
+	angle: i16,
+	num_rows: u16,
+	num_doodads: u16,
+	num_overlays: u16,
+	sz_rows: u16,
+	sz_doodads: u16,
+	sz_overlays: u16,
+	rows: [^]XkbRowRec,
+	doodads: [^]XkbDoodadRec,
+	bounds: XkbBoundsRec,
+	overlays: [^]XkbOverlayRec,
+}
+XkbSectionPtr :: ^XkbSectionRec
+
+XkbGeometryRec :: struct {
+	name: Atom,
+	width_mm: u16,
+	height_mm: u16,
+	label_font: cstring,
+	label_color: XkbColorPtr,
+	base_color: XkbColorPtr,
+	sz_properties: u16,
+	sz_colors: u16,
+	sz_shapes: u16,
+	sz_sections: u16,
+	sz_doodads: u16,
+	sz_key_aliases: u16,
+	num_properties: u16,
+	num_colors: u16,
+	num_shapes: u16,
+	num_sections: u16,
+	num_doodads: u16,
+	num_key_aliases: u16,
+	properties: [^]XkbPropertyRec,
+	colors: [^]XkbColorRec,
+	shapes: [^]XkbShapeRec,
+	sections: [^]XkbSectionRec,
+	doodads: [^]XkbDoodadRec,
+	key_aliases: [^]XkbKeyAliasRec,
+}
+XkbGeometryPtr :: ^XkbGeometryRec
+
+
+/* ----  X11/extensions/XKBstr.h ---------------------------------------------------------*/
+
+XkbStateRec :: struct {
+	group: u8,
+	locked_group: u8,
+	base_group: u16,
+	latched_group: u16,
+	mods: u8,
+	base_mods: u8,
+	latched_mods: u8,
+	locked_mods: u8,
+	compat_state: u8,
+	grab_mods: u8,
+	compat_grab_mods: u8,
+	lookup_mods: u8,
+	compat_lookup_mods: u8,
+	ptr_buttons: u16,
+}
+XkbStatePtr :: ^XkbStateRec
+
+XkbModsRec :: struct {
+	mask: u8,	/* effective mods */
+	real_mods: u8,
+	vmods: u16,
+}
+XkbModsPtr :: ^XkbModsRec
+
+XkbKTMapEntryRec :: struct {
+	active: b32,
+	level: u8,
+	mods: XkbModsRec,
+}
+XkbKTMapEntryPtr :: ^XkbKTMapEntryRec
+
+XkbKeyTypeRec :: struct {
+	mod: XkbModsRec,
+	num_levels: u8,
+	map_count: u8,
+	_map: [^]XkbKTMapEntryRec,
+	preserve: [^]XkbModsRec,
+	name: Atom,
+	level_names: [^]Atom,
+}
+XkbKeyTypePtr :: ^XkbKeyTypeRec
+
+XkbBehavior :: struct {
+	type: u8,
+	data: u8,
+}
+
+XkbAnyAction :: struct {
+	type: u8,
+	data: [XkbAnyActionDataSize]u8,
+}
+
+XkbModAction :: struct {
+	type: u8,
+	flags: u8,
+	mask: u8,
+	real_mods: u8,
+	vmods1: u8,
+	vmods2: u8,
+}
+
+XkbGroupAction :: struct {
+	type: u8,
+	flags: u8,
+	group_XXX: i8,
+}
+
+XkbISOAction :: struct {
+	type: u8,
+	flags: u8,
+	mask: u8,
+	real_mods: u8,
+	group_XXX: i8,
+	affect: u8,
+	vmods1: u8,
+	vmods2: u8,
+}
+
+XkbPtrAction :: struct {
+	type: u8,
+	flags: u8,
+	high_XXX: u8,
+	low_XXX: u8,
+	high_YYY: u8,
+	low_YYY: u8,
+}
+
+XkbPtrBtnAction :: struct {
+	type: u8,
+	flags: u8,
+	count: u8,
+	button: u8,
+}
+
+XkbPtrDfltAction :: struct {
+	type: u8,
+	flags: u8,
+	affect: u8,
+	value_XXX: u8,
+}
+
+XkbSwitchScreenAction :: struct {
+	type: u8,
+	flags: u8,
+	screenXXX: i8,
+}
+
+XkbCtrlsAction :: struct {
+	type: u8,
+	flags: u8,
+	ctrls3: u8,
+	ctrls2: u8,
+	ctrls1: u8,
+	ctrls0: u8,
+}
+
+XkbMessageAction :: struct {
+	type: u8,
+	flags: u8,
+	message: [6]u8,
+}
+
+XkbRedirectKeyAction :: struct {
+	type: u8,
+	new_key: u8,
+	mods_mask: u8,
+	mods: u8,
+	vmods_mask0: u8,
+	vmods_mask1: u8,
+	vmods0: u8,
+	vmods1: u8,
+}
+
+XkbDeviceBtnAction :: struct {
+	type: u8,
+	flags: u8,
+	count: u8,
+	button: u8,
+	device: u8,
+}
+
+XkbDeviceValuatorAction :: struct {
+	type: u8,
+	device: u8,
+	v1_what: u8,
+	v1_ndx: u8,
+	v1_value: u8,
+	v2_what: u8,
+	v2_ndx: u8,
+	v2_value: u8,
+}
+
+XkbAction :: struct #raw_union {
+	any: XkbAnyAction,
+	mod: XkbModAction,
+	group: XkbGroupAction,
+	iso: XkbISOAction,
+	ptr: XkbPtrAction,
+	btn: XkbPtrBtnAction,
+	dflt: XkbPtrDfltAction,
+	screen: XkbSwitchScreenAction,
+	ctrls: XkbCtrlsAction,
+	msg: XkbMessageAction,
+	redirect: XkbRedirectKeyAction,
+	devbtn: XkbDeviceBtnAction,
+	devval: XkbDeviceValuatorAction,
+	type: u8,
+}
+
+XkbControlsRec :: struct {
+	mk_dflt_btn: u8,
+	num_groups: u8,
+	groups_wrap: u8,
+	internal: XkbModsRec,
+	ignore_lock: XkbModsRec,
+	enabled_ctrls: u32,
+	repeat_delay: u16,
+	repeat_interval: u16,
+	slow_keys_delay: u16,
+	debounce_delay: u16,
+	mk_delay: u16,
+	mk_interval: u16,
+	mk_time_to_max: u16,
+	mk_max_speed: u16,
+	mk_curve: i16,
+	ax_options: u16,
+	ax_timeout: u16,
+	axt_opts_mask: u16,
+	axt_opts_values: u16,
+	axt_ctrls_mask: u32,
+	axt_ctrls_values: u32,
+	per_key_repeat: [XkbPerKeyBitArraySize]u8,
+}
+XkbControlsPtr :: ^XkbControlsRec
+
+XkbServerMapRec :: struct {
+	num_acts: u16,
+	size_acts: u16,
+	acts: [^]XkbAction,
+
+	behaviors: [^]XkbBehavior,
+	key_acts: [^]u16,
+	explicit: [^]u8,
+	vmods: [XkbNumVirtualMods]u8,
+	vmodmap: [^]u16,
+}
+XkbServerMapPtr :: ^XkbServerMapRec
+
+XkbSymMapRec :: struct {
+	kt_index: [XkbNumKbdGroups]u8,
+	group_info: u8,
+	width: u8,
+	offset: u16,
+}
+XkbSymMapPtr :: ^XkbSymMapRec
+
+XkbClientMapRec :: struct {
+	size_types: u8,
+	num_types: u8,
+	types: [^]XkbKeyTypeRec,
+
+	size_syms: u16,
+	num_syms: u16,
+	syms: [^]XID, // Keysym
+	key_sym_map: [^]XkbSymMapRec,
+
+	modmap: [^]u8,
+}
+XkbClientMapPtr :: ^XkbClientMapRec
+
+XkbSymInterpretRec :: struct {
+	sym: XID, // KeySym
+	flags: u8,
+	match: u8,
+	mods: u8,
+	virtual_mod: u8,
+	act: XkbAnyAction,
+}
+XkbSymInterpretPtr :: ^XkbSymInterpretRec
+
+XkbCompatMapRec :: struct {
+	sym_interpret: [^]XkbSymInterpretRec,
+	groups: [XkbNumKbdGroups]XkbModsRec,
+	num_si: u16,
+	size_si: u16,
+}
+XkbCompatMapPtr :: ^XkbCompatMapRec
+
+XkbIndicatorMapRec :: struct {
+	flags: u8,
+	which_groups: u8,
+	groups: u8,
+	which_mods: u8,
+	mods: XkbModsRec,
+	ctrls: u32,
+}
+XkbIndicatorMapPtr :: ^XkbIndicatorMapRec
+
+XkbIndicatorRec :: struct {
+	phys_indicators: u64,
+	maps: [XkbNumIndicators]XkbIndicatorMapRec,
+}
+XkbIndicatorPtr :: ^XkbIndicatorRec
+
+XkbKeyNameRec :: struct {
+	name: [XkbKeyNameLength]i8, // Non nul-terminated string
+}
+XkbKeyNamePtr :: ^XkbKeyNameRec
+
+XkbKeyAliasRec :: struct {
+	real: [XkbKeyNameLength]i8, // Non nul-terminated string
+	alias: [XkbKeyNameLength]i8, // Non nul-terminated string
+}
+XkbKeyAliasPtr :: ^XkbKeyAliasRec
+
+XkbNamesRec :: struct {
+	keycodes: Atom,
+	geometry: Atom,
+	symbols: Atom,
+	types: Atom,
+	compat: Atom,
+	vmods: [XkbNumVirtualMods]Atom,
+	indicators: [XkbNumIndicators]Atom,
+	groups: [XkbNumKbdGroups]Atom,
+	keys: [^]XkbKeyNameRec,
+	key_aliases: [^]XkbKeyAliasRec,
+	radio_groups: [^]Atom,
+	phys_symbol: Atom,
+	num_keys: u8,
+	num_key_aliases: u8,
+	num_rg: u16,
+}
+XkbNamesPtr :: ^XkbNamesRec
+
+XkbDescRec :: struct {
+	display: ^Display,
+	flags: u16,
+	device_spec: u16,
+	min_key_code: KeyCode,
+	max_key_code: KeyCode,
+
+	ctrls: XkbControlsPtr,
+	server: XkbServerMapPtr,
+	_map: XkbClientMapPtr,
+	indicators: XkbIndicatorPtr,
+	names: XkbNamesPtr,
+	compat: XkbCompatMapPtr,
+	geom: XkbGeometryPtr,
+}
+XkbDescPtr :: ^XkbDescRec
+
+
 /* ----  X11/Xcms.h ---------------------------------------------------------*/
 
 XcmsColorFormat :: uint