// NOTE: Based on
package xcb
Keycode :: u8
Timestamp :: u32
Atom :: u32
Drawable :: u32
Window :: u32
Colormap :: u32
Visualid :: u32
Gcontext :: u32
Pixmap :: u32
Connection :: struct {}
Setup :: struct {
status: u8,
pad0: u8,
protocol_major_version: u16,
protocol_minor_version: u16,
length: u16,
release_number: u32,
resource_id_base: u32,
resource_id_mask: u32,
motion_buffer_size: u32,
vendor_len: u16,
maximum_request_length: u16,
roots_len: u8,
pixmap_formats_len: u8,
image_byte_order: u8,
bitmap_format_bit_order: u8,
bitmap_format_scanline_unit: u8,
bitmap_format_scanline_pad: u8,
min_keycode: Keycode,
max_keycode: Keycode,
pad1: [4]u8,
}
Screen :: struct {
root: Window,
default_colormap: Colormap,
white_pixel: u32,
black_pixel: u32,
current_input_masks: u32,
width_in_pixels: u16,
height_in_pixels: u16,
width_in_millimeters: u16,
height_in_millimeters: u16,
min_installed_maps: u16,
max_installed_maps: u16,
root_visual: Visualid,
backing_stores: u8,
save_unders: u8,
root_depth: u8,
allowed_depths_len: u8,
}
ScreenIterator :: struct {
data: ^Screen,
rem: i32,
index: i32,
}
WindowClass :: enum u16 {
Copy_From_Parent = 0,
Input_Output = 1,
Input_Only = 2,
}
Cw :: enum u32 {
Back_Pixmap = 1,
Back_Pixel = 2,
Border_Pixmap = 4,
Border_Pixel = 8,
Bit_Gravity = 16,
Win_Gravity = 32,
Backing_Store = 64,
Backing_Planes = 128,
Backing_Pixel = 256,
Override_Redirect = 512,
Save_Under = 1024,
Event_Mask = 2048,
Dont_Propagate = 4096,
Colormap = 8192,
Cursor = 16384,
}
EventMask :: enum u32 {
No_Event = 0,
Key_Press = 1,
Key_Release = 2,
Button_Press = 4,
Button_Release = 8,
Enter_Window = 16,
Leave_Window = 32,
Pointer_Motion = 64,
Pointer_Motion_Hint = 128,
Button_1_Motion = 256,
Button_2_Motion = 512,
Button_3_Motion = 1024,
Button_4_Motion = 2048,
Button_5_Motion = 4096,
Button_Motion = 8192,
Keymap_State = 16384,
Exposure = 32768,
Visibility_Change = 65536,
Structure_Notify = 131072,
Resize_Redirect = 262144,
Substructure_Notify = 524288,
Substructure_Redirect = 1048576,
Focus_Change = 2097152,
Property_Change = 4194304,
Color_Map_Change = 8388608,
Owner_Grab_Button = 16777216,
}
KEY_PRESS: u8 : 2
KEY_RELEASE: u8 : 3
EXPOSE: u8 : 12
CLIENT_MESSAGE: u8 : 33
KeyPressEvent :: struct {
response_type: u8,
detail: Keycode,
sequence: u16,
time: Timestamp,
root: Window,
event: Window,
child: Window,
root_x: i16,
root_y: i16,
event_x: i16,
event_y: i16,
state: u16,
same_screen: u8,
pad0: u8,
}
KeyReleaseEvent :: distinct KeyPressEvent
ClientMessageData :: struct #raw_union {
data8: [20]u8,
data16: [10]u16,
data32: [5]u32,
}
ClientMessageEvent :: struct {
response_type: u8,
format: u8,
sequence: u16,
window: Window,
type: AtomEnum,
data: ClientMessageData,
}
PropMode :: enum u8 {
Replace = 0,
Prepend = 1,
Append = 2,
}
AtomEnum :: enum u32 {
None = 0,
Any = 0,
Primary = 1,
Secondary = 2,
Arc = 3,
Atom = 4,
Bitmap = 5,
Cardinal = 6,
Colormap = 7,
Cursor = 8,
Cut_Buffer0 = 9,
Cut_Buffer1 = 10,
Cut_Buffer2 = 11,
Cut_Buffer3 = 12,
Cut_Buffer4 = 13,
Cut_Buffer5 = 14,
Cut_Buffer6 = 15,
Cut_Buffer7 = 16,
Drawable = 17,
Font = 18,
Integer = 19,
Pixmap = 20,
Point = 21,
Rectangle = 22,
Resource_Manager = 23,
Rgb_Color_Map = 24,
Rgb_Best_Map = 25,
Rgb_Blue_Map = 26,
Rgb_Default_Map = 27,
Rgb_Gray_Map = 28,
Rgb_Green_Map = 29,
Rgb_Red_Map = 30,
String = 31,
Visualid = 32,
Window = 33,
Wm_Command = 34,
Wm_Hints = 35,
Wm_Client_Machine = 36,
Wm_Icon_Name = 37,
Wm_Icon_Size = 38,
Wm_Name = 39,
Wm_Normal_Hints = 40,
Wm_Size_Hints = 41,
Wm_Zoom_Hints = 42,
Min_Space = 43,
Norm_Space = 44,
Max_Space = 45,
End_Space = 46,
Superscript_X = 47,
Superscript_Y = 48,
Subscript_X = 49,
Subscript_Y = 50,
Underline_Position = 51,
Underline_Thickness = 52,
Strikeout_Ascent = 53,
Strikeout_Descent = 54,
Italic_Angle = 55,
X_Height = 56,
Quad_Width = 57,
Weight = 58,
Point_Size = 59,
Resolution = 60,
Copyright = 61,
Notice = 62,
Font_Name = 63,
Family_Name = 64,
Full_Name = 65,
Cap_Height = 66,
Wm_Class = 67,
Wm_Transient_For = 68,
}
BaseReply :: struct {
response_type: u8,
pad0: u8,
sequence: u16,
length: u32,
}
InternAtomCookie :: struct {
using void: VoidCookie,
}
InternAtomReply :: struct {
using base: BaseReply,
atom: Atom,
}
QueryKeymapCookie :: struct {
using void: VoidCookie,
}
QueryKeymapReply :: struct {
using base: BaseReply,
keys: [32]u8,
}
Extension :: struct {
name: cstring,
global_id: i32,
}
QueryExtensionReply :: struct {
using base: BaseReply,
present: u8,
major_opcode: u8,
first_event: u8,
first_error: u8,
}
ImageFormat :: enum u8 {
xy_bitmap = 0,
xy_pixmap = 1,
z_pixmap = 2,
}
foreign import xproto "system:xcb"
@(default_calling_convention = "c")
@(link_prefix = "xcb_")
foreign xproto {
setup_roots_iterator :: proc(setup: ^Setup) -> ScreenIterator ---
create_window :: proc(connection: ^Connection, depth: u8, window_id: Window, parent: Window, x: i16, y: i16, width: u16, height: u16, border_width: u16, class: WindowClass, visual: Visualid, value_mask: u32, value_list: rawptr) -> VoidCookie ---
destroy_window :: proc(connection: ^Connection, window: Window) -> VoidCookie ---
map_window :: proc(connection: ^Connection, window: Window) -> VoidCookie ---
change_property :: proc(connection: ^Connection, mode: PropMode, window: Window, property: Atom, type: AtomEnum, format: u8, data_len: u32, data: rawptr) -> VoidCookie ---
create_gc :: proc(connection: ^Connection, ctx_id: Gcontext, drawable: Drawable, value_mask: u32, value_list: rawptr) -> VoidCookie ---
intern_atom :: proc(connection: ^Connection, only_if_exists: u8, name_len: u16, name: cstring) -> InternAtomCookie ---
intern_atom_reply :: proc(connection: ^Connection, cookie: InternAtomCookie, err: ^^GenericError) -> ^InternAtomReply ---
free_pixmap :: proc(connection: ^Connection, pixmap: Pixmap) -> VoidCookie ---
query_keymap :: proc(connection: ^Connection) -> QueryKeymapCookie ---
query_keymap_reply :: proc(connection: ^Connection, cookie: QueryKeymapCookie, err: ^^GenericError) -> ^QueryKeymapReply ---
}