From 4a4aca6829a97ebfcdab3bdd84ca0524002a6cd8 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 4 Nov 2023 20:30:14 +1100 Subject: [PATCH 01/52] [math]: Fix the doc comments on F64_* constants --- core/math/math.odin | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/core/math/math.odin b/core/math/math.odin index 4215a8075..4a56040f8 100644 --- a/core/math/math.odin +++ b/core/math/math.odin @@ -2261,17 +2261,17 @@ F32_NORMALIZE :: 0 F32_RADIX :: 2 F32_ROUNDS :: 1 -F64_DIG :: 15 // # of decimal digits of precision -F64_EPSILON :: 2.2204460492503131e-016 // smallest such that 1.0+F64_EPSILON != 1.0 -F64_MANT_DIG :: 53 // # of bits in mantissa -F64_MAX :: 1.7976931348623158e+308 // max value -F64_MAX_10_EXP :: 308 // max decimal exponent -F64_MAX_EXP :: 1024 // max binary exponent -F64_MIN :: 2.2250738585072014e-308 // min positive value -F64_MIN_10_EXP :: -307 // min decimal exponent -F64_MIN_EXP :: -1021 // min binary exponent -F64_RADIX :: 2 // exponent radix -F64_ROUNDS :: 1 // addition rounding: near +F64_DIG :: 15 // Number of representable decimal digits. +F64_EPSILON :: 2.2204460492503131e-016 // Smallest number such that `1.0 + F64_EPSILON != 1.0`. +F64_MANT_DIG :: 53 // Number of bits in the mantissa. +F64_MAX :: 1.7976931348623158e+308 // Maximum representable value. +F64_MAX_10_EXP :: 308 // Maximum base-10 exponent yielding normalized value. +F64_MAX_EXP :: 1024 // One greater than the maximum possible base-2 exponent yielding normalized value. +F64_MIN :: 2.2250738585072014e-308 // Minimum positive normalized value. +F64_MIN_10_EXP :: -307 // Minimum base-10 exponent yielding normalized value. +F64_MIN_EXP :: -1021 // One greater than the minimum possible base-2 exponent yielding normalized value. +F64_RADIX :: 2 // Exponent radix. +F64_ROUNDS :: 1 // Addition rounding: near. F16_MASK :: 0x1f From d400a5a108b348952a4d74b2e8f0a4c19c504025 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 5 Nov 2023 14:58:27 +1100 Subject: [PATCH 02/52] [vendor/raylib]: Add pre-compiled libraries on linux; Minor changes in bindings --- vendor/raylib/linux/libraygui.a | Bin 0 -> 122858 bytes vendor/raylib/linux/libraygui.so.3.6 | Bin 0 -> 90584 bytes vendor/raylib/raygui.odin | 29 ++++++++------------------- 3 files changed, 8 insertions(+), 21 deletions(-) create mode 100644 vendor/raylib/linux/libraygui.a create mode 100755 vendor/raylib/linux/libraygui.so.3.6 diff --git a/vendor/raylib/linux/libraygui.a b/vendor/raylib/linux/libraygui.a new file mode 100644 index 0000000000000000000000000000000000000000..1e0ea9e2f93f156524928299f65a0edabf0673aa GIT binary patch literal 122858 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 z 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 l8+OA23Mv5+g>o1e7(m0w*z{{hK~%m)C c.int --- // Label control, shows text - GuiButton :: proc(bounds: Rectangle, text: cstring) -> c.int --- // Button control, returns true when clicked - GuiLabelButton :: proc(bounds: Rectangle, text: cstring) -> c.int --- // Label button control, show true when clicked + GuiButton :: proc(bounds: Rectangle, text: cstring) -> bool --- // Button control, returns true when clicked + GuiLabelButton :: proc(bounds: Rectangle, text: cstring) -> bool --- // Label button control, show true when clicked GuiToggle :: proc(bounds: Rectangle, text: cstring, active: ^bool) -> c.int --- // Toggle Button control, returns true when active GuiToggleGroup :: proc(bounds: Rectangle, text: cstring, active: ^c.int) -> c.int --- // Toggle Group control, returns active toggle index - GuiCheckBox :: proc(bounds: Rectangle, text: cstring, checked: ^bool) -> c.int --- // Check Box control, returns true when active + GuiCheckBox :: proc(bounds: Rectangle, text: cstring, checked: ^bool) -> bool --- // Check Box control, returns true when active GuiComboBox :: proc(bounds: Rectangle, text: cstring, active: ^c.int) -> c.int --- // Combo Box control, returns selected item index - GuiDropdownBox :: proc(bounds: Rectangle, text: cstring, active: ^c.int, editMode: bool) -> c.int --- // Dropdown Box control, returns selected item + GuiDropdownBox :: proc(bounds: Rectangle, text: cstring, active: ^c.int, editMode: bool) -> bool --- // Dropdown Box control, returns selected item GuiSpinner :: proc(bounds: Rectangle, text: cstring, value: ^c.int, minValue, maxValue: c.int, editMode: bool) -> c.int --- // Spinner control, returns selected value GuiValueBox :: proc(bounds: Rectangle, text: cstring, value: ^c.int, minValue, maxValue: c.int, editMode: bool) -> c.int --- // Value Box control, updates input text with numbers - GuiTextBox :: proc(bounds: Rectangle, text: cstring, textSize: c.int, editMode: bool) -> c.int --- // Text Box control, updates input text + GuiTextBox :: proc(bounds: Rectangle, text: cstring, textSize: c.int, editMode: bool) -> bool --- // Text Box control, updates input text GuiSlider :: proc(bounds: Rectangle, textLeft: cstring, textRight: cstring, value: ^f32, minValue: f32, maxValue: f32) -> c.int --- // Slider control, returns selected value GuiSliderBar :: proc(bounds: Rectangle, textLeft: cstring, textRight: cstring, value: ^f32, minValue: f32, maxValue: f32) -> c.int --- // Slider Bar control, returns selected value From 6de2b7700fc646f67668febd814a8712a50b609e Mon Sep 17 00:00:00 2001 From: flga Date: Fri, 10 Nov 2023 12:58:53 +0000 Subject: [PATCH 03/52] core:sys/linux: make Perf_Read_Format a bitset --- core/sys/linux/bits.odin | 2 +- core/sys/linux/types.odin | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/sys/linux/bits.odin b/core/sys/linux/bits.odin index 0cf90ed3b..1ca60d494 100644 --- a/core/sys/linux/bits.odin +++ b/core/sys/linux/bits.odin @@ -718,7 +718,7 @@ Perf_Event_Sample_Type_Bits :: enum { } /// Describes field sets to include in mmaped page -Perf_Read_Format :: enum { +Perf_Read_Format_Bits :: enum { TOTAL_TIME_ENABLED = 0, TOTAL_TIME_RUNNING = 1, ID = 2, diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index 8789ca2d1..308b77aee 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -282,6 +282,7 @@ Get_Random_Flags :: bit_set[Get_Random_Flags_Bits; i32] Perf_Flags :: bit_set[Perf_Flags_Bits; uint] Perf_Event_Flags :: distinct bit_set[Perf_Event_Flags_Bits; u64] +Perf_Read_Format_Flags :: distinct bit_set[Perf_Read_Format_Bits; u64] Perf_Cap_Flags :: distinct bit_set[Perf_Cap_Flags_Bits; u64] @@ -305,7 +306,7 @@ Perf_Event_Attr :: struct #packed { frequency: u64, }, sample_type: Perf_Event_Sample_Type, - read_format: Perf_Read_Format, + read_format: Perf_Read_Format_Flags, flags: Perf_Event_Flags, wakeup: struct #raw_union { events: u32, From 5a8da5dcdb36e3ef37853ba571b84603c7bd9f96 Mon Sep 17 00:00:00 2001 From: flga Date: Fri, 10 Nov 2023 19:41:01 +0000 Subject: [PATCH 04/52] core:sys/linux: rename Perf_Read_Format_Flags --- core/sys/linux/types.odin | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index 308b77aee..afa7faf33 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -282,7 +282,8 @@ Get_Random_Flags :: bit_set[Get_Random_Flags_Bits; i32] Perf_Flags :: bit_set[Perf_Flags_Bits; uint] Perf_Event_Flags :: distinct bit_set[Perf_Event_Flags_Bits; u64] -Perf_Read_Format_Flags :: distinct bit_set[Perf_Read_Format_Bits; u64] + +Perf_Read_Format :: distinct bit_set[Perf_Read_Format_Bits; u64] Perf_Cap_Flags :: distinct bit_set[Perf_Cap_Flags_Bits; u64] @@ -306,7 +307,7 @@ Perf_Event_Attr :: struct #packed { frequency: u64, }, sample_type: Perf_Event_Sample_Type, - read_format: Perf_Read_Format_Flags, + read_format: Perf_Read_Format, flags: Perf_Event_Flags, wakeup: struct #raw_union { events: u32, From 086478e8f20ac9633daaf2e3485ef7778ee82441 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sat, 11 Nov 2023 02:34:59 +0100 Subject: [PATCH 05/52] fix -test-name flag --- src/checker.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index 29f22bd9c..9653116cf 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -6091,9 +6091,6 @@ gb_internal void check_parsed_files(Checker *c) { TIME_SECTION("calculate global init order"); calculate_global_init_order(c); - TIME_SECTION("check test procedures"); - check_test_procedures(c); - TIME_SECTION("add type info for type definitions"); add_type_info_for_type_definitions(c); check_merge_queues_into_arrays(c); @@ -6104,6 +6101,11 @@ gb_internal void check_parsed_files(Checker *c) { TIME_SECTION("generate minimum dependency set"); generate_minimum_dependency_set(c, c->info.entry_point); + // NOTE(laytan): has to be ran after generate_minimum_dependency_set, + // because that collects the test procedures. + TIME_SECTION("check test procedures"); + check_test_procedures(c); + TIME_SECTION("check bodies have all been checked"); check_unchecked_bodies(c); From e67473d89a5cd9284d26e7b8a4bfc826c7082668 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sat, 11 Nov 2023 20:20:40 +1100 Subject: [PATCH 06/52] [vendor/x11]: Add most of the basic xlib bindings --- examples/all/all_vendor.odin | 6 +- vendor/x11/.gitignore | 4 + vendor/x11/xlib/xlib_const.odin | 526 ++++++++++ vendor/x11/xlib/xlib_keysym.odin | 1681 ++++++++++++++++++++++++++++++ vendor/x11/xlib/xlib_procs.odin | 1549 +++++++++++++++++++++++++++ vendor/x11/xlib/xlib_types.odin | 1307 +++++++++++++++++++++++ 6 files changed, 5072 insertions(+), 1 deletion(-) create mode 100644 vendor/x11/.gitignore create mode 100644 vendor/x11/xlib/xlib_const.odin create mode 100644 vendor/x11/xlib/xlib_keysym.odin create mode 100644 vendor/x11/xlib/xlib_procs.odin create mode 100644 vendor/x11/xlib/xlib_types.odin diff --git a/examples/all/all_vendor.odin b/examples/all/all_vendor.odin index 6864a7be2..76dd9903a 100644 --- a/examples/all/all_vendor.odin +++ b/examples/all/all_vendor.odin @@ -46,6 +46,8 @@ import nvg "vendor:nanovg" import nvg_gl "vendor:nanovg/gl" import fontstash "vendor:fontstash" +import x11 "vendor:x11" + _ :: botan_bindings _ :: botan_blake2b _ :: gost @@ -90,4 +92,6 @@ _ :: lua_5_4 _ :: nvg _ :: nvg_gl -_ :: fontstash \ No newline at end of file +_ :: fontstash + +_ :: x11 \ No newline at end of file diff --git a/vendor/x11/.gitignore b/vendor/x11/.gitignore new file mode 100644 index 000000000..3657af3a4 --- /dev/null +++ b/vendor/x11/.gitignore @@ -0,0 +1,4 @@ + +# TODO(flysand): Remove this file. + +*.i diff --git a/vendor/x11/xlib/xlib_const.odin b/vendor/x11/xlib/xlib_const.odin new file mode 100644 index 000000000..b925ec27e --- /dev/null +++ b/vendor/x11/xlib/xlib_const.odin @@ -0,0 +1,526 @@ + +package xlib + +// Special values for many types. Most of these constants +// aren't attached to a specific type. + +None :: 0 +ParentRelative :: 1 +CopyFromParent :: 0 +PointerWindow :: 0 +InputFocus :: 1 +PointerRoot :: 1 +AnyPropertyType :: 0 +AnyKey :: 0 +AnyButton :: 0 +AllTemporary :: 0 +CurrentTime :: 0 +NoSymbol :: 0 + +// NOTE(flysand): Some implementations return Status as enum, other return it +// as an integer. I will make it a status. +Status :: enum i32 { + Success = 0, + BadRequest = 1, + BadValue = 2, + BadWindow = 3, + BadPixmap = 4, + BadAtom = 5, + BadCursor = 6, + BadFont = 7, + BadMatch = 8, + BadDrawable = 9, + BadAccess = 10, + BadAlloc = 11, + BadColor = 12, + BadGC = 13, + BadIDChoice = 14, + BadName = 15, + BadLength = 16, + BadImplementation = 17, + FirstExtensionError = 128, + LastExtensionError = 255, +} + +ByteOrder :: enum i32 { + LSBFirst = 0, + MSBFirst = 1, +} + +Gravity :: enum i32 { + ForgetGravity = 0, + UnmapGravity = 0, + NorthWestGravity = 1, + NorthGravity = 2, + NorthEastGravity = 3, + WestGravity = 4, + CenterGravity = 5, + EastGravity = 6, + SouthWestGravity = 7, + SouthGravity = 8, + SouthEastGravity = 9, + StaticGravity = 10, +} + +BackingStore :: enum i32 { + NotUseful = 0, + WhenMapped = 1, + Always = 2, +} + +EventMask :: bit_set[EventType; int] +EventType :: enum i32 { + KeyPress = 0, + KeyRelease = 1, + ButtonPress = 2, + ButtonRelease = 3, + EnterWindow = 4, + LeaveWindow = 5, + PointerMotion = 6, + PointerMotionHint = 7, + Button1Motion = 8, + Button2Motion = 9, + Button3Motion = 10, + Button4Motion = 11, + Button5Motion = 12, + ButtonMotion = 13, + KeymapState = 14, + Exposure = 15, + VisibilityChange = 16, + StructureNotify = 17, + ResizeRedirect = 18, + SubstructureNotify = 19, + SubstructureRedirect = 20, + FocusChange = 21, + PropertyChange = 22, + ColormapChange = 23, + OwnerGrabButton = 24, +} + +InputMask :: bit_set[InputMaskBits; i32] +InputMaskBits :: enum { + ShiftMask = 0, + LockMask = 1, + ControlMask = 2, + Mod1Mask = 3, + Mod2Mask = 4, + Mod3Mask = 5, + Mod4Mask = 6, + Mod5Mask = 7, + Button1Mask = 8, + Button2Mask = 9, + Button3Mask = 10, + Button4Mask = 11, + Button5Mask = 12, + AnyModifier = 15, +} + +NotifyMode :: enum i32 { + NotifyNormal = 0, + NotifyGrab = 1, + NotifyUngrab = 2, + NotifyWhileGrabbed = 3, +} + +NotifyDetail :: enum i32 { + NotifyAncestor = 0, + NotifyVirtual = 1, + NotifyInferior = 2, + NotifyNonlinear = 3, + NotifyNonlinearVirtual = 4, + NotifyPointer = 5, + NotifyPointerRoot = 6, + NotifyDetailNone = 7, +} + +MappingRequest :: enum i32 { + MappingModifier = 0, + MappingKeyboard = 1, + MappingPointer = 2, +} + +VisibilityState :: enum i32 { + VisibilityUnobscured = 0, + VisibilityPartiallyObscured = 1, + VisibilityFullyObscured = 2, +} + +ColormapState :: enum i32 { + ColormapUninstalled = 0, + ColormapInstalled = 1, +} + +PropertyState :: enum i32 { + PropertyNewValue = 0, + PropertyDelete = 1, +} + +CloseMode :: enum i32 { + DestroyAll = 0, + RetainPermanent = 1, + RetainTemporary = 2, +} + +EventQueueMode :: enum i32 { + QueuedAlready = 0, + QueuedAfterReading = 1, + QueuedAfterFlush = 2, +} + +WindowAttributeMask :: bit_set[WindowAttributeMaskBits; int] +WindowAttributeMaskBits :: enum { + CWBackPixmap = 0, + CWBackPixel = 1, + CWBorderPixmap = 2, + CWBorderPixel = 3, + CWBitGravity = 4, + CWWinGravity = 5, + CWBackingStore = 6, + CWBackingPlanes = 7, + CWBackingPixel = 8, + CWOverrideRedirect = 9, + CWSaveUnder = 10, + CWEventMask = 11, + CWDontPropagate = 12, + CWColormap = 13, + CWCursor = 14, +} + +WindowClass :: enum i32 { + CopyFromParent = 0, + InputOutput = 1, + InputOnly = 2, +} + +WindowChangesMask :: bit_set[WindowChangesMaskBits; i32] +WindowChangesMaskBits :: enum { + CWX = 0, + CWY = 1, + CWWidth = 2, + CWHeight = 3, + CWBorderWidth = 4, + CWSibling = 5, + CWStackMode = 6, +} + +WindowStacking :: enum i32 { + Above = 0, + Below = 1, + TopIf = 2, + BottomIf = 3, + Opposite = 4, +} + +CirculationDirection :: enum i32 { + RaiseLowest = 0, + LowerHighest = 1, +} + +CirculationRequest :: enum i32 { + PlaceOnTop = 0, + PlaceOnBottom = 1, +} + +WindowMapState :: enum i32 { + IsUnmapped = 0, + IsUnviewable = 1, + IsViewable = 2, +} + +KeyMask :: enum u32 { + ShiftMask = 0, + LockMask = 1, + ControlMask = 2, + Mod1Mask = 3, + Mod2Mask = 4, + Mod3Mask = 5, + Mod4Mask = 6, + Mod5Mask = 7, +} + +CursorShape :: enum u32 { + XC_X_cursor = 0, + XC_arrow = 2, + XC_based_arrow_down = 4, + XC_based_arrow_up = 6, + XC_boat = 8, + XC_bogosity = 10, + XC_bottom_left_corner = 12, + XC_bottom_right_corner = 14, + XC_bottom_side = 16, + XC_bottom_tee = 18, + XC_box_spiral = 20, + XC_center_ptr = 22, + XC_circle = 24, + XC_clock = 26, + XC_coffee_mug = 28, + XC_cross = 30, + XC_cross_reverse = 32, + XC_crosshair = 34, + XC_diamond_cross = 36, + XC_dot = 38, + XC_dotbox = 40, + XC_double_arrow = 42, + XC_draft_large = 44, + XC_draft_small = 46, + XC_draped_box = 48, + XC_exchange = 50, + XC_fleur = 52, + XC_gobbler = 54, + XC_gumby = 56, + XC_hand1 = 58, + XC_hand2 = 60, + XC_heart = 62, + XC_icon = 64, + XC_iron_cross = 66, + XC_left_ptr = 68, + XC_left_side = 70, + XC_left_tee = 72, + XC_leftbutton = 74, + XC_ll_angle = 76, + XC_lr_angle = 78, + XC_man = 80, + XC_middlebutton = 82, + XC_mouse = 84, + XC_pencil = 86, + XC_pirate = 88, + XC_plus = 90, + XC_question_arrow = 92, + XC_right_ptr = 94, + XC_right_side = 96, + XC_right_tee = 98, + XC_rightbutton = 100, + XC_rtl_logo = 102, + XC_sailboat = 104, + XC_sb_down_arrow = 106, + XC_sb_h_double_arrow = 108, + XC_sb_left_arrow = 110, + XC_sb_right_arrow = 112, + XC_sb_up_arrow = 114, + XC_sb_v_double_arrow = 116, + XC_shuttle = 118, + XC_sizing = 120, + XC_spider = 122, + XC_spraycan = 124, + XC_star = 126, + XC_target = 128, + XC_tcross = 130, + XC_top_left_arrow = 132, + XC_top_left_corner = 134, + XC_top_right_corner = 136, + XC_top_side = 138, + XC_top_tee = 140, + XC_trek = 142, + XC_ul_angle = 144, + XC_umbrella = 146, + XC_ur_angle = 148, + XC_watch = 150, + XC_xterm = 152, + XC_num_glyphs = 154, +} + +ColorFormat :: enum u32 { + XcmsUndefinedFormat = 0x00000000, + XcmsCIEXYZFormat = 0x00000001, + XcmsCIEuvYFormat = 0x00000002, + XcmsCIExyYFormat = 0x00000003, + XcmsCIELabFormat = 0x00000004, + XcmsCIELuvFormat = 0x00000005, + XcmsTekHVCFormat = 0x00000006, + XcmsRGBFormat = 0x80000000, + XcmsRGBiFormat = 0x80000001, +} + +ColormapAlloc :: enum i32 { + AllocNone = 0, + AllocAll = 1, +} + +ColorFlags :: bit_set[ColorFlagsBits; i32] +ColorFlagsBits :: enum { + DoRed = 0, + DoGreen = 1, + DoBlue = 2, +} + +GCAttributeMask :: bit_set[GCAttributeMaskBits; uint] +GCAttributeMaskBits :: enum { + GCFunction = 0, + GCPlaneMask = 1, + GCForeground = 2, + GCBackground = 3, + GCLineWidth = 4, + GCLineStyle = 5, + GCCapStyle = 6, + GCJoinStyle = 7, + GCFillStyle = 8, + GCFillRule = 9, + GCTile = 10, + GCStipple = 11, + GCTileStipXOrigin = 12, + GCTileStipYOrigin = 13, + GCFont = 14, + GCSubwindowMode = 15, + GCGraphicsExposures= 16, + GCClipXOrigin = 17, + GCClipYOrigin = 18, + GCClipMask = 19, + GCDashOffset = 20, + GCDashList = 21, + GCArcMode = 22, +} + +GCFunction :: enum i32 { + GXclear = 0x0, // 0 + GXand = 0x1, // src & dst + GXandReverse = 0x2, // src & ~dst + GXcopy = 0x3, // src + GXandInverted = 0x4, // ~src & dst + GXnoop = 0x5, // dst + GXxor = 0x6, // src ~ dst + GXor = 0x7, // src | dst + GXnor = 0x8, // ~src & ~dst + GXequiv = 0x9, // ~src ~ dst + GXinvert = 0xa, // ~dst + GXorReverse = 0xb, // src | ~dst + GXcopyInverted = 0xc, // ~src + GXorInverted = 0xd, // ~src | dst + GXnand = 0xe, // ~src | ~dst + GXset = 0xf, // 1 +} + +LineStyle :: enum i32 { + LineSolid = 0, + LineOnOffDash = 1, + LineDoubleDash = 2, +} + +CapStyle :: enum i32 { + CapNotLast = 0, + CapButt = 1, + CapRound = 2, + CapProjecting = 3, +} + +JoinStyle :: enum i32 { + JoinMiter = 0, + JoinRound = 1, + JoinBevel = 2, +} + +FillStyle :: enum i32 { + FillSolid = 0, + FillTiled = 1, + FillStippled = 2, + FillOpaqueStippled = 3, +} + +FillRule :: enum i32 { + EvenOddRule = 0, + WindingRule = 1, +} + +ArcMode :: enum i32 { + ArcChord = 0, + ArcPieSlice = 1, +} + +SubwindowMode :: enum i32 { + ClipByChildren = 0, + IncludeInferiors = 1, +} + +CoordMode :: enum i32 { + CoordModeOrigin = 0, + CoordModePrevious = 1, +} + +Shape :: enum i32 { + Complex = 0, + Nonconvex = 1, + Convex = 2, +} + +FontDirection :: enum i32 { + FontLeftToRight = 0, + FontRightToLeft = 1, +} + +ImageFormat :: enum i32 { + XYBitmap = 0, + XYPixmap = 1, + ZPixmap = 2, +} + +SaveSetChangeMode :: enum i32 { + SetModeInsert = 0, + SetModeDelete = 1, +} + + +ScreenSaverBlanking :: enum i32 { + DontPreferBlanking = 0, + PreferBlanking = 1, + DefaultBlanking = 2, +} + +ScreenSavingExposures :: enum i32 { + DontAllowExposures = 0, + AllowExposures = 1, + DefaultExposures = 2, +} + +ScreenSaverForceMode :: enum i32 { + ScreenSaverReset = 0, + ScreenSaverActive = 1, +} + +AccessControlMode :: enum i32 { + DisableAccess = 0, + EnableAccess = 1, +} + +GrabMode :: enum i32 { + GrabModeSync = 0, + GrabModeAsync = 1, +} + +AllowEventsMode :: enum i32 { + AsyncPointer = 0, + SyncPointer = 1, + ReplayPointer = 2, + AsyncKeyboard = 3, + SyncKeyboard = 4, + ReplayKeyboard = 5, + AsyncBoth = 6, + SyncBoth = 7, +} + +FocusRevert :: enum i32 { + RevertToNone = 0, + RevertToPointerRoot = 1, + RevertToParent = 2, +} + +KeyboardControlMask :: bit_set[KeyboardControlMaskBits; int] +KeyboardControlMaskBits :: enum { + KBKeyClickPercent = 0, + KBBellPercent = 1, + KBBellPitch = 2, + KBBellDuration = 3, + KBLed = 4, + KBLedMode = 5, + KBKey = 6, + KBAutoRepeatMode = 7, +} + +KeyboardAutoRepeatMode :: enum i32 { + AutoRepeatModeOff = 0, + AutoRepeatModeOn = 1, + AutoRepeatModeDefault = 2, +} + +KeyboardLedMode :: enum i32 { + LedModeOff = 0, + LedModeOn = 1, +} diff --git a/vendor/x11/xlib/xlib_keysym.odin b/vendor/x11/xlib/xlib_keysym.odin new file mode 100644 index 000000000..c712bf784 --- /dev/null +++ b/vendor/x11/xlib/xlib_keysym.odin @@ -0,0 +1,1681 @@ + +package xlib + +KeySym :: enum u32 { + XK_BackSpace = 0xff08, /* Back space, back char */ + XK_Tab = 0xff09, + XK_Linefeed = 0xff0a, /* Linefeed, LF */ + XK_Clear = 0xff0b, + XK_Return = 0xff0d, /* Return, enter */ + XK_Pause = 0xff13, /* Pause, hold */ + XK_Scroll_Lock = 0xff14, + XK_Sys_Req = 0xff15, + XK_Escape = 0xff1b, + XK_Delete = 0xffff, /* Delete, rubout */ + XK_Multi_key = 0xff20, /* Multi-key character compose */ + XK_Codeinput = 0xff37, + XK_SingleCandidate = 0xff3c, + XK_MultipleCandidate = 0xff3d, + XK_PreviousCandidate = 0xff3e, + XK_Kanji = 0xff21, /* Kanji, Kanji convert */ + XK_Muhenkan = 0xff22, /* Cancel Conversion */ + XK_Henkan_Mode = 0xff23, /* Start/Stop Conversion */ + XK_Henkan = 0xff23, /* Alias for Henkan_Mode */ + XK_Romaji = 0xff24, /* to Romaji */ + XK_Hiragana = 0xff25, /* to Hiragana */ + XK_Katakana = 0xff26, /* to Katakana */ + XK_Hiragana_Katakana = 0xff27, /* Hiragana/Katakana toggle */ + XK_Zenkaku = 0xff28, /* to Zenkaku */ + XK_Hankaku = 0xff29, /* to Hankaku */ + XK_Zenkaku_Hankaku = 0xff2a, /* Zenkaku/Hankaku toggle */ + XK_Touroku = 0xff2b, /* Add to Dictionary */ + XK_Massyo = 0xff2c, /* Delete from Dictionary */ + XK_Kana_Lock = 0xff2d, /* Kana Lock */ + XK_Kana_Shift = 0xff2e, /* Kana Shift */ + XK_Eisu_Shift = 0xff2f, /* Alphanumeric Shift */ + XK_Eisu_toggle = 0xff30, /* Alphanumeric toggle */ + XK_Kanji_Bangou = 0xff37, /* Codeinput */ + XK_Zen_Koho = 0xff3d, /* Multiple/All Candidate(s) */ + XK_Mae_Koho = 0xff3e, /* Previous Candidate */ + XK_Home = 0xff50, + XK_Left = 0xff51, /* Move left, left arrow */ + XK_Up = 0xff52, /* Move up, up arrow */ + XK_Right = 0xff53, /* Move right, right arrow */ + XK_Down = 0xff54, /* Move down, down arrow */ + XK_Prior = 0xff55, /* Prior, previous */ + XK_Page_Up = 0xff55, + XK_Next = 0xff56, /* Next */ + XK_Page_Down = 0xff56, + XK_End = 0xff57, /* EOL */ + XK_Begin = 0xff58, /* BOL */ + XK_Select = 0xff60, /* Select, mark */ + XK_Print = 0xff61, + XK_Execute = 0xff62, /* Execute, run, do */ + XK_Insert = 0xff63, /* Insert, insert here */ + XK_Undo = 0xff65, + XK_Redo = 0xff66, /* Redo, again */ + XK_Menu = 0xff67, + XK_Find = 0xff68, /* Find, search */ + XK_Cancel = 0xff69, /* Cancel, stop, abort, exit */ + XK_Help = 0xff6a, /* Help */ + XK_Break = 0xff6b, + XK_Mode_switch = 0xff7e, /* Character set switch */ + XK_script_switch = 0xff7e, /* Alias for mode_switch */ + XK_Num_Lock = 0xff7f, + XK_KP_Space = 0xff80, /* Space */ + XK_KP_Tab = 0xff89, + XK_KP_Enter = 0xff8d, /* Enter */ + XK_KP_F1 = 0xff91, /* PF1, KP_A, ... */ + XK_KP_F2 = 0xff92, + XK_KP_F3 = 0xff93, + XK_KP_F4 = 0xff94, + XK_KP_Home = 0xff95, + XK_KP_Left = 0xff96, + XK_KP_Up = 0xff97, + XK_KP_Right = 0xff98, + XK_KP_Down = 0xff99, + XK_KP_Prior = 0xff9a, + XK_KP_Page_Up = 0xff9a, + XK_KP_Next = 0xff9b, + XK_KP_Page_Down = 0xff9b, + XK_KP_End = 0xff9c, + XK_KP_Begin = 0xff9d, + XK_KP_Insert = 0xff9e, + XK_KP_Delete = 0xff9f, + XK_KP_Equal = 0xffbd, /* Equals */ + XK_KP_Multiply = 0xffaa, + XK_KP_Add = 0xffab, + XK_KP_Separator = 0xffac, /* Separator, often comma */ + XK_KP_Subtract = 0xffad, + XK_KP_Decimal = 0xffae, + XK_KP_Divide = 0xffaf, + XK_KP_0 = 0xffb0, + XK_KP_1 = 0xffb1, + XK_KP_2 = 0xffb2, + XK_KP_3 = 0xffb3, + XK_KP_4 = 0xffb4, + XK_KP_5 = 0xffb5, + XK_KP_6 = 0xffb6, + XK_KP_7 = 0xffb7, + XK_KP_8 = 0xffb8, + XK_KP_9 = 0xffb9, + XK_F1 = 0xffbe, + XK_F2 = 0xffbf, + XK_F3 = 0xffc0, + XK_F4 = 0xffc1, + XK_F5 = 0xffc2, + XK_F6 = 0xffc3, + XK_F7 = 0xffc4, + XK_F8 = 0xffc5, + XK_F9 = 0xffc6, + XK_F10 = 0xffc7, + XK_F11 = 0xffc8, + XK_L1 = 0xffc8, + XK_F12 = 0xffc9, + XK_L2 = 0xffc9, + XK_F13 = 0xffca, + XK_L3 = 0xffca, + XK_F14 = 0xffcb, + XK_L4 = 0xffcb, + XK_F15 = 0xffcc, + XK_L5 = 0xffcc, + XK_F16 = 0xffcd, + XK_L6 = 0xffcd, + XK_F17 = 0xffce, + XK_L7 = 0xffce, + XK_F18 = 0xffcf, + XK_L8 = 0xffcf, + XK_F19 = 0xffd0, + XK_L9 = 0xffd0, + XK_F20 = 0xffd1, + XK_L10 = 0xffd1, + XK_F21 = 0xffd2, + XK_R1 = 0xffd2, + XK_F22 = 0xffd3, + XK_R2 = 0xffd3, + XK_F23 = 0xffd4, + XK_R3 = 0xffd4, + XK_F24 = 0xffd5, + XK_R4 = 0xffd5, + XK_F25 = 0xffd6, + XK_R5 = 0xffd6, + XK_F26 = 0xffd7, + XK_R6 = 0xffd7, + XK_F27 = 0xffd8, + XK_R7 = 0xffd8, + XK_F28 = 0xffd9, + XK_R8 = 0xffd9, + XK_F29 = 0xffda, + XK_R9 = 0xffda, + XK_F30 = 0xffdb, + XK_R10 = 0xffdb, + XK_F31 = 0xffdc, + XK_R11 = 0xffdc, + XK_F32 = 0xffdd, + XK_R12 = 0xffdd, + XK_F33 = 0xffde, + XK_R13 = 0xffde, + XK_F34 = 0xffdf, + XK_R14 = 0xffdf, + XK_F35 = 0xffe0, + XK_R15 = 0xffe0, + XK_Shift_L = 0xffe1, /* Left shift */ + XK_Shift_R = 0xffe2, /* Right shift */ + XK_Control_L = 0xffe3, /* Left control */ + XK_Control_R = 0xffe4, /* Right control */ + XK_Caps_Lock = 0xffe5, /* Caps lock */ + XK_Shift_Lock = 0xffe6, /* Shift lock */ + XK_Meta_L = 0xffe7, /* Left meta */ + XK_Meta_R = 0xffe8, /* Right meta */ + XK_Alt_L = 0xffe9, /* Left alt */ + XK_Alt_R = 0xffea, /* Right alt */ + XK_Super_L = 0xffeb, /* Left super */ + XK_Super_R = 0xffec, /* Right super */ + XK_Hyper_L = 0xffed, /* Left hyper */ + XK_Hyper_R = 0xffee, /* Right hyper */ + XK_ISO_Lock = 0xfe01, + XK_ISO_Level2_Latch = 0xfe02, + XK_ISO_Level3_Shift = 0xfe03, + XK_ISO_Level3_Latch = 0xfe04, + XK_ISO_Level3_Lock = 0xfe05, + XK_ISO_Group_Shift = 0xff7e, /* Alias for mode_switch */ + XK_ISO_Group_Latch = 0xfe06, + XK_ISO_Group_Lock = 0xfe07, + XK_ISO_Next_Group = 0xfe08, + XK_ISO_Next_Group_Lock = 0xfe09, + XK_ISO_Prev_Group = 0xfe0a, + XK_ISO_Prev_Group_Lock = 0xfe0b, + XK_ISO_First_Group = 0xfe0c, + XK_ISO_First_Group_Lock = 0xfe0d, + XK_ISO_Last_Group = 0xfe0e, + XK_ISO_Last_Group_Lock = 0xfe0f, + XK_ISO_Left_Tab = 0xfe20, + XK_ISO_Move_Line_Up = 0xfe21, + XK_ISO_Move_Line_Down = 0xfe22, + XK_ISO_Partial_Line_Up = 0xfe23, + XK_ISO_Partial_Line_Down = 0xfe24, + XK_ISO_Partial_Space_Left = 0xfe25, + XK_ISO_Partial_Space_Right = 0xfe26, + XK_ISO_Set_Margin_Left = 0xfe27, + XK_ISO_Set_Margin_Right = 0xfe28, + XK_ISO_Release_Margin_Left = 0xfe29, + XK_ISO_Release_Margin_Right = 0xfe2a, + XK_ISO_Release_Both_Margins = 0xfe2b, + XK_ISO_Fast_Cursor_Left = 0xfe2c, + XK_ISO_Fast_Cursor_Right = 0xfe2d, + XK_ISO_Fast_Cursor_Up = 0xfe2e, + XK_ISO_Fast_Cursor_Down = 0xfe2f, + XK_ISO_Continuous_Underline = 0xfe30, + XK_ISO_Discontinuous_Underline = 0xfe31, + XK_ISO_Emphasize = 0xfe32, + XK_ISO_Center_Object = 0xfe33, + XK_ISO_Enter = 0xfe34, + XK_dead_grave = 0xfe50, + XK_dead_acute = 0xfe51, + XK_dead_circumflex = 0xfe52, + XK_dead_tilde = 0xfe53, + XK_dead_macron = 0xfe54, + XK_dead_breve = 0xfe55, + XK_dead_abovedot = 0xfe56, + XK_dead_diaeresis = 0xfe57, + XK_dead_abovering = 0xfe58, + XK_dead_doubleacute = 0xfe59, + XK_dead_caron = 0xfe5a, + XK_dead_cedilla = 0xfe5b, + XK_dead_ogonek = 0xfe5c, + XK_dead_iota = 0xfe5d, + XK_dead_voiced_sound = 0xfe5e, + XK_dead_semivoiced_sound = 0xfe5f, + XK_dead_belowdot = 0xfe60, + XK_dead_hook = 0xfe61, + XK_dead_horn = 0xfe62, + XK_First_Virtual_Screen = 0xfed0, + XK_Prev_Virtual_Screen = 0xfed1, + XK_Next_Virtual_Screen = 0xfed2, + XK_Last_Virtual_Screen = 0xfed4, + XK_Terminate_Server = 0xfed5, + XK_AccessX_Enable = 0xfe70, + XK_AccessX_Feedback_Enable = 0xfe71, + XK_RepeatKeys_Enable = 0xfe72, + XK_SlowKeys_Enable = 0xfe73, + XK_BounceKeys_Enable = 0xfe74, + XK_StickyKeys_Enable = 0xfe75, + XK_MouseKeys_Enable = 0xfe76, + XK_MouseKeys_Accel_Enable = 0xfe77, + XK_Overlay1_Enable = 0xfe78, + XK_Overlay2_Enable = 0xfe79, + XK_AudibleBell_Enable = 0xfe7a, + XK_Pointer_Left = 0xfee0, + XK_Pointer_Right = 0xfee1, + XK_Pointer_Up = 0xfee2, + XK_Pointer_Down = 0xfee3, + XK_Pointer_UpLeft = 0xfee4, + XK_Pointer_UpRight = 0xfee5, + XK_Pointer_DownLeft = 0xfee6, + XK_Pointer_DownRight = 0xfee7, + XK_Pointer_Button_Dflt = 0xfee8, + XK_Pointer_Button1 = 0xfee9, + XK_Pointer_Button2 = 0xfeea, + XK_Pointer_Button3 = 0xfeeb, + XK_Pointer_Button4 = 0xfeec, + XK_Pointer_Button5 = 0xfeed, + XK_Pointer_DblClick_Dflt = 0xfeee, + XK_Pointer_DblClick1 = 0xfeef, + XK_Pointer_DblClick2 = 0xfef0, + XK_Pointer_DblClick3 = 0xfef1, + XK_Pointer_DblClick4 = 0xfef2, + XK_Pointer_DblClick5 = 0xfef3, + XK_Pointer_Drag_Dflt = 0xfef4, + XK_Pointer_Drag1 = 0xfef5, + XK_Pointer_Drag2 = 0xfef6, + XK_Pointer_Drag3 = 0xfef7, + XK_Pointer_Drag4 = 0xfef8, + XK_Pointer_Drag5 = 0xfefd, + XK_Pointer_EnableKeys = 0xfef9, + XK_Pointer_Accelerate = 0xfefa, + XK_Pointer_DfltBtnNext = 0xfefb, + XK_Pointer_DfltBtnPrev = 0xfefc, + XK_3270_Duplicate = 0xfd01, + XK_3270_FieldMark = 0xfd02, + XK_3270_Right2 = 0xfd03, + XK_3270_Left2 = 0xfd04, + XK_3270_BackTab = 0xfd05, + XK_3270_EraseEOF = 0xfd06, + XK_3270_EraseInput = 0xfd07, + XK_3270_Reset = 0xfd08, + XK_3270_Quit = 0xfd09, + XK_3270_PA1 = 0xfd0a, + XK_3270_PA2 = 0xfd0b, + XK_3270_PA3 = 0xfd0c, + XK_3270_Test = 0xfd0d, + XK_3270_Attn = 0xfd0e, + XK_3270_CursorBlink = 0xfd0f, + XK_3270_AltCursor = 0xfd10, + XK_3270_KeyClick = 0xfd11, + XK_3270_Jump = 0xfd12, + XK_3270_Ident = 0xfd13, + XK_3270_Rule = 0xfd14, + XK_3270_Copy = 0xfd15, + XK_3270_Play = 0xfd16, + XK_3270_Setup = 0xfd17, + XK_3270_Record = 0xfd18, + XK_3270_ChangeScreen = 0xfd19, + XK_3270_DeleteWord = 0xfd1a, + XK_3270_ExSelect = 0xfd1b, + XK_3270_CursorSelect = 0xfd1c, + XK_3270_PrintScreen = 0xfd1d, + XK_3270_Enter = 0xfd1e, + XK_space = 0x0020, /* U+0020 SPACE */ + XK_exclam = 0x0021, /* U+0021 EXCLAMATION MARK */ + XK_quotedbl = 0x0022, /* U+0022 QUOTATION MARK */ + XK_numbersign = 0x0023, /* U+0023 NUMBER SIGN */ + XK_dollar = 0x0024, /* U+0024 DOLLAR SIGN */ + XK_percent = 0x0025, /* U+0025 PERCENT SIGN */ + XK_ampersand = 0x0026, /* U+0026 AMPERSAND */ + XK_apostrophe = 0x0027, /* U+0027 APOSTROPHE */ + XK_quoteright = 0x0027, /* deprecated */ + XK_parenleft = 0x0028, /* U+0028 LEFT PARENTHESIS */ + XK_parenright = 0x0029, /* U+0029 RIGHT PARENTHESIS */ + XK_asterisk = 0x002a, /* U+002A ASTERISK */ + XK_plus = 0x002b, /* U+002B PLUS SIGN */ + XK_comma = 0x002c, /* U+002C COMMA */ + XK_minus = 0x002d, /* U+002D HYPHEN-MINUS */ + XK_period = 0x002e, /* U+002E FULL STOP */ + XK_slash = 0x002f, /* U+002F SOLIDUS */ + XK_0 = 0x0030, /* U+0030 DIGIT ZERO */ + XK_1 = 0x0031, /* U+0031 DIGIT ONE */ + XK_2 = 0x0032, /* U+0032 DIGIT TWO */ + XK_3 = 0x0033, /* U+0033 DIGIT THREE */ + XK_4 = 0x0034, /* U+0034 DIGIT FOUR */ + XK_5 = 0x0035, /* U+0035 DIGIT FIVE */ + XK_6 = 0x0036, /* U+0036 DIGIT SIX */ + XK_7 = 0x0037, /* U+0037 DIGIT SEVEN */ + XK_8 = 0x0038, /* U+0038 DIGIT EIGHT */ + XK_9 = 0x0039, /* U+0039 DIGIT NINE */ + XK_colon = 0x003a, /* U+003A COLON */ + XK_semicolon = 0x003b, /* U+003B SEMICOLON */ + XK_less = 0x003c, /* U+003C LESS-THAN SIGN */ + XK_equal = 0x003d, /* U+003D EQUALS SIGN */ + XK_greater = 0x003e, /* U+003E GREATER-THAN SIGN */ + XK_question = 0x003f, /* U+003F QUESTION MARK */ + XK_at = 0x0040, /* U+0040 COMMERCIAL AT */ + XK_A = 0x0041, /* U+0041 LATIN CAPITAL LETTER A */ + XK_B = 0x0042, /* U+0042 LATIN CAPITAL LETTER B */ + XK_C = 0x0043, /* U+0043 LATIN CAPITAL LETTER C */ + XK_D = 0x0044, /* U+0044 LATIN CAPITAL LETTER D */ + XK_E = 0x0045, /* U+0045 LATIN CAPITAL LETTER E */ + XK_F = 0x0046, /* U+0046 LATIN CAPITAL LETTER F */ + XK_G = 0x0047, /* U+0047 LATIN CAPITAL LETTER G */ + XK_H = 0x0048, /* U+0048 LATIN CAPITAL LETTER H */ + XK_I = 0x0049, /* U+0049 LATIN CAPITAL LETTER I */ + XK_J = 0x004a, /* U+004A LATIN CAPITAL LETTER J */ + XK_K = 0x004b, /* U+004B LATIN CAPITAL LETTER K */ + XK_L = 0x004c, /* U+004C LATIN CAPITAL LETTER L */ + XK_M = 0x004d, /* U+004D LATIN CAPITAL LETTER M */ + XK_N = 0x004e, /* U+004E LATIN CAPITAL LETTER N */ + XK_O = 0x004f, /* U+004F LATIN CAPITAL LETTER O */ + XK_P = 0x0050, /* U+0050 LATIN CAPITAL LETTER P */ + XK_Q = 0x0051, /* U+0051 LATIN CAPITAL LETTER Q */ + XK_R = 0x0052, /* U+0052 LATIN CAPITAL LETTER R */ + XK_S = 0x0053, /* U+0053 LATIN CAPITAL LETTER S */ + XK_T = 0x0054, /* U+0054 LATIN CAPITAL LETTER T */ + XK_U = 0x0055, /* U+0055 LATIN CAPITAL LETTER U */ + XK_V = 0x0056, /* U+0056 LATIN CAPITAL LETTER V */ + XK_W = 0x0057, /* U+0057 LATIN CAPITAL LETTER W */ + XK_X = 0x0058, /* U+0058 LATIN CAPITAL LETTER X */ + XK_Y = 0x0059, /* U+0059 LATIN CAPITAL LETTER Y */ + XK_Z = 0x005a, /* U+005A LATIN CAPITAL LETTER Z */ + XK_bracketleft = 0x005b, /* U+005B LEFT SQUARE BRACKET */ + XK_backslash = 0x005c, /* U+005C REVERSE SOLIDUS */ + XK_bracketright = 0x005d, /* U+005D RIGHT SQUARE BRACKET */ + XK_asciicircum = 0x005e, /* U+005E CIRCUMFLEX ACCENT */ + XK_underscore = 0x005f, /* U+005F LOW LINE */ + XK_grave = 0x0060, /* U+0060 GRAVE ACCENT */ + XK_quoteleft = 0x0060, /* deprecated */ + XK_a = 0x0061, /* U+0061 LATIN SMALL LETTER A */ + XK_b = 0x0062, /* U+0062 LATIN SMALL LETTER B */ + XK_c = 0x0063, /* U+0063 LATIN SMALL LETTER C */ + XK_d = 0x0064, /* U+0064 LATIN SMALL LETTER D */ + XK_e = 0x0065, /* U+0065 LATIN SMALL LETTER E */ + XK_f = 0x0066, /* U+0066 LATIN SMALL LETTER F */ + XK_g = 0x0067, /* U+0067 LATIN SMALL LETTER G */ + XK_h = 0x0068, /* U+0068 LATIN SMALL LETTER H */ + XK_i = 0x0069, /* U+0069 LATIN SMALL LETTER I */ + XK_j = 0x006a, /* U+006A LATIN SMALL LETTER J */ + XK_k = 0x006b, /* U+006B LATIN SMALL LETTER K */ + XK_l = 0x006c, /* U+006C LATIN SMALL LETTER L */ + XK_m = 0x006d, /* U+006D LATIN SMALL LETTER M */ + XK_n = 0x006e, /* U+006E LATIN SMALL LETTER N */ + XK_o = 0x006f, /* U+006F LATIN SMALL LETTER O */ + XK_p = 0x0070, /* U+0070 LATIN SMALL LETTER P */ + XK_q = 0x0071, /* U+0071 LATIN SMALL LETTER Q */ + XK_r = 0x0072, /* U+0072 LATIN SMALL LETTER R */ + XK_s = 0x0073, /* U+0073 LATIN SMALL LETTER S */ + XK_t = 0x0074, /* U+0074 LATIN SMALL LETTER T */ + XK_u = 0x0075, /* U+0075 LATIN SMALL LETTER U */ + XK_v = 0x0076, /* U+0076 LATIN SMALL LETTER V */ + XK_w = 0x0077, /* U+0077 LATIN SMALL LETTER W */ + XK_x = 0x0078, /* U+0078 LATIN SMALL LETTER X */ + XK_y = 0x0079, /* U+0079 LATIN SMALL LETTER Y */ + XK_z = 0x007a, /* U+007A LATIN SMALL LETTER Z */ + XK_braceleft = 0x007b, /* U+007B LEFT CURLY BRACKET */ + XK_bar = 0x007c, /* U+007C VERTICAL LINE */ + XK_braceright = 0x007d, /* U+007D RIGHT CURLY BRACKET */ + XK_asciitilde = 0x007e, /* U+007E TILDE */ + XK_nobreakspace = 0x00a0, /* U+00A0 NO-BREAK SPACE */ + XK_exclamdown = 0x00a1, /* U+00A1 INVERTED EXCLAMATION MARK */ + XK_cent = 0x00a2, /* U+00A2 CENT SIGN */ + XK_sterling = 0x00a3, /* U+00A3 POUND SIGN */ + XK_currency = 0x00a4, /* U+00A4 CURRENCY SIGN */ + XK_yen = 0x00a5, /* U+00A5 YEN SIGN */ + XK_brokenbar = 0x00a6, /* U+00A6 BROKEN BAR */ + XK_section = 0x00a7, /* U+00A7 SECTION SIGN */ + XK_diaeresis = 0x00a8, /* U+00A8 DIAERESIS */ + XK_copyright = 0x00a9, /* U+00A9 COPYRIGHT SIGN */ + XK_ordfeminine = 0x00aa, /* U+00AA FEMININE ORDINAL INDICATOR */ + XK_guillemotleft = 0x00ab, /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ + XK_notsign = 0x00ac, /* U+00AC NOT SIGN */ + XK_hyphen = 0x00ad, /* U+00AD SOFT HYPHEN */ + XK_registered = 0x00ae, /* U+00AE REGISTERED SIGN */ + XK_macron = 0x00af, /* U+00AF MACRON */ + XK_degree = 0x00b0, /* U+00B0 DEGREE SIGN */ + XK_plusminus = 0x00b1, /* U+00B1 PLUS-MINUS SIGN */ + XK_twosuperior = 0x00b2, /* U+00B2 SUPERSCRIPT TWO */ + XK_threesuperior = 0x00b3, /* U+00B3 SUPERSCRIPT THREE */ + XK_acute = 0x00b4, /* U+00B4 ACUTE ACCENT */ + XK_mu = 0x00b5, /* U+00B5 MICRO SIGN */ + XK_paragraph = 0x00b6, /* U+00B6 PILCROW SIGN */ + XK_periodcentered = 0x00b7, /* U+00B7 MIDDLE DOT */ + XK_cedilla = 0x00b8, /* U+00B8 CEDILLA */ + XK_onesuperior = 0x00b9, /* U+00B9 SUPERSCRIPT ONE */ + XK_masculine = 0x00ba, /* U+00BA MASCULINE ORDINAL INDICATOR */ + XK_guillemotright = 0x00bb, /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ + XK_onequarter = 0x00bc, /* U+00BC VULGAR FRACTION ONE QUARTER */ + XK_onehalf = 0x00bd, /* U+00BD VULGAR FRACTION ONE HALF */ + XK_threequarters = 0x00be, /* U+00BE VULGAR FRACTION THREE QUARTERS */ + XK_questiondown = 0x00bf, /* U+00BF INVERTED QUESTION MARK */ + XK_Agrave = 0x00c0, /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */ + XK_Aacute = 0x00c1, /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */ + XK_Acircumflex = 0x00c2, /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ + XK_Atilde = 0x00c3, /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */ + XK_Adiaeresis = 0x00c4, /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */ + XK_Aring = 0x00c5, /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */ + XK_AE = 0x00c6, /* U+00C6 LATIN CAPITAL LETTER AE */ + XK_Ccedilla = 0x00c7, /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */ + XK_Egrave = 0x00c8, /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */ + XK_Eacute = 0x00c9, /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */ + XK_Ecircumflex = 0x00ca, /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ + XK_Ediaeresis = 0x00cb, /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */ + XK_Igrave = 0x00cc, /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */ + XK_Iacute = 0x00cd, /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */ + XK_Icircumflex = 0x00ce, /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ + XK_Idiaeresis = 0x00cf, /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */ + XK_ETH = 0x00d0, /* U+00D0 LATIN CAPITAL LETTER ETH */ + XK_Eth = 0x00d0, /* deprecated */ + XK_Ntilde = 0x00d1, /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */ + XK_Ograve = 0x00d2, /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */ + XK_Oacute = 0x00d3, /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */ + XK_Ocircumflex = 0x00d4, /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ + XK_Otilde = 0x00d5, /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */ + XK_Odiaeresis = 0x00d6, /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */ + XK_multiply = 0x00d7, /* U+00D7 MULTIPLICATION SIGN */ + XK_Oslash = 0x00d8, /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ + XK_Ooblique = 0x00d8, /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */ + XK_Ugrave = 0x00d9, /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */ + XK_Uacute = 0x00da, /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */ + XK_Ucircumflex = 0x00db, /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ + XK_Udiaeresis = 0x00dc, /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */ + XK_Yacute = 0x00dd, /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */ + XK_THORN = 0x00de, /* U+00DE LATIN CAPITAL LETTER THORN */ + XK_Thorn = 0x00de, /* deprecated */ + XK_ssharp = 0x00df, /* U+00DF LATIN SMALL LETTER SHARP S */ + XK_agrave = 0x00e0, /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */ + XK_aacute = 0x00e1, /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */ + XK_acircumflex = 0x00e2, /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */ + XK_atilde = 0x00e3, /* U+00E3 LATIN SMALL LETTER A WITH TILDE */ + XK_adiaeresis = 0x00e4, /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */ + XK_aring = 0x00e5, /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */ + XK_ae = 0x00e6, /* U+00E6 LATIN SMALL LETTER AE */ + XK_ccedilla = 0x00e7, /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */ + XK_egrave = 0x00e8, /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */ + XK_eacute = 0x00e9, /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */ + XK_ecircumflex = 0x00ea, /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */ + XK_ediaeresis = 0x00eb, /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */ + XK_igrave = 0x00ec, /* U+00EC LATIN SMALL LETTER I WITH GRAVE */ + XK_iacute = 0x00ed, /* U+00ED LATIN SMALL LETTER I WITH ACUTE */ + XK_icircumflex = 0x00ee, /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */ + XK_idiaeresis = 0x00ef, /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */ + XK_eth = 0x00f0, /* U+00F0 LATIN SMALL LETTER ETH */ + XK_ntilde = 0x00f1, /* U+00F1 LATIN SMALL LETTER N WITH TILDE */ + XK_ograve = 0x00f2, /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */ + XK_oacute = 0x00f3, /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */ + XK_ocircumflex = 0x00f4, /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */ + XK_otilde = 0x00f5, /* U+00F5 LATIN SMALL LETTER O WITH TILDE */ + XK_odiaeresis = 0x00f6, /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */ + XK_division = 0x00f7, /* U+00F7 DIVISION SIGN */ + XK_oslash = 0x00f8, /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ + XK_ooblique = 0x00f8, /* U+00F8 LATIN SMALL LETTER O WITH STROKE */ + XK_ugrave = 0x00f9, /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */ + XK_uacute = 0x00fa, /* U+00FA LATIN SMALL LETTER U WITH ACUTE */ + XK_ucircumflex = 0x00fb, /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */ + XK_udiaeresis = 0x00fc, /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */ + XK_yacute = 0x00fd, /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ + XK_thorn = 0x00fe, /* U+00FE LATIN SMALL LETTER THORN */ + XK_ydiaeresis = 0x00ff, /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */ + XK_Aogonek = 0x01a1, /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */ + XK_breve = 0x01a2, /* U+02D8 BREVE */ + XK_Lstroke = 0x01a3, /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */ + XK_Lcaron = 0x01a5, /* U+013D LATIN CAPITAL LETTER L WITH CARON */ + XK_Sacute = 0x01a6, /* U+015A LATIN CAPITAL LETTER S WITH ACUTE */ + XK_Scaron = 0x01a9, /* U+0160 LATIN CAPITAL LETTER S WITH CARON */ + XK_Scedilla = 0x01aa, /* U+015E LATIN CAPITAL LETTER S WITH CEDILLA */ + XK_Tcaron = 0x01ab, /* U+0164 LATIN CAPITAL LETTER T WITH CARON */ + XK_Zacute = 0x01ac, /* U+0179 LATIN CAPITAL LETTER Z WITH ACUTE */ + XK_Zcaron = 0x01ae, /* U+017D LATIN CAPITAL LETTER Z WITH CARON */ + XK_Zabovedot = 0x01af, /* U+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE */ + XK_aogonek = 0x01b1, /* U+0105 LATIN SMALL LETTER A WITH OGONEK */ + XK_ogonek = 0x01b2, /* U+02DB OGONEK */ + XK_lstroke = 0x01b3, /* U+0142 LATIN SMALL LETTER L WITH STROKE */ + XK_lcaron = 0x01b5, /* U+013E LATIN SMALL LETTER L WITH CARON */ + XK_sacute = 0x01b6, /* U+015B LATIN SMALL LETTER S WITH ACUTE */ + XK_caron = 0x01b7, /* U+02C7 CARON */ + XK_scaron = 0x01b9, /* U+0161 LATIN SMALL LETTER S WITH CARON */ + XK_scedilla = 0x01ba, /* U+015F LATIN SMALL LETTER S WITH CEDILLA */ + XK_tcaron = 0x01bb, /* U+0165 LATIN SMALL LETTER T WITH CARON */ + XK_zacute = 0x01bc, /* U+017A LATIN SMALL LETTER Z WITH ACUTE */ + XK_doubleacute = 0x01bd, /* U+02DD DOUBLE ACUTE ACCENT */ + XK_zcaron = 0x01be, /* U+017E LATIN SMALL LETTER Z WITH CARON */ + XK_zabovedot = 0x01bf, /* U+017C LATIN SMALL LETTER Z WITH DOT ABOVE */ + XK_Racute = 0x01c0, /* U+0154 LATIN CAPITAL LETTER R WITH ACUTE */ + XK_Abreve = 0x01c3, /* U+0102 LATIN CAPITAL LETTER A WITH BREVE */ + XK_Lacute = 0x01c5, /* U+0139 LATIN CAPITAL LETTER L WITH ACUTE */ + XK_Cacute = 0x01c6, /* U+0106 LATIN CAPITAL LETTER C WITH ACUTE */ + XK_Ccaron = 0x01c8, /* U+010C LATIN CAPITAL LETTER C WITH CARON */ + XK_Eogonek = 0x01ca, /* U+0118 LATIN CAPITAL LETTER E WITH OGONEK */ + XK_Ecaron = 0x01cc, /* U+011A LATIN CAPITAL LETTER E WITH CARON */ + XK_Dcaron = 0x01cf, /* U+010E LATIN CAPITAL LETTER D WITH CARON */ + XK_Dstroke = 0x01d0, /* U+0110 LATIN CAPITAL LETTER D WITH STROKE */ + XK_Nacute = 0x01d1, /* U+0143 LATIN CAPITAL LETTER N WITH ACUTE */ + XK_Ncaron = 0x01d2, /* U+0147 LATIN CAPITAL LETTER N WITH CARON */ + XK_Odoubleacute = 0x01d5, /* U+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ + XK_Rcaron = 0x01d8, /* U+0158 LATIN CAPITAL LETTER R WITH CARON */ + XK_Uring = 0x01d9, /* U+016E LATIN CAPITAL LETTER U WITH RING ABOVE */ + XK_Udoubleacute = 0x01db, /* U+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ + XK_Tcedilla = 0x01de, /* U+0162 LATIN CAPITAL LETTER T WITH CEDILLA */ + XK_racute = 0x01e0, /* U+0155 LATIN SMALL LETTER R WITH ACUTE */ + XK_abreve = 0x01e3, /* U+0103 LATIN SMALL LETTER A WITH BREVE */ + XK_lacute = 0x01e5, /* U+013A LATIN SMALL LETTER L WITH ACUTE */ + XK_cacute = 0x01e6, /* U+0107 LATIN SMALL LETTER C WITH ACUTE */ + XK_ccaron = 0x01e8, /* U+010D LATIN SMALL LETTER C WITH CARON */ + XK_eogonek = 0x01ea, /* U+0119 LATIN SMALL LETTER E WITH OGONEK */ + XK_ecaron = 0x01ec, /* U+011B LATIN SMALL LETTER E WITH CARON */ + XK_dcaron = 0x01ef, /* U+010F LATIN SMALL LETTER D WITH CARON */ + XK_dstroke = 0x01f0, /* U+0111 LATIN SMALL LETTER D WITH STROKE */ + XK_nacute = 0x01f1, /* U+0144 LATIN SMALL LETTER N WITH ACUTE */ + XK_ncaron = 0x01f2, /* U+0148 LATIN SMALL LETTER N WITH CARON */ + XK_odoubleacute = 0x01f5, /* U+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE */ + XK_udoubleacute = 0x01fb, /* U+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE */ + XK_rcaron = 0x01f8, /* U+0159 LATIN SMALL LETTER R WITH CARON */ + XK_uring = 0x01f9, /* U+016F LATIN SMALL LETTER U WITH RING ABOVE */ + XK_tcedilla = 0x01fe, /* U+0163 LATIN SMALL LETTER T WITH CEDILLA */ + XK_abovedot = 0x01ff, /* U+02D9 DOT ABOVE */ + XK_Hstroke = 0x02a1, /* U+0126 LATIN CAPITAL LETTER H WITH STROKE */ + XK_Hcircumflex = 0x02a6, /* U+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ + XK_Iabovedot = 0x02a9, /* U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE */ + XK_Gbreve = 0x02ab, /* U+011E LATIN CAPITAL LETTER G WITH BREVE */ + XK_Jcircumflex = 0x02ac, /* U+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ + XK_hstroke = 0x02b1, /* U+0127 LATIN SMALL LETTER H WITH STROKE */ + XK_hcircumflex = 0x02b6, /* U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX */ + XK_idotless = 0x02b9, /* U+0131 LATIN SMALL LETTER DOTLESS I */ + XK_gbreve = 0x02bb, /* U+011F LATIN SMALL LETTER G WITH BREVE */ + XK_jcircumflex = 0x02bc, /* U+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX */ + XK_Cabovedot = 0x02c5, /* U+010A LATIN CAPITAL LETTER C WITH DOT ABOVE */ + XK_Ccircumflex = 0x02c6, /* U+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ + XK_Gabovedot = 0x02d5, /* U+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE */ + XK_Gcircumflex = 0x02d8, /* U+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ + XK_Ubreve = 0x02dd, /* U+016C LATIN CAPITAL LETTER U WITH BREVE */ + XK_Scircumflex = 0x02de, /* U+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ + XK_cabovedot = 0x02e5, /* U+010B LATIN SMALL LETTER C WITH DOT ABOVE */ + XK_ccircumflex = 0x02e6, /* U+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX */ + XK_gabovedot = 0x02f5, /* U+0121 LATIN SMALL LETTER G WITH DOT ABOVE */ + XK_gcircumflex = 0x02f8, /* U+011D LATIN SMALL LETTER G WITH CIRCUMFLEX */ + XK_ubreve = 0x02fd, /* U+016D LATIN SMALL LETTER U WITH BREVE */ + XK_scircumflex = 0x02fe, /* U+015D LATIN SMALL LETTER S WITH CIRCUMFLEX */ + XK_kra = 0x03a2, /* U+0138 LATIN SMALL LETTER KRA */ + XK_kappa = 0x03a2, /* deprecated */ + XK_Rcedilla = 0x03a3, /* U+0156 LATIN CAPITAL LETTER R WITH CEDILLA */ + XK_Itilde = 0x03a5, /* U+0128 LATIN CAPITAL LETTER I WITH TILDE */ + XK_Lcedilla = 0x03a6, /* U+013B LATIN CAPITAL LETTER L WITH CEDILLA */ + XK_Emacron = 0x03aa, /* U+0112 LATIN CAPITAL LETTER E WITH MACRON */ + XK_Gcedilla = 0x03ab, /* U+0122 LATIN CAPITAL LETTER G WITH CEDILLA */ + XK_Tslash = 0x03ac, /* U+0166 LATIN CAPITAL LETTER T WITH STROKE */ + XK_rcedilla = 0x03b3, /* U+0157 LATIN SMALL LETTER R WITH CEDILLA */ + XK_itilde = 0x03b5, /* U+0129 LATIN SMALL LETTER I WITH TILDE */ + XK_lcedilla = 0x03b6, /* U+013C LATIN SMALL LETTER L WITH CEDILLA */ + XK_emacron = 0x03ba, /* U+0113 LATIN SMALL LETTER E WITH MACRON */ + XK_gcedilla = 0x03bb, /* U+0123 LATIN SMALL LETTER G WITH CEDILLA */ + XK_tslash = 0x03bc, /* U+0167 LATIN SMALL LETTER T WITH STROKE */ + XK_ENG = 0x03bd, /* U+014A LATIN CAPITAL LETTER ENG */ + XK_eng = 0x03bf, /* U+014B LATIN SMALL LETTER ENG */ + XK_Amacron = 0x03c0, /* U+0100 LATIN CAPITAL LETTER A WITH MACRON */ + XK_Iogonek = 0x03c7, /* U+012E LATIN CAPITAL LETTER I WITH OGONEK */ + XK_Eabovedot = 0x03cc, /* U+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE */ + XK_Imacron = 0x03cf, /* U+012A LATIN CAPITAL LETTER I WITH MACRON */ + XK_Ncedilla = 0x03d1, /* U+0145 LATIN CAPITAL LETTER N WITH CEDILLA */ + XK_Omacron = 0x03d2, /* U+014C LATIN CAPITAL LETTER O WITH MACRON */ + XK_Kcedilla = 0x03d3, /* U+0136 LATIN CAPITAL LETTER K WITH CEDILLA */ + XK_Uogonek = 0x03d9, /* U+0172 LATIN CAPITAL LETTER U WITH OGONEK */ + XK_Utilde = 0x03dd, /* U+0168 LATIN CAPITAL LETTER U WITH TILDE */ + XK_Umacron = 0x03de, /* U+016A LATIN CAPITAL LETTER U WITH MACRON */ + XK_amacron = 0x03e0, /* U+0101 LATIN SMALL LETTER A WITH MACRON */ + XK_iogonek = 0x03e7, /* U+012F LATIN SMALL LETTER I WITH OGONEK */ + XK_eabovedot = 0x03ec, /* U+0117 LATIN SMALL LETTER E WITH DOT ABOVE */ + XK_imacron = 0x03ef, /* U+012B LATIN SMALL LETTER I WITH MACRON */ + XK_ncedilla = 0x03f1, /* U+0146 LATIN SMALL LETTER N WITH CEDILLA */ + XK_omacron = 0x03f2, /* U+014D LATIN SMALL LETTER O WITH MACRON */ + XK_kcedilla = 0x03f3, /* U+0137 LATIN SMALL LETTER K WITH CEDILLA */ + XK_uogonek = 0x03f9, /* U+0173 LATIN SMALL LETTER U WITH OGONEK */ + XK_utilde = 0x03fd, /* U+0169 LATIN SMALL LETTER U WITH TILDE */ + XK_umacron = 0x03fe, /* U+016B LATIN SMALL LETTER U WITH MACRON */ + XK_Babovedot = 0x1001e02, /* U+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE */ + XK_babovedot = 0x1001e03, /* U+1E03 LATIN SMALL LETTER B WITH DOT ABOVE */ + XK_Dabovedot = 0x1001e0a, /* U+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE */ + XK_Wgrave = 0x1001e80, /* U+1E80 LATIN CAPITAL LETTER W WITH GRAVE */ + XK_Wacute = 0x1001e82, /* U+1E82 LATIN CAPITAL LETTER W WITH ACUTE */ + XK_dabovedot = 0x1001e0b, /* U+1E0B LATIN SMALL LETTER D WITH DOT ABOVE */ + XK_Ygrave = 0x1001ef2, /* U+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE */ + XK_Fabovedot = 0x1001e1e, /* U+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE */ + XK_fabovedot = 0x1001e1f, /* U+1E1F LATIN SMALL LETTER F WITH DOT ABOVE */ + XK_Mabovedot = 0x1001e40, /* U+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE */ + XK_mabovedot = 0x1001e41, /* U+1E41 LATIN SMALL LETTER M WITH DOT ABOVE */ + XK_Pabovedot = 0x1001e56, /* U+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE */ + XK_wgrave = 0x1001e81, /* U+1E81 LATIN SMALL LETTER W WITH GRAVE */ + XK_pabovedot = 0x1001e57, /* U+1E57 LATIN SMALL LETTER P WITH DOT ABOVE */ + XK_wacute = 0x1001e83, /* U+1E83 LATIN SMALL LETTER W WITH ACUTE */ + XK_Sabovedot = 0x1001e60, /* U+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE */ + XK_ygrave = 0x1001ef3, /* U+1EF3 LATIN SMALL LETTER Y WITH GRAVE */ + XK_Wdiaeresis = 0x1001e84, /* U+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS */ + XK_wdiaeresis = 0x1001e85, /* U+1E85 LATIN SMALL LETTER W WITH DIAERESIS */ + XK_sabovedot = 0x1001e61, /* U+1E61 LATIN SMALL LETTER S WITH DOT ABOVE */ + XK_Wcircumflex = 0x1000174, /* U+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX */ + XK_Tabovedot = 0x1001e6a, /* U+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE */ + XK_Ycircumflex = 0x1000176, /* U+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */ + XK_wcircumflex = 0x1000175, /* U+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX */ + XK_tabovedot = 0x1001e6b, /* U+1E6B LATIN SMALL LETTER T WITH DOT ABOVE */ + XK_ycircumflex = 0x1000177, /* U+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX */ + XK_OE = 0x13bc, /* U+0152 LATIN CAPITAL LIGATURE OE */ + XK_oe = 0x13bd, /* U+0153 LATIN SMALL LIGATURE OE */ + XK_Ydiaeresis = 0x13be, /* U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS */ + XK_overline = 0x047e, /* U+203E OVERLINE */ + XK_kana_fullstop = 0x04a1, /* U+3002 IDEOGRAPHIC FULL STOP */ + XK_kana_openingbracket = 0x04a2, /* U+300C LEFT CORNER BRACKET */ + XK_kana_closingbracket = 0x04a3, /* U+300D RIGHT CORNER BRACKET */ + XK_kana_comma = 0x04a4, /* U+3001 IDEOGRAPHIC COMMA */ + XK_kana_conjunctive = 0x04a5, /* U+30FB KATAKANA MIDDLE DOT */ + XK_kana_middledot = 0x04a5, /* deprecated */ + XK_kana_WO = 0x04a6, /* U+30F2 KATAKANA LETTER WO */ + XK_kana_a = 0x04a7, /* U+30A1 KATAKANA LETTER SMALL A */ + XK_kana_i = 0x04a8, /* U+30A3 KATAKANA LETTER SMALL I */ + XK_kana_u = 0x04a9, /* U+30A5 KATAKANA LETTER SMALL U */ + XK_kana_e = 0x04aa, /* U+30A7 KATAKANA LETTER SMALL E */ + XK_kana_o = 0x04ab, /* U+30A9 KATAKANA LETTER SMALL O */ + XK_kana_ya = 0x04ac, /* U+30E3 KATAKANA LETTER SMALL YA */ + XK_kana_yu = 0x04ad, /* U+30E5 KATAKANA LETTER SMALL YU */ + XK_kana_yo = 0x04ae, /* U+30E7 KATAKANA LETTER SMALL YO */ + XK_kana_tsu = 0x04af, /* U+30C3 KATAKANA LETTER SMALL TU */ + XK_kana_tu = 0x04af, /* deprecated */ + XK_prolongedsound = 0x04b0, /* U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK */ + XK_kana_A = 0x04b1, /* U+30A2 KATAKANA LETTER A */ + XK_kana_I = 0x04b2, /* U+30A4 KATAKANA LETTER I */ + XK_kana_U = 0x04b3, /* U+30A6 KATAKANA LETTER U */ + XK_kana_E = 0x04b4, /* U+30A8 KATAKANA LETTER E */ + XK_kana_O = 0x04b5, /* U+30AA KATAKANA LETTER O */ + XK_kana_KA = 0x04b6, /* U+30AB KATAKANA LETTER KA */ + XK_kana_KI = 0x04b7, /* U+30AD KATAKANA LETTER KI */ + XK_kana_KU = 0x04b8, /* U+30AF KATAKANA LETTER KU */ + XK_kana_KE = 0x04b9, /* U+30B1 KATAKANA LETTER KE */ + XK_kana_KO = 0x04ba, /* U+30B3 KATAKANA LETTER KO */ + XK_kana_SA = 0x04bb, /* U+30B5 KATAKANA LETTER SA */ + XK_kana_SHI = 0x04bc, /* U+30B7 KATAKANA LETTER SI */ + XK_kana_SU = 0x04bd, /* U+30B9 KATAKANA LETTER SU */ + XK_kana_SE = 0x04be, /* U+30BB KATAKANA LETTER SE */ + XK_kana_SO = 0x04bf, /* U+30BD KATAKANA LETTER SO */ + XK_kana_TA = 0x04c0, /* U+30BF KATAKANA LETTER TA */ + XK_kana_CHI = 0x04c1, /* U+30C1 KATAKANA LETTER TI */ + XK_kana_TI = 0x04c1, /* deprecated */ + XK_kana_TSU = 0x04c2, /* U+30C4 KATAKANA LETTER TU */ + XK_kana_TU = 0x04c2, /* deprecated */ + XK_kana_TE = 0x04c3, /* U+30C6 KATAKANA LETTER TE */ + XK_kana_TO = 0x04c4, /* U+30C8 KATAKANA LETTER TO */ + XK_kana_NA = 0x04c5, /* U+30CA KATAKANA LETTER NA */ + XK_kana_NI = 0x04c6, /* U+30CB KATAKANA LETTER NI */ + XK_kana_NU = 0x04c7, /* U+30CC KATAKANA LETTER NU */ + XK_kana_NE = 0x04c8, /* U+30CD KATAKANA LETTER NE */ + XK_kana_NO = 0x04c9, /* U+30CE KATAKANA LETTER NO */ + XK_kana_HA = 0x04ca, /* U+30CF KATAKANA LETTER HA */ + XK_kana_HI = 0x04cb, /* U+30D2 KATAKANA LETTER HI */ + XK_kana_FU = 0x04cc, /* U+30D5 KATAKANA LETTER HU */ + XK_kana_HU = 0x04cc, /* deprecated */ + XK_kana_HE = 0x04cd, /* U+30D8 KATAKANA LETTER HE */ + XK_kana_HO = 0x04ce, /* U+30DB KATAKANA LETTER HO */ + XK_kana_MA = 0x04cf, /* U+30DE KATAKANA LETTER MA */ + XK_kana_MI = 0x04d0, /* U+30DF KATAKANA LETTER MI */ + XK_kana_MU = 0x04d1, /* U+30E0 KATAKANA LETTER MU */ + XK_kana_ME = 0x04d2, /* U+30E1 KATAKANA LETTER ME */ + XK_kana_MO = 0x04d3, /* U+30E2 KATAKANA LETTER MO */ + XK_kana_YA = 0x04d4, /* U+30E4 KATAKANA LETTER YA */ + XK_kana_YU = 0x04d5, /* U+30E6 KATAKANA LETTER YU */ + XK_kana_YO = 0x04d6, /* U+30E8 KATAKANA LETTER YO */ + XK_kana_RA = 0x04d7, /* U+30E9 KATAKANA LETTER RA */ + XK_kana_RI = 0x04d8, /* U+30EA KATAKANA LETTER RI */ + XK_kana_RU = 0x04d9, /* U+30EB KATAKANA LETTER RU */ + XK_kana_RE = 0x04da, /* U+30EC KATAKANA LETTER RE */ + XK_kana_RO = 0x04db, /* U+30ED KATAKANA LETTER RO */ + XK_kana_WA = 0x04dc, /* U+30EF KATAKANA LETTER WA */ + XK_kana_N = 0x04dd, /* U+30F3 KATAKANA LETTER N */ + XK_voicedsound = 0x04de, /* U+309B KATAKANA-HIRAGANA VOICED SOUND MARK */ + XK_semivoicedsound = 0x04df, /* U+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ + XK_kana_switch = 0xff7e, /* Alias for mode_switch */ + XK_Farsi_0 = 0x10006f0, /* U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO */ + XK_Farsi_1 = 0x10006f1, /* U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE */ + XK_Farsi_2 = 0x10006f2, /* U+06F2 EXTENDED ARABIC-INDIC DIGIT TWO */ + XK_Farsi_3 = 0x10006f3, /* U+06F3 EXTENDED ARABIC-INDIC DIGIT THREE */ + XK_Farsi_4 = 0x10006f4, /* U+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR */ + XK_Farsi_5 = 0x10006f5, /* U+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE */ + XK_Farsi_6 = 0x10006f6, /* U+06F6 EXTENDED ARABIC-INDIC DIGIT SIX */ + XK_Farsi_7 = 0x10006f7, /* U+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN */ + XK_Farsi_8 = 0x10006f8, /* U+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT */ + XK_Farsi_9 = 0x10006f9, /* U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE */ + XK_Arabic_percent = 0x100066a, /* U+066A ARABIC PERCENT SIGN */ + XK_Arabic_superscript_alef = 0x1000670, /* U+0670 ARABIC LETTER SUPERSCRIPT ALEF */ + XK_Arabic_tteh = 0x1000679, /* U+0679 ARABIC LETTER TTEH */ + XK_Arabic_peh = 0x100067e, /* U+067E ARABIC LETTER PEH */ + XK_Arabic_tcheh = 0x1000686, /* U+0686 ARABIC LETTER TCHEH */ + XK_Arabic_ddal = 0x1000688, /* U+0688 ARABIC LETTER DDAL */ + XK_Arabic_rreh = 0x1000691, /* U+0691 ARABIC LETTER RREH */ + XK_Arabic_comma = 0x05ac, /* U+060C ARABIC COMMA */ + XK_Arabic_fullstop = 0x10006d4, /* U+06D4 ARABIC FULL STOP */ + XK_Arabic_0 = 0x1000660, /* U+0660 ARABIC-INDIC DIGIT ZERO */ + XK_Arabic_1 = 0x1000661, /* U+0661 ARABIC-INDIC DIGIT ONE */ + XK_Arabic_2 = 0x1000662, /* U+0662 ARABIC-INDIC DIGIT TWO */ + XK_Arabic_3 = 0x1000663, /* U+0663 ARABIC-INDIC DIGIT THREE */ + XK_Arabic_4 = 0x1000664, /* U+0664 ARABIC-INDIC DIGIT FOUR */ + XK_Arabic_5 = 0x1000665, /* U+0665 ARABIC-INDIC DIGIT FIVE */ + XK_Arabic_6 = 0x1000666, /* U+0666 ARABIC-INDIC DIGIT SIX */ + XK_Arabic_7 = 0x1000667, /* U+0667 ARABIC-INDIC DIGIT SEVEN */ + XK_Arabic_8 = 0x1000668, /* U+0668 ARABIC-INDIC DIGIT EIGHT */ + XK_Arabic_9 = 0x1000669, /* U+0669 ARABIC-INDIC DIGIT NINE */ + XK_Arabic_semicolon = 0x05bb, /* U+061B ARABIC SEMICOLON */ + XK_Arabic_question_mark = 0x05bf, /* U+061F ARABIC QUESTION MARK */ + XK_Arabic_hamza = 0x05c1, /* U+0621 ARABIC LETTER HAMZA */ + XK_Arabic_maddaonalef = 0x05c2, /* U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE */ + XK_Arabic_hamzaonalef = 0x05c3, /* U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE */ + XK_Arabic_hamzaonwaw = 0x05c4, /* U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE */ + XK_Arabic_hamzaunderalef = 0x05c5, /* U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW */ + XK_Arabic_hamzaonyeh = 0x05c6, /* U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE */ + XK_Arabic_alef = 0x05c7, /* U+0627 ARABIC LETTER ALEF */ + XK_Arabic_beh = 0x05c8, /* U+0628 ARABIC LETTER BEH */ + XK_Arabic_tehmarbuta = 0x05c9, /* U+0629 ARABIC LETTER TEH MARBUTA */ + XK_Arabic_teh = 0x05ca, /* U+062A ARABIC LETTER TEH */ + XK_Arabic_theh = 0x05cb, /* U+062B ARABIC LETTER THEH */ + XK_Arabic_jeem = 0x05cc, /* U+062C ARABIC LETTER JEEM */ + XK_Arabic_hah = 0x05cd, /* U+062D ARABIC LETTER HAH */ + XK_Arabic_khah = 0x05ce, /* U+062E ARABIC LETTER KHAH */ + XK_Arabic_dal = 0x05cf, /* U+062F ARABIC LETTER DAL */ + XK_Arabic_thal = 0x05d0, /* U+0630 ARABIC LETTER THAL */ + XK_Arabic_ra = 0x05d1, /* U+0631 ARABIC LETTER REH */ + XK_Arabic_zain = 0x05d2, /* U+0632 ARABIC LETTER ZAIN */ + XK_Arabic_seen = 0x05d3, /* U+0633 ARABIC LETTER SEEN */ + XK_Arabic_sheen = 0x05d4, /* U+0634 ARABIC LETTER SHEEN */ + XK_Arabic_sad = 0x05d5, /* U+0635 ARABIC LETTER SAD */ + XK_Arabic_dad = 0x05d6, /* U+0636 ARABIC LETTER DAD */ + XK_Arabic_tah = 0x05d7, /* U+0637 ARABIC LETTER TAH */ + XK_Arabic_zah = 0x05d8, /* U+0638 ARABIC LETTER ZAH */ + XK_Arabic_ain = 0x05d9, /* U+0639 ARABIC LETTER AIN */ + XK_Arabic_ghain = 0x05da, /* U+063A ARABIC LETTER GHAIN */ + XK_Arabic_tatweel = 0x05e0, /* U+0640 ARABIC TATWEEL */ + XK_Arabic_feh = 0x05e1, /* U+0641 ARABIC LETTER FEH */ + XK_Arabic_qaf = 0x05e2, /* U+0642 ARABIC LETTER QAF */ + XK_Arabic_kaf = 0x05e3, /* U+0643 ARABIC LETTER KAF */ + XK_Arabic_lam = 0x05e4, /* U+0644 ARABIC LETTER LAM */ + XK_Arabic_meem = 0x05e5, /* U+0645 ARABIC LETTER MEEM */ + XK_Arabic_noon = 0x05e6, /* U+0646 ARABIC LETTER NOON */ + XK_Arabic_ha = 0x05e7, /* U+0647 ARABIC LETTER HEH */ + XK_Arabic_heh = 0x05e7, /* deprecated */ + XK_Arabic_waw = 0x05e8, /* U+0648 ARABIC LETTER WAW */ + XK_Arabic_alefmaksura = 0x05e9, /* U+0649 ARABIC LETTER ALEF MAKSURA */ + XK_Arabic_yeh = 0x05ea, /* U+064A ARABIC LETTER YEH */ + XK_Arabic_fathatan = 0x05eb, /* U+064B ARABIC FATHATAN */ + XK_Arabic_dammatan = 0x05ec, /* U+064C ARABIC DAMMATAN */ + XK_Arabic_kasratan = 0x05ed, /* U+064D ARABIC KASRATAN */ + XK_Arabic_fatha = 0x05ee, /* U+064E ARABIC FATHA */ + XK_Arabic_damma = 0x05ef, /* U+064F ARABIC DAMMA */ + XK_Arabic_kasra = 0x05f0, /* U+0650 ARABIC KASRA */ + XK_Arabic_shadda = 0x05f1, /* U+0651 ARABIC SHADDA */ + XK_Arabic_sukun = 0x05f2, /* U+0652 ARABIC SUKUN */ + XK_Arabic_madda_above = 0x1000653, /* U+0653 ARABIC MADDAH ABOVE */ + XK_Arabic_hamza_above = 0x1000654, /* U+0654 ARABIC HAMZA ABOVE */ + XK_Arabic_hamza_below = 0x1000655, /* U+0655 ARABIC HAMZA BELOW */ + XK_Arabic_jeh = 0x1000698, /* U+0698 ARABIC LETTER JEH */ + XK_Arabic_veh = 0x10006a4, /* U+06A4 ARABIC LETTER VEH */ + XK_Arabic_keheh = 0x10006a9, /* U+06A9 ARABIC LETTER KEHEH */ + XK_Arabic_gaf = 0x10006af, /* U+06AF ARABIC LETTER GAF */ + XK_Arabic_noon_ghunna = 0x10006ba, /* U+06BA ARABIC LETTER NOON GHUNNA */ + XK_Arabic_heh_doachashmee = 0x10006be, /* U+06BE ARABIC LETTER HEH DOACHASHMEE */ + XK_Farsi_yeh = 0x10006cc, /* U+06CC ARABIC LETTER FARSI YEH */ + XK_Arabic_farsi_yeh = 0x10006cc, /* U+06CC ARABIC LETTER FARSI YEH */ + XK_Arabic_yeh_baree = 0x10006d2, /* U+06D2 ARABIC LETTER YEH BARREE */ + XK_Arabic_heh_goal = 0x10006c1, /* U+06C1 ARABIC LETTER HEH GOAL */ + XK_Arabic_switch = 0xff7e, /* Alias for mode_switch */ + XK_Cyrillic_GHE_bar = 0x1000492, /* U+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE */ + XK_Cyrillic_ghe_bar = 0x1000493, /* U+0493 CYRILLIC SMALL LETTER GHE WITH STROKE */ + XK_Cyrillic_ZHE_descender = 0x1000496, /* U+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */ + XK_Cyrillic_zhe_descender = 0x1000497, /* U+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER */ + XK_Cyrillic_KA_descender = 0x100049a, /* U+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER */ + XK_Cyrillic_ka_descender = 0x100049b, /* U+049B CYRILLIC SMALL LETTER KA WITH DESCENDER */ + XK_Cyrillic_KA_vertstroke = 0x100049c, /* U+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */ + XK_Cyrillic_ka_vertstroke = 0x100049d, /* U+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE */ + XK_Cyrillic_EN_descender = 0x10004a2, /* U+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER */ + XK_Cyrillic_en_descender = 0x10004a3, /* U+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER */ + XK_Cyrillic_U_straight = 0x10004ae, /* U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U */ + XK_Cyrillic_u_straight = 0x10004af, /* U+04AF CYRILLIC SMALL LETTER STRAIGHT U */ + XK_Cyrillic_U_straight_bar = 0x10004b0, /* U+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */ + XK_Cyrillic_u_straight_bar = 0x10004b1, /* U+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE */ + XK_Cyrillic_HA_descender = 0x10004b2, /* U+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER */ + XK_Cyrillic_ha_descender = 0x10004b3, /* U+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER */ + XK_Cyrillic_CHE_descender = 0x10004b6, /* U+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */ + XK_Cyrillic_che_descender = 0x10004b7, /* U+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER */ + XK_Cyrillic_CHE_vertstroke = 0x10004b8, /* U+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */ + XK_Cyrillic_che_vertstroke = 0x10004b9, /* U+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE */ + XK_Cyrillic_SHHA = 0x10004ba, /* U+04BA CYRILLIC CAPITAL LETTER SHHA */ + XK_Cyrillic_shha = 0x10004bb, /* U+04BB CYRILLIC SMALL LETTER SHHA */ + XK_Cyrillic_SCHWA = 0x10004d8, /* U+04D8 CYRILLIC CAPITAL LETTER SCHWA */ + XK_Cyrillic_schwa = 0x10004d9, /* U+04D9 CYRILLIC SMALL LETTER SCHWA */ + XK_Cyrillic_I_macron = 0x10004e2, /* U+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON */ + XK_Cyrillic_i_macron = 0x10004e3, /* U+04E3 CYRILLIC SMALL LETTER I WITH MACRON */ + XK_Cyrillic_O_bar = 0x10004e8, /* U+04E8 CYRILLIC CAPITAL LETTER BARRED O */ + XK_Cyrillic_o_bar = 0x10004e9, /* U+04E9 CYRILLIC SMALL LETTER BARRED O */ + XK_Cyrillic_U_macron = 0x10004ee, /* U+04EE CYRILLIC CAPITAL LETTER U WITH MACRON */ + XK_Cyrillic_u_macron = 0x10004ef, /* U+04EF CYRILLIC SMALL LETTER U WITH MACRON */ + XK_Serbian_dje = 0x06a1, /* U+0452 CYRILLIC SMALL LETTER DJE */ + XK_Macedonia_gje = 0x06a2, /* U+0453 CYRILLIC SMALL LETTER GJE */ + XK_Cyrillic_io = 0x06a3, /* U+0451 CYRILLIC SMALL LETTER IO */ + XK_Ukrainian_ie = 0x06a4, /* U+0454 CYRILLIC SMALL LETTER UKRAINIAN IE */ + XK_Ukranian_je = 0x06a4, /* deprecated */ + XK_Macedonia_dse = 0x06a5, /* U+0455 CYRILLIC SMALL LETTER DZE */ + XK_Ukrainian_i = 0x06a6, /* U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ + XK_Ukranian_i = 0x06a6, /* deprecated */ + XK_Ukrainian_yi = 0x06a7, /* U+0457 CYRILLIC SMALL LETTER YI */ + XK_Ukranian_yi = 0x06a7, /* deprecated */ + XK_Cyrillic_je = 0x06a8, /* U+0458 CYRILLIC SMALL LETTER JE */ + XK_Serbian_je = 0x06a8, /* deprecated */ + XK_Cyrillic_lje = 0x06a9, /* U+0459 CYRILLIC SMALL LETTER LJE */ + XK_Serbian_lje = 0x06a9, /* deprecated */ + XK_Cyrillic_nje = 0x06aa, /* U+045A CYRILLIC SMALL LETTER NJE */ + XK_Serbian_nje = 0x06aa, /* deprecated */ + XK_Serbian_tshe = 0x06ab, /* U+045B CYRILLIC SMALL LETTER TSHE */ + XK_Macedonia_kje = 0x06ac, /* U+045C CYRILLIC SMALL LETTER KJE */ + XK_Ukrainian_ghe_with_upturn = 0x06ad, /* U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN */ + XK_Byelorussian_shortu = 0x06ae, /* U+045E CYRILLIC SMALL LETTER SHORT U */ + XK_Cyrillic_dzhe = 0x06af, /* U+045F CYRILLIC SMALL LETTER DZHE */ + XK_Serbian_dze = 0x06af, /* deprecated */ + XK_numerosign = 0x06b0, /* U+2116 NUMERO SIGN */ + XK_Serbian_DJE = 0x06b1, /* U+0402 CYRILLIC CAPITAL LETTER DJE */ + XK_Macedonia_GJE = 0x06b2, /* U+0403 CYRILLIC CAPITAL LETTER GJE */ + XK_Cyrillic_IO = 0x06b3, /* U+0401 CYRILLIC CAPITAL LETTER IO */ + XK_Ukrainian_IE = 0x06b4, /* U+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE */ + XK_Ukranian_JE = 0x06b4, /* deprecated */ + XK_Macedonia_DSE = 0x06b5, /* U+0405 CYRILLIC CAPITAL LETTER DZE */ + XK_Ukrainian_I = 0x06b6, /* U+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ + XK_Ukranian_I = 0x06b6, /* deprecated */ + XK_Ukrainian_YI = 0x06b7, /* U+0407 CYRILLIC CAPITAL LETTER YI */ + XK_Ukranian_YI = 0x06b7, /* deprecated */ + XK_Cyrillic_JE = 0x06b8, /* U+0408 CYRILLIC CAPITAL LETTER JE */ + XK_Serbian_JE = 0x06b8, /* deprecated */ + XK_Cyrillic_LJE = 0x06b9, /* U+0409 CYRILLIC CAPITAL LETTER LJE */ + XK_Serbian_LJE = 0x06b9, /* deprecated */ + XK_Cyrillic_NJE = 0x06ba, /* U+040A CYRILLIC CAPITAL LETTER NJE */ + XK_Serbian_NJE = 0x06ba, /* deprecated */ + XK_Serbian_TSHE = 0x06bb, /* U+040B CYRILLIC CAPITAL LETTER TSHE */ + XK_Macedonia_KJE = 0x06bc, /* U+040C CYRILLIC CAPITAL LETTER KJE */ + XK_Ukrainian_GHE_WITH_UPTURN = 0x06bd, /* U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ + XK_Byelorussian_SHORTU = 0x06be, /* U+040E CYRILLIC CAPITAL LETTER SHORT U */ + XK_Cyrillic_DZHE = 0x06bf, /* U+040F CYRILLIC CAPITAL LETTER DZHE */ + XK_Serbian_DZE = 0x06bf, /* deprecated */ + XK_Cyrillic_yu = 0x06c0, /* U+044E CYRILLIC SMALL LETTER YU */ + XK_Cyrillic_a = 0x06c1, /* U+0430 CYRILLIC SMALL LETTER A */ + XK_Cyrillic_be = 0x06c2, /* U+0431 CYRILLIC SMALL LETTER BE */ + XK_Cyrillic_tse = 0x06c3, /* U+0446 CYRILLIC SMALL LETTER TSE */ + XK_Cyrillic_de = 0x06c4, /* U+0434 CYRILLIC SMALL LETTER DE */ + XK_Cyrillic_ie = 0x06c5, /* U+0435 CYRILLIC SMALL LETTER IE */ + XK_Cyrillic_ef = 0x06c6, /* U+0444 CYRILLIC SMALL LETTER EF */ + XK_Cyrillic_ghe = 0x06c7, /* U+0433 CYRILLIC SMALL LETTER GHE */ + XK_Cyrillic_ha = 0x06c8, /* U+0445 CYRILLIC SMALL LETTER HA */ + XK_Cyrillic_i = 0x06c9, /* U+0438 CYRILLIC SMALL LETTER I */ + XK_Cyrillic_shorti = 0x06ca, /* U+0439 CYRILLIC SMALL LETTER SHORT I */ + XK_Cyrillic_ka = 0x06cb, /* U+043A CYRILLIC SMALL LETTER KA */ + XK_Cyrillic_el = 0x06cc, /* U+043B CYRILLIC SMALL LETTER EL */ + XK_Cyrillic_em = 0x06cd, /* U+043C CYRILLIC SMALL LETTER EM */ + XK_Cyrillic_en = 0x06ce, /* U+043D CYRILLIC SMALL LETTER EN */ + XK_Cyrillic_o = 0x06cf, /* U+043E CYRILLIC SMALL LETTER O */ + XK_Cyrillic_pe = 0x06d0, /* U+043F CYRILLIC SMALL LETTER PE */ + XK_Cyrillic_ya = 0x06d1, /* U+044F CYRILLIC SMALL LETTER YA */ + XK_Cyrillic_er = 0x06d2, /* U+0440 CYRILLIC SMALL LETTER ER */ + XK_Cyrillic_es = 0x06d3, /* U+0441 CYRILLIC SMALL LETTER ES */ + XK_Cyrillic_te = 0x06d4, /* U+0442 CYRILLIC SMALL LETTER TE */ + XK_Cyrillic_u = 0x06d5, /* U+0443 CYRILLIC SMALL LETTER U */ + XK_Cyrillic_zhe = 0x06d6, /* U+0436 CYRILLIC SMALL LETTER ZHE */ + XK_Cyrillic_ve = 0x06d7, /* U+0432 CYRILLIC SMALL LETTER VE */ + XK_Cyrillic_softsign = 0x06d8, /* U+044C CYRILLIC SMALL LETTER SOFT SIGN */ + XK_Cyrillic_yeru = 0x06d9, /* U+044B CYRILLIC SMALL LETTER YERU */ + XK_Cyrillic_ze = 0x06da, /* U+0437 CYRILLIC SMALL LETTER ZE */ + XK_Cyrillic_sha = 0x06db, /* U+0448 CYRILLIC SMALL LETTER SHA */ + XK_Cyrillic_e = 0x06dc, /* U+044D CYRILLIC SMALL LETTER E */ + XK_Cyrillic_shcha = 0x06dd, /* U+0449 CYRILLIC SMALL LETTER SHCHA */ + XK_Cyrillic_che = 0x06de, /* U+0447 CYRILLIC SMALL LETTER CHE */ + XK_Cyrillic_hardsign = 0x06df, /* U+044A CYRILLIC SMALL LETTER HARD SIGN */ + XK_Cyrillic_YU = 0x06e0, /* U+042E CYRILLIC CAPITAL LETTER YU */ + XK_Cyrillic_A = 0x06e1, /* U+0410 CYRILLIC CAPITAL LETTER A */ + XK_Cyrillic_BE = 0x06e2, /* U+0411 CYRILLIC CAPITAL LETTER BE */ + XK_Cyrillic_TSE = 0x06e3, /* U+0426 CYRILLIC CAPITAL LETTER TSE */ + XK_Cyrillic_DE = 0x06e4, /* U+0414 CYRILLIC CAPITAL LETTER DE */ + XK_Cyrillic_IE = 0x06e5, /* U+0415 CYRILLIC CAPITAL LETTER IE */ + XK_Cyrillic_EF = 0x06e6, /* U+0424 CYRILLIC CAPITAL LETTER EF */ + XK_Cyrillic_GHE = 0x06e7, /* U+0413 CYRILLIC CAPITAL LETTER GHE */ + XK_Cyrillic_HA = 0x06e8, /* U+0425 CYRILLIC CAPITAL LETTER HA */ + XK_Cyrillic_I = 0x06e9, /* U+0418 CYRILLIC CAPITAL LETTER I */ + XK_Cyrillic_SHORTI = 0x06ea, /* U+0419 CYRILLIC CAPITAL LETTER SHORT I */ + XK_Cyrillic_KA = 0x06eb, /* U+041A CYRILLIC CAPITAL LETTER KA */ + XK_Cyrillic_EL = 0x06ec, /* U+041B CYRILLIC CAPITAL LETTER EL */ + XK_Cyrillic_EM = 0x06ed, /* U+041C CYRILLIC CAPITAL LETTER EM */ + XK_Cyrillic_EN = 0x06ee, /* U+041D CYRILLIC CAPITAL LETTER EN */ + XK_Cyrillic_O = 0x06ef, /* U+041E CYRILLIC CAPITAL LETTER O */ + XK_Cyrillic_PE = 0x06f0, /* U+041F CYRILLIC CAPITAL LETTER PE */ + XK_Cyrillic_YA = 0x06f1, /* U+042F CYRILLIC CAPITAL LETTER YA */ + XK_Cyrillic_ER = 0x06f2, /* U+0420 CYRILLIC CAPITAL LETTER ER */ + XK_Cyrillic_ES = 0x06f3, /* U+0421 CYRILLIC CAPITAL LETTER ES */ + XK_Cyrillic_TE = 0x06f4, /* U+0422 CYRILLIC CAPITAL LETTER TE */ + XK_Cyrillic_U = 0x06f5, /* U+0423 CYRILLIC CAPITAL LETTER U */ + XK_Cyrillic_ZHE = 0x06f6, /* U+0416 CYRILLIC CAPITAL LETTER ZHE */ + XK_Cyrillic_VE = 0x06f7, /* U+0412 CYRILLIC CAPITAL LETTER VE */ + XK_Cyrillic_SOFTSIGN = 0x06f8, /* U+042C CYRILLIC CAPITAL LETTER SOFT SIGN */ + XK_Cyrillic_YERU = 0x06f9, /* U+042B CYRILLIC CAPITAL LETTER YERU */ + XK_Cyrillic_ZE = 0x06fa, /* U+0417 CYRILLIC CAPITAL LETTER ZE */ + XK_Cyrillic_SHA = 0x06fb, /* U+0428 CYRILLIC CAPITAL LETTER SHA */ + XK_Cyrillic_E = 0x06fc, /* U+042D CYRILLIC CAPITAL LETTER E */ + XK_Cyrillic_SHCHA = 0x06fd, /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */ + XK_Cyrillic_CHE = 0x06fe, /* U+0427 CYRILLIC CAPITAL LETTER CHE */ + XK_Cyrillic_HARDSIGN = 0x06ff, /* U+042A CYRILLIC CAPITAL LETTER HARD SIGN */ + XK_Greek_ALPHAaccent = 0x07a1, /* U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS */ + XK_Greek_EPSILONaccent = 0x07a2, /* U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS */ + XK_Greek_ETAaccent = 0x07a3, /* U+0389 GREEK CAPITAL LETTER ETA WITH TONOS */ + XK_Greek_IOTAaccent = 0x07a4, /* U+038A GREEK CAPITAL LETTER IOTA WITH TONOS */ + XK_Greek_IOTAdieresis = 0x07a5, /* U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ + XK_Greek_IOTAdiaeresis = 0x07a5, /* old typo */ + XK_Greek_OMICRONaccent = 0x07a7, /* U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS */ + XK_Greek_UPSILONaccent = 0x07a8, /* U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS */ + XK_Greek_UPSILONdieresis = 0x07a9, /* U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ + XK_Greek_OMEGAaccent = 0x07ab, /* U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS */ + XK_Greek_accentdieresis = 0x07ae, /* U+0385 GREEK DIALYTIKA TONOS */ + XK_Greek_horizbar = 0x07af, /* U+2015 HORIZONTAL BAR */ + XK_Greek_alphaaccent = 0x07b1, /* U+03AC GREEK SMALL LETTER ALPHA WITH TONOS */ + XK_Greek_epsilonaccent = 0x07b2, /* U+03AD GREEK SMALL LETTER EPSILON WITH TONOS */ + XK_Greek_etaaccent = 0x07b3, /* U+03AE GREEK SMALL LETTER ETA WITH TONOS */ + XK_Greek_iotaaccent = 0x07b4, /* U+03AF GREEK SMALL LETTER IOTA WITH TONOS */ + XK_Greek_iotadieresis = 0x07b5, /* U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA */ + XK_Greek_iotaaccentdieresis = 0x07b6, /* U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ + XK_Greek_omicronaccent = 0x07b7, /* U+03CC GREEK SMALL LETTER OMICRON WITH TONOS */ + XK_Greek_upsilonaccent = 0x07b8, /* U+03CD GREEK SMALL LETTER UPSILON WITH TONOS */ + XK_Greek_upsilondieresis = 0x07b9, /* U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ + XK_Greek_upsilonaccentdieresis = 0x07ba, /* U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ + XK_Greek_omegaaccent = 0x07bb, /* U+03CE GREEK SMALL LETTER OMEGA WITH TONOS */ + XK_Greek_ALPHA = 0x07c1, /* U+0391 GREEK CAPITAL LETTER ALPHA */ + XK_Greek_BETA = 0x07c2, /* U+0392 GREEK CAPITAL LETTER BETA */ + XK_Greek_GAMMA = 0x07c3, /* U+0393 GREEK CAPITAL LETTER GAMMA */ + XK_Greek_DELTA = 0x07c4, /* U+0394 GREEK CAPITAL LETTER DELTA */ + XK_Greek_EPSILON = 0x07c5, /* U+0395 GREEK CAPITAL LETTER EPSILON */ + XK_Greek_ZETA = 0x07c6, /* U+0396 GREEK CAPITAL LETTER ZETA */ + XK_Greek_ETA = 0x07c7, /* U+0397 GREEK CAPITAL LETTER ETA */ + XK_Greek_THETA = 0x07c8, /* U+0398 GREEK CAPITAL LETTER THETA */ + XK_Greek_IOTA = 0x07c9, /* U+0399 GREEK CAPITAL LETTER IOTA */ + XK_Greek_KAPPA = 0x07ca, /* U+039A GREEK CAPITAL LETTER KAPPA */ + XK_Greek_LAMDA = 0x07cb, /* U+039B GREEK CAPITAL LETTER LAMDA */ + XK_Greek_LAMBDA = 0x07cb, /* U+039B GREEK CAPITAL LETTER LAMDA */ + XK_Greek_MU = 0x07cc, /* U+039C GREEK CAPITAL LETTER MU */ + XK_Greek_NU = 0x07cd, /* U+039D GREEK CAPITAL LETTER NU */ + XK_Greek_XI = 0x07ce, /* U+039E GREEK CAPITAL LETTER XI */ + XK_Greek_OMICRON = 0x07cf, /* U+039F GREEK CAPITAL LETTER OMICRON */ + XK_Greek_PI = 0x07d0, /* U+03A0 GREEK CAPITAL LETTER PI */ + XK_Greek_RHO = 0x07d1, /* U+03A1 GREEK CAPITAL LETTER RHO */ + XK_Greek_SIGMA = 0x07d2, /* U+03A3 GREEK CAPITAL LETTER SIGMA */ + XK_Greek_TAU = 0x07d4, /* U+03A4 GREEK CAPITAL LETTER TAU */ + XK_Greek_UPSILON = 0x07d5, /* U+03A5 GREEK CAPITAL LETTER UPSILON */ + XK_Greek_PHI = 0x07d6, /* U+03A6 GREEK CAPITAL LETTER PHI */ + XK_Greek_CHI = 0x07d7, /* U+03A7 GREEK CAPITAL LETTER CHI */ + XK_Greek_PSI = 0x07d8, /* U+03A8 GREEK CAPITAL LETTER PSI */ + XK_Greek_OMEGA = 0x07d9, /* U+03A9 GREEK CAPITAL LETTER OMEGA */ + XK_Greek_alpha = 0x07e1, /* U+03B1 GREEK SMALL LETTER ALPHA */ + XK_Greek_beta = 0x07e2, /* U+03B2 GREEK SMALL LETTER BETA */ + XK_Greek_gamma = 0x07e3, /* U+03B3 GREEK SMALL LETTER GAMMA */ + XK_Greek_delta = 0x07e4, /* U+03B4 GREEK SMALL LETTER DELTA */ + XK_Greek_epsilon = 0x07e5, /* U+03B5 GREEK SMALL LETTER EPSILON */ + XK_Greek_zeta = 0x07e6, /* U+03B6 GREEK SMALL LETTER ZETA */ + XK_Greek_eta = 0x07e7, /* U+03B7 GREEK SMALL LETTER ETA */ + XK_Greek_theta = 0x07e8, /* U+03B8 GREEK SMALL LETTER THETA */ + XK_Greek_iota = 0x07e9, /* U+03B9 GREEK SMALL LETTER IOTA */ + XK_Greek_kappa = 0x07ea, /* U+03BA GREEK SMALL LETTER KAPPA */ + XK_Greek_lamda = 0x07eb, /* U+03BB GREEK SMALL LETTER LAMDA */ + XK_Greek_lambda = 0x07eb, /* U+03BB GREEK SMALL LETTER LAMDA */ + XK_Greek_mu = 0x07ec, /* U+03BC GREEK SMALL LETTER MU */ + XK_Greek_nu = 0x07ed, /* U+03BD GREEK SMALL LETTER NU */ + XK_Greek_xi = 0x07ee, /* U+03BE GREEK SMALL LETTER XI */ + XK_Greek_omicron = 0x07ef, /* U+03BF GREEK SMALL LETTER OMICRON */ + XK_Greek_pi = 0x07f0, /* U+03C0 GREEK SMALL LETTER PI */ + XK_Greek_rho = 0x07f1, /* U+03C1 GREEK SMALL LETTER RHO */ + XK_Greek_sigma = 0x07f2, /* U+03C3 GREEK SMALL LETTER SIGMA */ + XK_Greek_finalsmallsigma = 0x07f3, /* U+03C2 GREEK SMALL LETTER FINAL SIGMA */ + XK_Greek_tau = 0x07f4, /* U+03C4 GREEK SMALL LETTER TAU */ + XK_Greek_upsilon = 0x07f5, /* U+03C5 GREEK SMALL LETTER UPSILON */ + XK_Greek_phi = 0x07f6, /* U+03C6 GREEK SMALL LETTER PHI */ + XK_Greek_chi = 0x07f7, /* U+03C7 GREEK SMALL LETTER CHI */ + XK_Greek_psi = 0x07f8, /* U+03C8 GREEK SMALL LETTER PSI */ + XK_Greek_omega = 0x07f9, /* U+03C9 GREEK SMALL LETTER OMEGA */ + XK_Greek_switch = 0xff7e, /* Alias for mode_switch */ + XK_leftradical = 0x08a1, /* U+23B7 RADICAL SYMBOL BOTTOM */ + XK_topleftradical = 0x08a2, /*(U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT)*/ + XK_horizconnector = 0x08a3, /*(U+2500 BOX DRAWINGS LIGHT HORIZONTAL)*/ + XK_topintegral = 0x08a4, /* U+2320 TOP HALF INTEGRAL */ + XK_botintegral = 0x08a5, /* U+2321 BOTTOM HALF INTEGRAL */ + XK_vertconnector = 0x08a6, /*(U+2502 BOX DRAWINGS LIGHT VERTICAL)*/ + XK_topleftsqbracket = 0x08a7, /* U+23A1 LEFT SQUARE BRACKET UPPER CORNER */ + XK_botleftsqbracket = 0x08a8, /* U+23A3 LEFT SQUARE BRACKET LOWER CORNER */ + XK_toprightsqbracket = 0x08a9, /* U+23A4 RIGHT SQUARE BRACKET UPPER CORNER */ + XK_botrightsqbracket = 0x08aa, /* U+23A6 RIGHT SQUARE BRACKET LOWER CORNER */ + XK_topleftparens = 0x08ab, /* U+239B LEFT PARENTHESIS UPPER HOOK */ + XK_botleftparens = 0x08ac, /* U+239D LEFT PARENTHESIS LOWER HOOK */ + XK_toprightparens = 0x08ad, /* U+239E RIGHT PARENTHESIS UPPER HOOK */ + XK_botrightparens = 0x08ae, /* U+23A0 RIGHT PARENTHESIS LOWER HOOK */ + XK_leftmiddlecurlybrace = 0x08af, /* U+23A8 LEFT CURLY BRACKET MIDDLE PIECE */ + XK_rightmiddlecurlybrace = 0x08b0, /* U+23AC RIGHT CURLY BRACKET MIDDLE PIECE */ + XK_topleftsummation = 0x08b1, + XK_botleftsummation = 0x08b2, + XK_topvertsummationconnector = 0x08b3, + XK_botvertsummationconnector = 0x08b4, + XK_toprightsummation = 0x08b5, + XK_botrightsummation = 0x08b6, + XK_rightmiddlesummation = 0x08b7, + XK_lessthanequal = 0x08bc, /* U+2264 LESS-THAN OR EQUAL TO */ + XK_notequal = 0x08bd, /* U+2260 NOT EQUAL TO */ + XK_greaterthanequal = 0x08be, /* U+2265 GREATER-THAN OR EQUAL TO */ + XK_integral = 0x08bf, /* U+222B INTEGRAL */ + XK_therefore = 0x08c0, /* U+2234 THEREFORE */ + XK_variation = 0x08c1, /* U+221D PROPORTIONAL TO */ + XK_infinity = 0x08c2, /* U+221E INFINITY */ + XK_nabla = 0x08c5, /* U+2207 NABLA */ + XK_approximate = 0x08c8, /* U+223C TILDE OPERATOR */ + XK_similarequal = 0x08c9, /* U+2243 ASYMPTOTICALLY EQUAL TO */ + XK_ifonlyif = 0x08cd, /* U+21D4 LEFT RIGHT DOUBLE ARROW */ + XK_implies = 0x08ce, /* U+21D2 RIGHTWARDS DOUBLE ARROW */ + XK_identical = 0x08cf, /* U+2261 IDENTICAL TO */ + XK_radical = 0x08d6, /* U+221A SQUARE ROOT */ + XK_includedin = 0x08da, /* U+2282 SUBSET OF */ + XK_includes = 0x08db, /* U+2283 SUPERSET OF */ + XK_intersection = 0x08dc, /* U+2229 INTERSECTION */ + XK_union = 0x08dd, /* U+222A UNION */ + XK_logicaland = 0x08de, /* U+2227 LOGICAL AND */ + XK_logicalor = 0x08df, /* U+2228 LOGICAL OR */ + XK_partialderivative = 0x08ef, /* U+2202 PARTIAL DIFFERENTIAL */ + XK_function = 0x08f6, /* U+0192 LATIN SMALL LETTER F WITH HOOK */ + XK_leftarrow = 0x08fb, /* U+2190 LEFTWARDS ARROW */ + XK_uparrow = 0x08fc, /* U+2191 UPWARDS ARROW */ + XK_rightarrow = 0x08fd, /* U+2192 RIGHTWARDS ARROW */ + XK_downarrow = 0x08fe, /* U+2193 DOWNWARDS ARROW */ + XK_blank = 0x09df, + XK_soliddiamond = 0x09e0, /* U+25C6 BLACK DIAMOND */ + XK_checkerboard = 0x09e1, /* U+2592 MEDIUM SHADE */ + XK_ht = 0x09e2, /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */ + XK_ff = 0x09e3, /* U+240C SYMBOL FOR FORM FEED */ + XK_cr = 0x09e4, /* U+240D SYMBOL FOR CARRIAGE RETURN */ + XK_lf = 0x09e5, /* U+240A SYMBOL FOR LINE FEED */ + XK_nl = 0x09e8, /* U+2424 SYMBOL FOR NEWLINE */ + XK_vt = 0x09e9, /* U+240B SYMBOL FOR VERTICAL TABULATION */ + XK_lowrightcorner = 0x09ea, /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */ + XK_uprightcorner = 0x09eb, /* U+2510 BOX DRAWINGS LIGHT DOWN AND LEFT */ + XK_upleftcorner = 0x09ec, /* U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT */ + XK_lowleftcorner = 0x09ed, /* U+2514 BOX DRAWINGS LIGHT UP AND RIGHT */ + XK_crossinglines = 0x09ee, /* U+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ + XK_horizlinescan1 = 0x09ef, /* U+23BA HORIZONTAL SCAN LINE-1 */ + XK_horizlinescan3 = 0x09f0, /* U+23BB HORIZONTAL SCAN LINE-3 */ + XK_horizlinescan5 = 0x09f1, /* U+2500 BOX DRAWINGS LIGHT HORIZONTAL */ + XK_horizlinescan7 = 0x09f2, /* U+23BC HORIZONTAL SCAN LINE-7 */ + XK_horizlinescan9 = 0x09f3, /* U+23BD HORIZONTAL SCAN LINE-9 */ + XK_leftt = 0x09f4, /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ + XK_rightt = 0x09f5, /* U+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT */ + XK_bott = 0x09f6, /* U+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL */ + XK_topt = 0x09f7, /* U+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ + XK_vertbar = 0x09f8, /* U+2502 BOX DRAWINGS LIGHT VERTICAL */ + XK_emspace = 0x0aa1, /* U+2003 EM SPACE */ + XK_enspace = 0x0aa2, /* U+2002 EN SPACE */ + XK_em3space = 0x0aa3, /* U+2004 THREE-PER-EM SPACE */ + XK_em4space = 0x0aa4, /* U+2005 FOUR-PER-EM SPACE */ + XK_digitspace = 0x0aa5, /* U+2007 FIGURE SPACE */ + XK_punctspace = 0x0aa6, /* U+2008 PUNCTUATION SPACE */ + XK_thinspace = 0x0aa7, /* U+2009 THIN SPACE */ + XK_hairspace = 0x0aa8, /* U+200A HAIR SPACE */ + XK_emdash = 0x0aa9, /* U+2014 EM DASH */ + XK_endash = 0x0aaa, /* U+2013 EN DASH */ + XK_signifblank = 0x0aac, /*(U+2423 OPEN BOX)*/ + XK_ellipsis = 0x0aae, /* U+2026 HORIZONTAL ELLIPSIS */ + XK_doubbaselinedot = 0x0aaf, /* U+2025 TWO DOT LEADER */ + XK_onethird = 0x0ab0, /* U+2153 VULGAR FRACTION ONE THIRD */ + XK_twothirds = 0x0ab1, /* U+2154 VULGAR FRACTION TWO THIRDS */ + XK_onefifth = 0x0ab2, /* U+2155 VULGAR FRACTION ONE FIFTH */ + XK_twofifths = 0x0ab3, /* U+2156 VULGAR FRACTION TWO FIFTHS */ + XK_threefifths = 0x0ab4, /* U+2157 VULGAR FRACTION THREE FIFTHS */ + XK_fourfifths = 0x0ab5, /* U+2158 VULGAR FRACTION FOUR FIFTHS */ + XK_onesixth = 0x0ab6, /* U+2159 VULGAR FRACTION ONE SIXTH */ + XK_fivesixths = 0x0ab7, /* U+215A VULGAR FRACTION FIVE SIXTHS */ + XK_careof = 0x0ab8, /* U+2105 CARE OF */ + XK_figdash = 0x0abb, /* U+2012 FIGURE DASH */ + XK_leftanglebracket = 0x0abc, /*(U+27E8 MATHEMATICAL LEFT ANGLE BRACKET)*/ + XK_decimalpoint = 0x0abd, /*(U+002E FULL STOP)*/ + XK_rightanglebracket = 0x0abe, /*(U+27E9 MATHEMATICAL RIGHT ANGLE BRACKET)*/ + XK_marker = 0x0abf, + XK_oneeighth = 0x0ac3, /* U+215B VULGAR FRACTION ONE EIGHTH */ + XK_threeeighths = 0x0ac4, /* U+215C VULGAR FRACTION THREE EIGHTHS */ + XK_fiveeighths = 0x0ac5, /* U+215D VULGAR FRACTION FIVE EIGHTHS */ + XK_seveneighths = 0x0ac6, /* U+215E VULGAR FRACTION SEVEN EIGHTHS */ + XK_trademark = 0x0ac9, /* U+2122 TRADE MARK SIGN */ + XK_signaturemark = 0x0aca, /*(U+2613 SALTIRE)*/ + XK_trademarkincircle = 0x0acb, + XK_leftopentriangle = 0x0acc, /*(U+25C1 WHITE LEFT-POINTING TRIANGLE)*/ + XK_rightopentriangle = 0x0acd, /*(U+25B7 WHITE RIGHT-POINTING TRIANGLE)*/ + XK_emopencircle = 0x0ace, /*(U+25CB WHITE CIRCLE)*/ + XK_emopenrectangle = 0x0acf, /*(U+25AF WHITE VERTICAL RECTANGLE)*/ + XK_leftsinglequotemark = 0x0ad0, /* U+2018 LEFT SINGLE QUOTATION MARK */ + XK_rightsinglequotemark = 0x0ad1, /* U+2019 RIGHT SINGLE QUOTATION MARK */ + XK_leftdoublequotemark = 0x0ad2, /* U+201C LEFT DOUBLE QUOTATION MARK */ + XK_rightdoublequotemark = 0x0ad3, /* U+201D RIGHT DOUBLE QUOTATION MARK */ + XK_prescription = 0x0ad4, /* U+211E PRESCRIPTION TAKE */ + XK_minutes = 0x0ad6, /* U+2032 PRIME */ + XK_seconds = 0x0ad7, /* U+2033 DOUBLE PRIME */ + XK_latincross = 0x0ad9, /* U+271D LATIN CROSS */ + XK_hexagram = 0x0ada, + XK_filledrectbullet = 0x0adb, /*(U+25AC BLACK RECTANGLE)*/ + XK_filledlefttribullet = 0x0adc, /*(U+25C0 BLACK LEFT-POINTING TRIANGLE)*/ + XK_filledrighttribullet = 0x0add, /*(U+25B6 BLACK RIGHT-POINTING TRIANGLE)*/ + XK_emfilledcircle = 0x0ade, /*(U+25CF BLACK CIRCLE)*/ + XK_emfilledrect = 0x0adf, /*(U+25AE BLACK VERTICAL RECTANGLE)*/ + XK_enopencircbullet = 0x0ae0, /*(U+25E6 WHITE BULLET)*/ + XK_enopensquarebullet = 0x0ae1, /*(U+25AB WHITE SMALL SQUARE)*/ + XK_openrectbullet = 0x0ae2, /*(U+25AD WHITE RECTANGLE)*/ + XK_opentribulletup = 0x0ae3, /*(U+25B3 WHITE UP-POINTING TRIANGLE)*/ + XK_opentribulletdown = 0x0ae4, /*(U+25BD WHITE DOWN-POINTING TRIANGLE)*/ + XK_openstar = 0x0ae5, /*(U+2606 WHITE STAR)*/ + XK_enfilledcircbullet = 0x0ae6, /*(U+2022 BULLET)*/ + XK_enfilledsqbullet = 0x0ae7, /*(U+25AA BLACK SMALL SQUARE)*/ + XK_filledtribulletup = 0x0ae8, /*(U+25B2 BLACK UP-POINTING TRIANGLE)*/ + XK_filledtribulletdown = 0x0ae9, /*(U+25BC BLACK DOWN-POINTING TRIANGLE)*/ + XK_leftpointer = 0x0aea, /*(U+261C WHITE LEFT POINTING INDEX)*/ + XK_rightpointer = 0x0aeb, /*(U+261E WHITE RIGHT POINTING INDEX)*/ + XK_club = 0x0aec, /* U+2663 BLACK CLUB SUIT */ + XK_diamond = 0x0aed, /* U+2666 BLACK DIAMOND SUIT */ + XK_heart = 0x0aee, /* U+2665 BLACK HEART SUIT */ + XK_maltesecross = 0x0af0, /* U+2720 MALTESE CROSS */ + XK_dagger = 0x0af1, /* U+2020 DAGGER */ + XK_doubledagger = 0x0af2, /* U+2021 DOUBLE DAGGER */ + XK_checkmark = 0x0af3, /* U+2713 CHECK MARK */ + XK_ballotcross = 0x0af4, /* U+2717 BALLOT X */ + XK_musicalsharp = 0x0af5, /* U+266F MUSIC SHARP SIGN */ + XK_musicalflat = 0x0af6, /* U+266D MUSIC FLAT SIGN */ + XK_malesymbol = 0x0af7, /* U+2642 MALE SIGN */ + XK_femalesymbol = 0x0af8, /* U+2640 FEMALE SIGN */ + XK_telephone = 0x0af9, /* U+260E BLACK TELEPHONE */ + XK_telephonerecorder = 0x0afa, /* U+2315 TELEPHONE RECORDER */ + XK_phonographcopyright = 0x0afb, /* U+2117 SOUND RECORDING COPYRIGHT */ + XK_caret = 0x0afc, /* U+2038 CARET */ + XK_singlelowquotemark = 0x0afd, /* U+201A SINGLE LOW-9 QUOTATION MARK */ + XK_doublelowquotemark = 0x0afe, /* U+201E DOUBLE LOW-9 QUOTATION MARK */ + XK_cursor = 0x0aff, + XK_leftcaret = 0x0ba3, /*(U+003C LESS-THAN SIGN)*/ + XK_rightcaret = 0x0ba6, /*(U+003E GREATER-THAN SIGN)*/ + XK_downcaret = 0x0ba8, /*(U+2228 LOGICAL OR)*/ + XK_upcaret = 0x0ba9, /*(U+2227 LOGICAL AND)*/ + XK_overbar = 0x0bc0, /*(U+00AF MACRON)*/ + XK_downtack = 0x0bc2, /* U+22A5 UP TACK */ + XK_upshoe = 0x0bc3, /*(U+2229 INTERSECTION)*/ + XK_downstile = 0x0bc4, /* U+230A LEFT FLOOR */ + XK_underbar = 0x0bc6, /*(U+005F LOW LINE)*/ + XK_jot = 0x0bca, /* U+2218 RING OPERATOR */ + XK_quad = 0x0bcc, /* U+2395 APL FUNCTIONAL SYMBOL QUAD */ + XK_uptack = 0x0bce, /* U+22A4 DOWN TACK */ + XK_circle = 0x0bcf, /* U+25CB WHITE CIRCLE */ + XK_upstile = 0x0bd3, /* U+2308 LEFT CEILING */ + XK_downshoe = 0x0bd6, /*(U+222A UNION)*/ + XK_rightshoe = 0x0bd8, /*(U+2283 SUPERSET OF)*/ + XK_leftshoe = 0x0bda, /*(U+2282 SUBSET OF)*/ + XK_lefttack = 0x0bdc, /* U+22A2 RIGHT TACK */ + XK_righttack = 0x0bfc, /* U+22A3 LEFT TACK */ + XK_hebrew_doublelowline = 0x0cdf, /* U+2017 DOUBLE LOW LINE */ + XK_hebrew_aleph = 0x0ce0, /* U+05D0 HEBREW LETTER ALEF */ + XK_hebrew_bet = 0x0ce1, /* U+05D1 HEBREW LETTER BET */ + XK_hebrew_beth = 0x0ce1, /* deprecated */ + XK_hebrew_gimel = 0x0ce2, /* U+05D2 HEBREW LETTER GIMEL */ + XK_hebrew_gimmel = 0x0ce2, /* deprecated */ + XK_hebrew_dalet = 0x0ce3, /* U+05D3 HEBREW LETTER DALET */ + XK_hebrew_daleth = 0x0ce3, /* deprecated */ + XK_hebrew_he = 0x0ce4, /* U+05D4 HEBREW LETTER HE */ + XK_hebrew_waw = 0x0ce5, /* U+05D5 HEBREW LETTER VAV */ + XK_hebrew_zain = 0x0ce6, /* U+05D6 HEBREW LETTER ZAYIN */ + XK_hebrew_zayin = 0x0ce6, /* deprecated */ + XK_hebrew_chet = 0x0ce7, /* U+05D7 HEBREW LETTER HET */ + XK_hebrew_het = 0x0ce7, /* deprecated */ + XK_hebrew_tet = 0x0ce8, /* U+05D8 HEBREW LETTER TET */ + XK_hebrew_teth = 0x0ce8, /* deprecated */ + XK_hebrew_yod = 0x0ce9, /* U+05D9 HEBREW LETTER YOD */ + XK_hebrew_finalkaph = 0x0cea, /* U+05DA HEBREW LETTER FINAL KAF */ + XK_hebrew_kaph = 0x0ceb, /* U+05DB HEBREW LETTER KAF */ + XK_hebrew_lamed = 0x0cec, /* U+05DC HEBREW LETTER LAMED */ + XK_hebrew_finalmem = 0x0ced, /* U+05DD HEBREW LETTER FINAL MEM */ + XK_hebrew_mem = 0x0cee, /* U+05DE HEBREW LETTER MEM */ + XK_hebrew_finalnun = 0x0cef, /* U+05DF HEBREW LETTER FINAL NUN */ + XK_hebrew_nun = 0x0cf0, /* U+05E0 HEBREW LETTER NUN */ + XK_hebrew_samech = 0x0cf1, /* U+05E1 HEBREW LETTER SAMEKH */ + XK_hebrew_samekh = 0x0cf1, /* deprecated */ + XK_hebrew_ayin = 0x0cf2, /* U+05E2 HEBREW LETTER AYIN */ + XK_hebrew_finalpe = 0x0cf3, /* U+05E3 HEBREW LETTER FINAL PE */ + XK_hebrew_pe = 0x0cf4, /* U+05E4 HEBREW LETTER PE */ + XK_hebrew_finalzade = 0x0cf5, /* U+05E5 HEBREW LETTER FINAL TSADI */ + XK_hebrew_finalzadi = 0x0cf5, /* deprecated */ + XK_hebrew_zade = 0x0cf6, /* U+05E6 HEBREW LETTER TSADI */ + XK_hebrew_zadi = 0x0cf6, /* deprecated */ + XK_hebrew_qoph = 0x0cf7, /* U+05E7 HEBREW LETTER QOF */ + XK_hebrew_kuf = 0x0cf7, /* deprecated */ + XK_hebrew_resh = 0x0cf8, /* U+05E8 HEBREW LETTER RESH */ + XK_hebrew_shin = 0x0cf9, /* U+05E9 HEBREW LETTER SHIN */ + XK_hebrew_taw = 0x0cfa, /* U+05EA HEBREW LETTER TAV */ + XK_hebrew_taf = 0x0cfa, /* deprecated */ + XK_Hebrew_switch = 0xff7e, /* Alias for mode_switch */ + XK_Thai_kokai = 0x0da1, /* U+0E01 THAI CHARACTER KO KAI */ + XK_Thai_khokhai = 0x0da2, /* U+0E02 THAI CHARACTER KHO KHAI */ + XK_Thai_khokhuat = 0x0da3, /* U+0E03 THAI CHARACTER KHO KHUAT */ + XK_Thai_khokhwai = 0x0da4, /* U+0E04 THAI CHARACTER KHO KHWAI */ + XK_Thai_khokhon = 0x0da5, /* U+0E05 THAI CHARACTER KHO KHON */ + XK_Thai_khorakhang = 0x0da6, /* U+0E06 THAI CHARACTER KHO RAKHANG */ + XK_Thai_ngongu = 0x0da7, /* U+0E07 THAI CHARACTER NGO NGU */ + XK_Thai_chochan = 0x0da8, /* U+0E08 THAI CHARACTER CHO CHAN */ + XK_Thai_choching = 0x0da9, /* U+0E09 THAI CHARACTER CHO CHING */ + XK_Thai_chochang = 0x0daa, /* U+0E0A THAI CHARACTER CHO CHANG */ + XK_Thai_soso = 0x0dab, /* U+0E0B THAI CHARACTER SO SO */ + XK_Thai_chochoe = 0x0dac, /* U+0E0C THAI CHARACTER CHO CHOE */ + XK_Thai_yoying = 0x0dad, /* U+0E0D THAI CHARACTER YO YING */ + XK_Thai_dochada = 0x0dae, /* U+0E0E THAI CHARACTER DO CHADA */ + XK_Thai_topatak = 0x0daf, /* U+0E0F THAI CHARACTER TO PATAK */ + XK_Thai_thothan = 0x0db0, /* U+0E10 THAI CHARACTER THO THAN */ + XK_Thai_thonangmontho = 0x0db1, /* U+0E11 THAI CHARACTER THO NANGMONTHO */ + XK_Thai_thophuthao = 0x0db2, /* U+0E12 THAI CHARACTER THO PHUTHAO */ + XK_Thai_nonen = 0x0db3, /* U+0E13 THAI CHARACTER NO NEN */ + XK_Thai_dodek = 0x0db4, /* U+0E14 THAI CHARACTER DO DEK */ + XK_Thai_totao = 0x0db5, /* U+0E15 THAI CHARACTER TO TAO */ + XK_Thai_thothung = 0x0db6, /* U+0E16 THAI CHARACTER THO THUNG */ + XK_Thai_thothahan = 0x0db7, /* U+0E17 THAI CHARACTER THO THAHAN */ + XK_Thai_thothong = 0x0db8, /* U+0E18 THAI CHARACTER THO THONG */ + XK_Thai_nonu = 0x0db9, /* U+0E19 THAI CHARACTER NO NU */ + XK_Thai_bobaimai = 0x0dba, /* U+0E1A THAI CHARACTER BO BAIMAI */ + XK_Thai_popla = 0x0dbb, /* U+0E1B THAI CHARACTER PO PLA */ + XK_Thai_phophung = 0x0dbc, /* U+0E1C THAI CHARACTER PHO PHUNG */ + XK_Thai_fofa = 0x0dbd, /* U+0E1D THAI CHARACTER FO FA */ + XK_Thai_phophan = 0x0dbe, /* U+0E1E THAI CHARACTER PHO PHAN */ + XK_Thai_fofan = 0x0dbf, /* U+0E1F THAI CHARACTER FO FAN */ + XK_Thai_phosamphao = 0x0dc0, /* U+0E20 THAI CHARACTER PHO SAMPHAO */ + XK_Thai_moma = 0x0dc1, /* U+0E21 THAI CHARACTER MO MA */ + XK_Thai_yoyak = 0x0dc2, /* U+0E22 THAI CHARACTER YO YAK */ + XK_Thai_rorua = 0x0dc3, /* U+0E23 THAI CHARACTER RO RUA */ + XK_Thai_ru = 0x0dc4, /* U+0E24 THAI CHARACTER RU */ + XK_Thai_loling = 0x0dc5, /* U+0E25 THAI CHARACTER LO LING */ + XK_Thai_lu = 0x0dc6, /* U+0E26 THAI CHARACTER LU */ + XK_Thai_wowaen = 0x0dc7, /* U+0E27 THAI CHARACTER WO WAEN */ + XK_Thai_sosala = 0x0dc8, /* U+0E28 THAI CHARACTER SO SALA */ + XK_Thai_sorusi = 0x0dc9, /* U+0E29 THAI CHARACTER SO RUSI */ + XK_Thai_sosua = 0x0dca, /* U+0E2A THAI CHARACTER SO SUA */ + XK_Thai_hohip = 0x0dcb, /* U+0E2B THAI CHARACTER HO HIP */ + XK_Thai_lochula = 0x0dcc, /* U+0E2C THAI CHARACTER LO CHULA */ + XK_Thai_oang = 0x0dcd, /* U+0E2D THAI CHARACTER O ANG */ + XK_Thai_honokhuk = 0x0dce, /* U+0E2E THAI CHARACTER HO NOKHUK */ + XK_Thai_paiyannoi = 0x0dcf, /* U+0E2F THAI CHARACTER PAIYANNOI */ + XK_Thai_saraa = 0x0dd0, /* U+0E30 THAI CHARACTER SARA A */ + XK_Thai_maihanakat = 0x0dd1, /* U+0E31 THAI CHARACTER MAI HAN-AKAT */ + XK_Thai_saraaa = 0x0dd2, /* U+0E32 THAI CHARACTER SARA AA */ + XK_Thai_saraam = 0x0dd3, /* U+0E33 THAI CHARACTER SARA AM */ + XK_Thai_sarai = 0x0dd4, /* U+0E34 THAI CHARACTER SARA I */ + XK_Thai_saraii = 0x0dd5, /* U+0E35 THAI CHARACTER SARA II */ + XK_Thai_saraue = 0x0dd6, /* U+0E36 THAI CHARACTER SARA UE */ + XK_Thai_sarauee = 0x0dd7, /* U+0E37 THAI CHARACTER SARA UEE */ + XK_Thai_sarau = 0x0dd8, /* U+0E38 THAI CHARACTER SARA U */ + XK_Thai_sarauu = 0x0dd9, /* U+0E39 THAI CHARACTER SARA UU */ + XK_Thai_phinthu = 0x0dda, /* U+0E3A THAI CHARACTER PHINTHU */ + XK_Thai_maihanakat_maitho = 0x0dde, + XK_Thai_baht = 0x0ddf, /* U+0E3F THAI CURRENCY SYMBOL BAHT */ + XK_Thai_sarae = 0x0de0, /* U+0E40 THAI CHARACTER SARA E */ + XK_Thai_saraae = 0x0de1, /* U+0E41 THAI CHARACTER SARA AE */ + XK_Thai_sarao = 0x0de2, /* U+0E42 THAI CHARACTER SARA O */ + XK_Thai_saraaimaimuan = 0x0de3, /* U+0E43 THAI CHARACTER SARA AI MAIMUAN */ + XK_Thai_saraaimaimalai = 0x0de4, /* U+0E44 THAI CHARACTER SARA AI MAIMALAI */ + XK_Thai_lakkhangyao = 0x0de5, /* U+0E45 THAI CHARACTER LAKKHANGYAO */ + XK_Thai_maiyamok = 0x0de6, /* U+0E46 THAI CHARACTER MAIYAMOK */ + XK_Thai_maitaikhu = 0x0de7, /* U+0E47 THAI CHARACTER MAITAIKHU */ + XK_Thai_maiek = 0x0de8, /* U+0E48 THAI CHARACTER MAI EK */ + XK_Thai_maitho = 0x0de9, /* U+0E49 THAI CHARACTER MAI THO */ + XK_Thai_maitri = 0x0dea, /* U+0E4A THAI CHARACTER MAI TRI */ + XK_Thai_maichattawa = 0x0deb, /* U+0E4B THAI CHARACTER MAI CHATTAWA */ + XK_Thai_thanthakhat = 0x0dec, /* U+0E4C THAI CHARACTER THANTHAKHAT */ + XK_Thai_nikhahit = 0x0ded, /* U+0E4D THAI CHARACTER NIKHAHIT */ + XK_Thai_leksun = 0x0df0, /* U+0E50 THAI DIGIT ZERO */ + XK_Thai_leknung = 0x0df1, /* U+0E51 THAI DIGIT ONE */ + XK_Thai_leksong = 0x0df2, /* U+0E52 THAI DIGIT TWO */ + XK_Thai_leksam = 0x0df3, /* U+0E53 THAI DIGIT THREE */ + XK_Thai_leksi = 0x0df4, /* U+0E54 THAI DIGIT FOUR */ + XK_Thai_lekha = 0x0df5, /* U+0E55 THAI DIGIT FIVE */ + XK_Thai_lekhok = 0x0df6, /* U+0E56 THAI DIGIT SIX */ + XK_Thai_lekchet = 0x0df7, /* U+0E57 THAI DIGIT SEVEN */ + XK_Thai_lekpaet = 0x0df8, /* U+0E58 THAI DIGIT EIGHT */ + XK_Thai_lekkao = 0x0df9, /* U+0E59 THAI DIGIT NINE */ + XK_Hangul = 0xff31, /* Hangul start/stop(toggle) */ + XK_Hangul_Start = 0xff32, /* Hangul start */ + XK_Hangul_End = 0xff33, /* Hangul end, English start */ + XK_Hangul_Hanja = 0xff34, /* Start Hangul->Hanja Conversion */ + XK_Hangul_Jamo = 0xff35, /* Hangul Jamo mode */ + XK_Hangul_Romaja = 0xff36, /* Hangul Romaja mode */ + XK_Hangul_Codeinput = 0xff37, /* Hangul code input mode */ + XK_Hangul_Jeonja = 0xff38, /* Jeonja mode */ + XK_Hangul_Banja = 0xff39, /* Banja mode */ + XK_Hangul_PreHanja = 0xff3a, /* Pre Hanja conversion */ + XK_Hangul_PostHanja = 0xff3b, /* Post Hanja conversion */ + XK_Hangul_SingleCandidate = 0xff3c, /* Single candidate */ + XK_Hangul_MultipleCandidate = 0xff3d, /* Multiple candidate */ + XK_Hangul_PreviousCandidate = 0xff3e, /* Previous candidate */ + XK_Hangul_Special = 0xff3f, /* Special symbols */ + XK_Hangul_switch = 0xff7e, /* Alias for mode_switch */ + XK_Hangul_Kiyeog = 0x0ea1, + XK_Hangul_SsangKiyeog = 0x0ea2, + XK_Hangul_KiyeogSios = 0x0ea3, + XK_Hangul_Nieun = 0x0ea4, + XK_Hangul_NieunJieuj = 0x0ea5, + XK_Hangul_NieunHieuh = 0x0ea6, + XK_Hangul_Dikeud = 0x0ea7, + XK_Hangul_SsangDikeud = 0x0ea8, + XK_Hangul_Rieul = 0x0ea9, + XK_Hangul_RieulKiyeog = 0x0eaa, + XK_Hangul_RieulMieum = 0x0eab, + XK_Hangul_RieulPieub = 0x0eac, + XK_Hangul_RieulSios = 0x0ead, + XK_Hangul_RieulTieut = 0x0eae, + XK_Hangul_RieulPhieuf = 0x0eaf, + XK_Hangul_RieulHieuh = 0x0eb0, + XK_Hangul_Mieum = 0x0eb1, + XK_Hangul_Pieub = 0x0eb2, + XK_Hangul_SsangPieub = 0x0eb3, + XK_Hangul_PieubSios = 0x0eb4, + XK_Hangul_Sios = 0x0eb5, + XK_Hangul_SsangSios = 0x0eb6, + XK_Hangul_Ieung = 0x0eb7, + XK_Hangul_Jieuj = 0x0eb8, + XK_Hangul_SsangJieuj = 0x0eb9, + XK_Hangul_Cieuc = 0x0eba, + XK_Hangul_Khieuq = 0x0ebb, + XK_Hangul_Tieut = 0x0ebc, + XK_Hangul_Phieuf = 0x0ebd, + XK_Hangul_Hieuh = 0x0ebe, + XK_Hangul_A = 0x0ebf, + XK_Hangul_AE = 0x0ec0, + XK_Hangul_YA = 0x0ec1, + XK_Hangul_YAE = 0x0ec2, + XK_Hangul_EO = 0x0ec3, + XK_Hangul_E = 0x0ec4, + XK_Hangul_YEO = 0x0ec5, + XK_Hangul_YE = 0x0ec6, + XK_Hangul_O = 0x0ec7, + XK_Hangul_WA = 0x0ec8, + XK_Hangul_WAE = 0x0ec9, + XK_Hangul_OE = 0x0eca, + XK_Hangul_YO = 0x0ecb, + XK_Hangul_U = 0x0ecc, + XK_Hangul_WEO = 0x0ecd, + XK_Hangul_WE = 0x0ece, + XK_Hangul_WI = 0x0ecf, + XK_Hangul_YU = 0x0ed0, + XK_Hangul_EU = 0x0ed1, + XK_Hangul_YI = 0x0ed2, + XK_Hangul_I = 0x0ed3, + XK_Hangul_J_Kiyeog = 0x0ed4, + XK_Hangul_J_SsangKiyeog = 0x0ed5, + XK_Hangul_J_KiyeogSios = 0x0ed6, + XK_Hangul_J_Nieun = 0x0ed7, + XK_Hangul_J_NieunJieuj = 0x0ed8, + XK_Hangul_J_NieunHieuh = 0x0ed9, + XK_Hangul_J_Dikeud = 0x0eda, + XK_Hangul_J_Rieul = 0x0edb, + XK_Hangul_J_RieulKiyeog = 0x0edc, + XK_Hangul_J_RieulMieum = 0x0edd, + XK_Hangul_J_RieulPieub = 0x0ede, + XK_Hangul_J_RieulSios = 0x0edf, + XK_Hangul_J_RieulTieut = 0x0ee0, + XK_Hangul_J_RieulPhieuf = 0x0ee1, + XK_Hangul_J_RieulHieuh = 0x0ee2, + XK_Hangul_J_Mieum = 0x0ee3, + XK_Hangul_J_Pieub = 0x0ee4, + XK_Hangul_J_PieubSios = 0x0ee5, + XK_Hangul_J_Sios = 0x0ee6, + XK_Hangul_J_SsangSios = 0x0ee7, + XK_Hangul_J_Ieung = 0x0ee8, + XK_Hangul_J_Jieuj = 0x0ee9, + XK_Hangul_J_Cieuc = 0x0eea, + XK_Hangul_J_Khieuq = 0x0eeb, + XK_Hangul_J_Tieut = 0x0eec, + XK_Hangul_J_Phieuf = 0x0eed, + XK_Hangul_J_Hieuh = 0x0eee, + XK_Hangul_RieulYeorinHieuh = 0x0eef, + XK_Hangul_SunkyeongeumMieum = 0x0ef0, + XK_Hangul_SunkyeongeumPieub = 0x0ef1, + XK_Hangul_PanSios = 0x0ef2, + XK_Hangul_KkogjiDalrinIeung = 0x0ef3, + XK_Hangul_SunkyeongeumPhieuf = 0x0ef4, + XK_Hangul_YeorinHieuh = 0x0ef5, + XK_Hangul_AraeA = 0x0ef6, + XK_Hangul_AraeAE = 0x0ef7, + XK_Hangul_J_PanSios = 0x0ef8, + XK_Hangul_J_KkogjiDalrinIeung = 0x0ef9, + XK_Hangul_J_YeorinHieuh = 0x0efa, + XK_Korean_Won = 0x0eff, /*(U+20A9 WON SIGN)*/ + XK_Armenian_ligature_ew = 0x1000587, /* U+0587 ARMENIAN SMALL LIGATURE ECH YIWN */ + XK_Armenian_full_stop = 0x1000589, /* U+0589 ARMENIAN FULL STOP */ + XK_Armenian_verjaket = 0x1000589, /* U+0589 ARMENIAN FULL STOP */ + XK_Armenian_separation_mark = 0x100055d, /* U+055D ARMENIAN COMMA */ + XK_Armenian_but = 0x100055d, /* U+055D ARMENIAN COMMA */ + XK_Armenian_hyphen = 0x100058a, /* U+058A ARMENIAN HYPHEN */ + XK_Armenian_yentamna = 0x100058a, /* U+058A ARMENIAN HYPHEN */ + XK_Armenian_exclam = 0x100055c, /* U+055C ARMENIAN EXCLAMATION MARK */ + XK_Armenian_amanak = 0x100055c, /* U+055C ARMENIAN EXCLAMATION MARK */ + XK_Armenian_accent = 0x100055b, /* U+055B ARMENIAN EMPHASIS MARK */ + XK_Armenian_shesht = 0x100055b, /* U+055B ARMENIAN EMPHASIS MARK */ + XK_Armenian_question = 0x100055e, /* U+055E ARMENIAN QUESTION MARK */ + XK_Armenian_paruyk = 0x100055e, /* U+055E ARMENIAN QUESTION MARK */ + XK_Armenian_AYB = 0x1000531, /* U+0531 ARMENIAN CAPITAL LETTER AYB */ + XK_Armenian_ayb = 0x1000561, /* U+0561 ARMENIAN SMALL LETTER AYB */ + XK_Armenian_BEN = 0x1000532, /* U+0532 ARMENIAN CAPITAL LETTER BEN */ + XK_Armenian_ben = 0x1000562, /* U+0562 ARMENIAN SMALL LETTER BEN */ + XK_Armenian_GIM = 0x1000533, /* U+0533 ARMENIAN CAPITAL LETTER GIM */ + XK_Armenian_gim = 0x1000563, /* U+0563 ARMENIAN SMALL LETTER GIM */ + XK_Armenian_DA = 0x1000534, /* U+0534 ARMENIAN CAPITAL LETTER DA */ + XK_Armenian_da = 0x1000564, /* U+0564 ARMENIAN SMALL LETTER DA */ + XK_Armenian_YECH = 0x1000535, /* U+0535 ARMENIAN CAPITAL LETTER ECH */ + XK_Armenian_yech = 0x1000565, /* U+0565 ARMENIAN SMALL LETTER ECH */ + XK_Armenian_ZA = 0x1000536, /* U+0536 ARMENIAN CAPITAL LETTER ZA */ + XK_Armenian_za = 0x1000566, /* U+0566 ARMENIAN SMALL LETTER ZA */ + XK_Armenian_E = 0x1000537, /* U+0537 ARMENIAN CAPITAL LETTER EH */ + XK_Armenian_e = 0x1000567, /* U+0567 ARMENIAN SMALL LETTER EH */ + XK_Armenian_AT = 0x1000538, /* U+0538 ARMENIAN CAPITAL LETTER ET */ + XK_Armenian_at = 0x1000568, /* U+0568 ARMENIAN SMALL LETTER ET */ + XK_Armenian_TO = 0x1000539, /* U+0539 ARMENIAN CAPITAL LETTER TO */ + XK_Armenian_to = 0x1000569, /* U+0569 ARMENIAN SMALL LETTER TO */ + XK_Armenian_ZHE = 0x100053a, /* U+053A ARMENIAN CAPITAL LETTER ZHE */ + XK_Armenian_zhe = 0x100056a, /* U+056A ARMENIAN SMALL LETTER ZHE */ + XK_Armenian_INI = 0x100053b, /* U+053B ARMENIAN CAPITAL LETTER INI */ + XK_Armenian_ini = 0x100056b, /* U+056B ARMENIAN SMALL LETTER INI */ + XK_Armenian_LYUN = 0x100053c, /* U+053C ARMENIAN CAPITAL LETTER LIWN */ + XK_Armenian_lyun = 0x100056c, /* U+056C ARMENIAN SMALL LETTER LIWN */ + XK_Armenian_KHE = 0x100053d, /* U+053D ARMENIAN CAPITAL LETTER XEH */ + XK_Armenian_khe = 0x100056d, /* U+056D ARMENIAN SMALL LETTER XEH */ + XK_Armenian_TSA = 0x100053e, /* U+053E ARMENIAN CAPITAL LETTER CA */ + XK_Armenian_tsa = 0x100056e, /* U+056E ARMENIAN SMALL LETTER CA */ + XK_Armenian_KEN = 0x100053f, /* U+053F ARMENIAN CAPITAL LETTER KEN */ + XK_Armenian_ken = 0x100056f, /* U+056F ARMENIAN SMALL LETTER KEN */ + XK_Armenian_HO = 0x1000540, /* U+0540 ARMENIAN CAPITAL LETTER HO */ + XK_Armenian_ho = 0x1000570, /* U+0570 ARMENIAN SMALL LETTER HO */ + XK_Armenian_DZA = 0x1000541, /* U+0541 ARMENIAN CAPITAL LETTER JA */ + XK_Armenian_dza = 0x1000571, /* U+0571 ARMENIAN SMALL LETTER JA */ + XK_Armenian_GHAT = 0x1000542, /* U+0542 ARMENIAN CAPITAL LETTER GHAD */ + XK_Armenian_ghat = 0x1000572, /* U+0572 ARMENIAN SMALL LETTER GHAD */ + XK_Armenian_TCHE = 0x1000543, /* U+0543 ARMENIAN CAPITAL LETTER CHEH */ + XK_Armenian_tche = 0x1000573, /* U+0573 ARMENIAN SMALL LETTER CHEH */ + XK_Armenian_MEN = 0x1000544, /* U+0544 ARMENIAN CAPITAL LETTER MEN */ + XK_Armenian_men = 0x1000574, /* U+0574 ARMENIAN SMALL LETTER MEN */ + XK_Armenian_HI = 0x1000545, /* U+0545 ARMENIAN CAPITAL LETTER YI */ + XK_Armenian_hi = 0x1000575, /* U+0575 ARMENIAN SMALL LETTER YI */ + XK_Armenian_NU = 0x1000546, /* U+0546 ARMENIAN CAPITAL LETTER NOW */ + XK_Armenian_nu = 0x1000576, /* U+0576 ARMENIAN SMALL LETTER NOW */ + XK_Armenian_SHA = 0x1000547, /* U+0547 ARMENIAN CAPITAL LETTER SHA */ + XK_Armenian_sha = 0x1000577, /* U+0577 ARMENIAN SMALL LETTER SHA */ + XK_Armenian_VO = 0x1000548, /* U+0548 ARMENIAN CAPITAL LETTER VO */ + XK_Armenian_vo = 0x1000578, /* U+0578 ARMENIAN SMALL LETTER VO */ + XK_Armenian_CHA = 0x1000549, /* U+0549 ARMENIAN CAPITAL LETTER CHA */ + XK_Armenian_cha = 0x1000579, /* U+0579 ARMENIAN SMALL LETTER CHA */ + XK_Armenian_PE = 0x100054a, /* U+054A ARMENIAN CAPITAL LETTER PEH */ + XK_Armenian_pe = 0x100057a, /* U+057A ARMENIAN SMALL LETTER PEH */ + XK_Armenian_JE = 0x100054b, /* U+054B ARMENIAN CAPITAL LETTER JHEH */ + XK_Armenian_je = 0x100057b, /* U+057B ARMENIAN SMALL LETTER JHEH */ + XK_Armenian_RA = 0x100054c, /* U+054C ARMENIAN CAPITAL LETTER RA */ + XK_Armenian_ra = 0x100057c, /* U+057C ARMENIAN SMALL LETTER RA */ + XK_Armenian_SE = 0x100054d, /* U+054D ARMENIAN CAPITAL LETTER SEH */ + XK_Armenian_se = 0x100057d, /* U+057D ARMENIAN SMALL LETTER SEH */ + XK_Armenian_VEV = 0x100054e, /* U+054E ARMENIAN CAPITAL LETTER VEW */ + XK_Armenian_vev = 0x100057e, /* U+057E ARMENIAN SMALL LETTER VEW */ + XK_Armenian_TYUN = 0x100054f, /* U+054F ARMENIAN CAPITAL LETTER TIWN */ + XK_Armenian_tyun = 0x100057f, /* U+057F ARMENIAN SMALL LETTER TIWN */ + XK_Armenian_RE = 0x1000550, /* U+0550 ARMENIAN CAPITAL LETTER REH */ + XK_Armenian_re = 0x1000580, /* U+0580 ARMENIAN SMALL LETTER REH */ + XK_Armenian_TSO = 0x1000551, /* U+0551 ARMENIAN CAPITAL LETTER CO */ + XK_Armenian_tso = 0x1000581, /* U+0581 ARMENIAN SMALL LETTER CO */ + XK_Armenian_VYUN = 0x1000552, /* U+0552 ARMENIAN CAPITAL LETTER YIWN */ + XK_Armenian_vyun = 0x1000582, /* U+0582 ARMENIAN SMALL LETTER YIWN */ + XK_Armenian_PYUR = 0x1000553, /* U+0553 ARMENIAN CAPITAL LETTER PIWR */ + XK_Armenian_pyur = 0x1000583, /* U+0583 ARMENIAN SMALL LETTER PIWR */ + XK_Armenian_KE = 0x1000554, /* U+0554 ARMENIAN CAPITAL LETTER KEH */ + XK_Armenian_ke = 0x1000584, /* U+0584 ARMENIAN SMALL LETTER KEH */ + XK_Armenian_O = 0x1000555, /* U+0555 ARMENIAN CAPITAL LETTER OH */ + XK_Armenian_o = 0x1000585, /* U+0585 ARMENIAN SMALL LETTER OH */ + XK_Armenian_FE = 0x1000556, /* U+0556 ARMENIAN CAPITAL LETTER FEH */ + XK_Armenian_fe = 0x1000586, /* U+0586 ARMENIAN SMALL LETTER FEH */ + XK_Armenian_apostrophe = 0x100055a, /* U+055A ARMENIAN APOSTROPHE */ + XK_Georgian_an = 0x10010d0, /* U+10D0 GEORGIAN LETTER AN */ + XK_Georgian_ban = 0x10010d1, /* U+10D1 GEORGIAN LETTER BAN */ + XK_Georgian_gan = 0x10010d2, /* U+10D2 GEORGIAN LETTER GAN */ + XK_Georgian_don = 0x10010d3, /* U+10D3 GEORGIAN LETTER DON */ + XK_Georgian_en = 0x10010d4, /* U+10D4 GEORGIAN LETTER EN */ + XK_Georgian_vin = 0x10010d5, /* U+10D5 GEORGIAN LETTER VIN */ + XK_Georgian_zen = 0x10010d6, /* U+10D6 GEORGIAN LETTER ZEN */ + XK_Georgian_tan = 0x10010d7, /* U+10D7 GEORGIAN LETTER TAN */ + XK_Georgian_in = 0x10010d8, /* U+10D8 GEORGIAN LETTER IN */ + XK_Georgian_kan = 0x10010d9, /* U+10D9 GEORGIAN LETTER KAN */ + XK_Georgian_las = 0x10010da, /* U+10DA GEORGIAN LETTER LAS */ + XK_Georgian_man = 0x10010db, /* U+10DB GEORGIAN LETTER MAN */ + XK_Georgian_nar = 0x10010dc, /* U+10DC GEORGIAN LETTER NAR */ + XK_Georgian_on = 0x10010dd, /* U+10DD GEORGIAN LETTER ON */ + XK_Georgian_par = 0x10010de, /* U+10DE GEORGIAN LETTER PAR */ + XK_Georgian_zhar = 0x10010df, /* U+10DF GEORGIAN LETTER ZHAR */ + XK_Georgian_rae = 0x10010e0, /* U+10E0 GEORGIAN LETTER RAE */ + XK_Georgian_san = 0x10010e1, /* U+10E1 GEORGIAN LETTER SAN */ + XK_Georgian_tar = 0x10010e2, /* U+10E2 GEORGIAN LETTER TAR */ + XK_Georgian_un = 0x10010e3, /* U+10E3 GEORGIAN LETTER UN */ + XK_Georgian_phar = 0x10010e4, /* U+10E4 GEORGIAN LETTER PHAR */ + XK_Georgian_khar = 0x10010e5, /* U+10E5 GEORGIAN LETTER KHAR */ + XK_Georgian_ghan = 0x10010e6, /* U+10E6 GEORGIAN LETTER GHAN */ + XK_Georgian_qar = 0x10010e7, /* U+10E7 GEORGIAN LETTER QAR */ + XK_Georgian_shin = 0x10010e8, /* U+10E8 GEORGIAN LETTER SHIN */ + XK_Georgian_chin = 0x10010e9, /* U+10E9 GEORGIAN LETTER CHIN */ + XK_Georgian_can = 0x10010ea, /* U+10EA GEORGIAN LETTER CAN */ + XK_Georgian_jil = 0x10010eb, /* U+10EB GEORGIAN LETTER JIL */ + XK_Georgian_cil = 0x10010ec, /* U+10EC GEORGIAN LETTER CIL */ + XK_Georgian_char = 0x10010ed, /* U+10ED GEORGIAN LETTER CHAR */ + XK_Georgian_xan = 0x10010ee, /* U+10EE GEORGIAN LETTER XAN */ + XK_Georgian_jhan = 0x10010ef, /* U+10EF GEORGIAN LETTER JHAN */ + XK_Georgian_hae = 0x10010f0, /* U+10F0 GEORGIAN LETTER HAE */ + XK_Georgian_he = 0x10010f1, /* U+10F1 GEORGIAN LETTER HE */ + XK_Georgian_hie = 0x10010f2, /* U+10F2 GEORGIAN LETTER HIE */ + XK_Georgian_we = 0x10010f3, /* U+10F3 GEORGIAN LETTER WE */ + XK_Georgian_har = 0x10010f4, /* U+10F4 GEORGIAN LETTER HAR */ + XK_Georgian_hoe = 0x10010f5, /* U+10F5 GEORGIAN LETTER HOE */ + XK_Georgian_fi = 0x10010f6, /* U+10F6 GEORGIAN LETTER FI */ + XK_Xabovedot = 0x1001e8a, /* U+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE */ + XK_Ibreve = 0x100012c, /* U+012C LATIN CAPITAL LETTER I WITH BREVE */ + XK_Zstroke = 0x10001b5, /* U+01B5 LATIN CAPITAL LETTER Z WITH STROKE */ + XK_Gcaron = 0x10001e6, /* U+01E6 LATIN CAPITAL LETTER G WITH CARON */ + XK_Ocaron = 0x10001d1, /* U+01D2 LATIN CAPITAL LETTER O WITH CARON */ + XK_Obarred = 0x100019f, /* U+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE */ + XK_xabovedot = 0x1001e8b, /* U+1E8B LATIN SMALL LETTER X WITH DOT ABOVE */ + XK_ibreve = 0x100012d, /* U+012D LATIN SMALL LETTER I WITH BREVE */ + XK_zstroke = 0x10001b6, /* U+01B6 LATIN SMALL LETTER Z WITH STROKE */ + XK_gcaron = 0x10001e7, /* U+01E7 LATIN SMALL LETTER G WITH CARON */ + XK_ocaron = 0x10001d2, /* U+01D2 LATIN SMALL LETTER O WITH CARON */ + XK_obarred = 0x1000275, /* U+0275 LATIN SMALL LETTER BARRED O */ + XK_SCHWA = 0x100018f, /* U+018F LATIN CAPITAL LETTER SCHWA */ + XK_schwa = 0x1000259, /* U+0259 LATIN SMALL LETTER SCHWA */ + XK_Lbelowdot = 0x1001e36, /* U+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW */ + XK_lbelowdot = 0x1001e37, /* U+1E37 LATIN SMALL LETTER L WITH DOT BELOW */ + XK_Abelowdot = 0x1001ea0, /* U+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW */ + XK_abelowdot = 0x1001ea1, /* U+1EA1 LATIN SMALL LETTER A WITH DOT BELOW */ + XK_Ahook = 0x1001ea2, /* U+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE */ + XK_ahook = 0x1001ea3, /* U+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE */ + XK_Acircumflexacute = 0x1001ea4, /* U+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */ + XK_acircumflexacute = 0x1001ea5, /* U+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */ + XK_Acircumflexgrave = 0x1001ea6, /* U+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */ + XK_acircumflexgrave = 0x1001ea7, /* U+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */ + XK_Acircumflexhook = 0x1001ea8, /* U+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ + XK_acircumflexhook = 0x1001ea9, /* U+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */ + XK_Acircumflextilde = 0x1001eaa, /* U+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */ + XK_acircumflextilde = 0x1001eab, /* U+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */ + XK_Acircumflexbelowdot = 0x1001eac, /* U+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ + XK_acircumflexbelowdot = 0x1001ead, /* U+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */ + XK_Abreveacute = 0x1001eae, /* U+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */ + XK_abreveacute = 0x1001eaf, /* U+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE */ + XK_Abrevegrave = 0x1001eb0, /* U+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */ + XK_abrevegrave = 0x1001eb1, /* U+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE */ + XK_Abrevehook = 0x1001eb2, /* U+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */ + XK_abrevehook = 0x1001eb3, /* U+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */ + XK_Abrevetilde = 0x1001eb4, /* U+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE */ + XK_abrevetilde = 0x1001eb5, /* U+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE */ + XK_Abrevebelowdot = 0x1001eb6, /* U+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */ + XK_abrevebelowdot = 0x1001eb7, /* U+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */ + XK_Ebelowdot = 0x1001eb8, /* U+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW */ + XK_ebelowdot = 0x1001eb9, /* U+1EB9 LATIN SMALL LETTER E WITH DOT BELOW */ + XK_Ehook = 0x1001eba, /* U+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE */ + XK_ehook = 0x1001ebb, /* U+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE */ + XK_Etilde = 0x1001ebc, /* U+1EBC LATIN CAPITAL LETTER E WITH TILDE */ + XK_etilde = 0x1001ebd, /* U+1EBD LATIN SMALL LETTER E WITH TILDE */ + XK_Ecircumflexacute = 0x1001ebe, /* U+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */ + XK_ecircumflexacute = 0x1001ebf, /* U+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */ + XK_Ecircumflexgrave = 0x1001ec0, /* U+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */ + XK_ecircumflexgrave = 0x1001ec1, /* U+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */ + XK_Ecircumflexhook = 0x1001ec2, /* U+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ + XK_ecircumflexhook = 0x1001ec3, /* U+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */ + XK_Ecircumflextilde = 0x1001ec4, /* U+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */ + XK_ecircumflextilde = 0x1001ec5, /* U+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */ + XK_Ecircumflexbelowdot = 0x1001ec6, /* U+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ + XK_ecircumflexbelowdot = 0x1001ec7, /* U+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */ + XK_Ihook = 0x1001ec8, /* U+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE */ + XK_ihook = 0x1001ec9, /* U+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE */ + XK_Ibelowdot = 0x1001eca, /* U+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW */ + XK_ibelowdot = 0x1001ecb, /* U+1ECB LATIN SMALL LETTER I WITH DOT BELOW */ + XK_Obelowdot = 0x1001ecc, /* U+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW */ + XK_obelowdot = 0x1001ecd, /* U+1ECD LATIN SMALL LETTER O WITH DOT BELOW */ + XK_Ohook = 0x1001ece, /* U+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE */ + XK_ohook = 0x1001ecf, /* U+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE */ + XK_Ocircumflexacute = 0x1001ed0, /* U+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */ + XK_ocircumflexacute = 0x1001ed1, /* U+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */ + XK_Ocircumflexgrave = 0x1001ed2, /* U+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */ + XK_ocircumflexgrave = 0x1001ed3, /* U+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */ + XK_Ocircumflexhook = 0x1001ed4, /* U+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ + XK_ocircumflexhook = 0x1001ed5, /* U+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */ + XK_Ocircumflextilde = 0x1001ed6, /* U+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */ + XK_ocircumflextilde = 0x1001ed7, /* U+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */ + XK_Ocircumflexbelowdot = 0x1001ed8, /* U+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ + XK_ocircumflexbelowdot = 0x1001ed9, /* U+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */ + XK_Ohornacute = 0x1001eda, /* U+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE */ + XK_ohornacute = 0x1001edb, /* U+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE */ + XK_Ohorngrave = 0x1001edc, /* U+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE */ + XK_ohorngrave = 0x1001edd, /* U+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE */ + XK_Ohornhook = 0x1001ede, /* U+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */ + XK_ohornhook = 0x1001edf, /* U+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */ + XK_Ohorntilde = 0x1001ee0, /* U+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE */ + XK_ohorntilde = 0x1001ee1, /* U+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE */ + XK_Ohornbelowdot = 0x1001ee2, /* U+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */ + XK_ohornbelowdot = 0x1001ee3, /* U+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW */ + XK_Ubelowdot = 0x1001ee4, /* U+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW */ + XK_ubelowdot = 0x1001ee5, /* U+1EE5 LATIN SMALL LETTER U WITH DOT BELOW */ + XK_Uhook = 0x1001ee6, /* U+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE */ + XK_uhook = 0x1001ee7, /* U+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE */ + XK_Uhornacute = 0x1001ee8, /* U+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE */ + XK_uhornacute = 0x1001ee9, /* U+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE */ + XK_Uhorngrave = 0x1001eea, /* U+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE */ + XK_uhorngrave = 0x1001eeb, /* U+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE */ + XK_Uhornhook = 0x1001eec, /* U+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */ + XK_uhornhook = 0x1001eed, /* U+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */ + XK_Uhorntilde = 0x1001eee, /* U+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE */ + XK_uhorntilde = 0x1001eef, /* U+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE */ + XK_Uhornbelowdot = 0x1001ef0, /* U+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */ + XK_uhornbelowdot = 0x1001ef1, /* U+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW */ + XK_Ybelowdot = 0x1001ef4, /* U+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW */ + XK_ybelowdot = 0x1001ef5, /* U+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW */ + XK_Yhook = 0x1001ef6, /* U+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE */ + XK_yhook = 0x1001ef7, /* U+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE */ + XK_Ytilde = 0x1001ef8, /* U+1EF8 LATIN CAPITAL LETTER Y WITH TILDE */ + XK_ytilde = 0x1001ef9, /* U+1EF9 LATIN SMALL LETTER Y WITH TILDE */ + XK_Ohorn = 0x10001a0, /* U+01A0 LATIN CAPITAL LETTER O WITH HORN */ + XK_ohorn = 0x10001a1, /* U+01A1 LATIN SMALL LETTER O WITH HORN */ + XK_Uhorn = 0x10001af, /* U+01AF LATIN CAPITAL LETTER U WITH HORN */ + XK_uhorn = 0x10001b0, /* U+01B0 LATIN SMALL LETTER U WITH HORN */ + XK_EcuSign = 0x10020a0, /* U+20A0 EURO-CURRENCY SIGN */ + XK_ColonSign = 0x10020a1, /* U+20A1 COLON SIGN */ + XK_CruzeiroSign = 0x10020a2, /* U+20A2 CRUZEIRO SIGN */ + XK_FFrancSign = 0x10020a3, /* U+20A3 FRENCH FRANC SIGN */ + XK_LiraSign = 0x10020a4, /* U+20A4 LIRA SIGN */ + XK_MillSign = 0x10020a5, /* U+20A5 MILL SIGN */ + XK_NairaSign = 0x10020a6, /* U+20A6 NAIRA SIGN */ + XK_PesetaSign = 0x10020a7, /* U+20A7 PESETA SIGN */ + XK_RupeeSign = 0x10020a8, /* U+20A8 RUPEE SIGN */ + XK_WonSign = 0x10020a9, /* U+20A9 WON SIGN */ + XK_NewSheqelSign = 0x10020aa, /* U+20AA NEW SHEQEL SIGN */ + XK_DongSign = 0x10020ab, /* U+20AB DONG SIGN */ + XK_EuroSign = 0x20ac, /* U+20AC EURO SIGN */ +} + diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin new file mode 100644 index 000000000..811ed31ee --- /dev/null +++ b/vendor/x11/xlib/xlib_procs.odin @@ -0,0 +1,1549 @@ +//+build linux, openbsd, freebsd +package xlib + +foreign import xlib "system:x11" +foreign xlib { + @(link_name="_Xdebug") _Xdebug: i32 +} + +/* ---- X11/Xlib.h ---------------------------------------------------------*/ + +@(default_calling_convention="c") +foreign xlib { + // Free data allocated by Xlib + XFree :: proc(ptr: rawptr) --- + // Opening/closing a display + XOpenDisplay :: proc(display: ^Display, name: cstring) -> ^Display --- + XCloseDisplay :: proc(display: ^Display) --- + XSetCloseDownMode :: proc(display: ^Display, mode: CloseMode) --- + // Generate a no-op request + XNoOp :: proc(display: ^Display) --- + // Display macros (connection) + XConnectionNumber :: proc(display: ^Display) -> i32 --- + XExtendedMaxRequestSize :: + proc(display: ^Display) -> int --- + XMaxRequestSize :: proc(display: ^Display) -> int --- + XLastKnownRequestProcessed :: + proc(display: ^Display) -> uint --- + XNextRequest :: proc(display: ^Display) -> uint --- + XProtocolVersion :: proc(display: ^Display) -> i32 --- + XProtocolRevision :: proc(display: ^Display) -> i32 --- + XQLength :: proc(display: ^Display) -> i32 --- + XServerVendor :: proc(display: ^Display) -> cstring --- + XVendorRelease :: proc(display: ^Display) -> i32 --- + // Display macros (display properties) + XBlackPixel :: proc(display: ^Display, screen_no: i32) -> uint --- + XWhitePixel :: proc(display: ^Display, screen_no: i32) -> uint --- + XListDepths :: proc(display: ^Display, screen_no: i32, count: ^i32) -> [^]i32 --- + XDisplayCells :: proc(display: ^Display, screen_no: i32) -> i32 --- + XDisplayPlanes :: proc(display: ^Display, screen_no: i32) -> i32 --- + XScreenOfDisplay :: proc(display: ^Display, screen_no: i32) -> ^Screen --- + XDisplayString :: proc(display: ^Display) -> cstring --- + // Display macros (defaults) + XDefaultColormap :: proc(display: ^Display, screen_no: i32) -> Colormap --- + XDefaultDepth :: proc(display: ^Display) -> i32 --- + XDefaultGC :: proc(display: ^Display, screen_no: i32) -> GC --- + XDefaultRootWindow :: proc(display: ^Display) -> Window --- + XDefaultScreen :: proc(display: ^Display) -> ^Screen --- + XDefaultVisual :: proc(display: ^Display, screen_no: i32) -> ^Visual --- + XDefaultScreenOfDisplay :: + proc(display: ^Display) -> ^Screen --- + // Display macros (other) + XRootWindow :: proc(display: ^Display, screen_no: i32) -> Window --- + XScreenCount :: proc(display: ^Display) -> i32 --- + // Display image format macros + XListPixmapFormats :: proc(display: ^Display, count: ^i32) -> [^]XPixmapFormatValues --- + XImageByteOrder :: proc(display: ^Display) -> ByteOrder --- + XBitmapUnit :: proc(display: ^Display) -> i32 --- + XBitmapBitOrder :: proc(display: ^Display) -> ByteOrder --- + XBitmapPad :: proc(display: ^Display) -> i32 --- + XDisplayHeight :: proc(display: ^Display, screen_no: i32) -> i32 --- + XDisplayHeightMM :: proc(display: ^Display, screen_no: i32) -> i32 --- + XDisplayWidth :: proc(display: ^Display, screen_no: i32) -> i32 --- + XDisplayWidthMM :: proc(display: ^Display, screen_no: i32) -> i32 --- + // Screen macros + XBlackPixelsOfScreen :: proc(screen: ^Screen) -> uint --- + XWhitePixelsOfScreen :: proc(screen: ^Screen) -> uint --- + XCellsOfScreen :: proc(screen: ^Screen) -> i32 --- + XDefaultColormapOfScreen :: proc(screen: ^Screen) -> Colormap --- + XDefaultDepthOfScreen :: proc(screen: ^Screen) -> i32 --- + XDefaultGCOfScreen :: proc(screen: ^Screen) -> GC --- + XDefaultVisualOfScreen :: proc(screen: ^Screen) -> ^Visual --- + XDoesBackingStore :: proc(screen: ^Screen) -> BackingStore --- + XDoesSaveUnders :: proc(screen: ^Screen) -> b32 --- + XDisplayOfScreen :: proc(screen: ^Screen) -> ^Display --- + XScreenNumberOfScreens :: proc(screen: ^Screen) -> i32 --- + XEventMaskOfScreen :: proc(screen: ^Screen) -> EventMask --- + XWidthOfScreen :: proc(screen: ^Screen) -> i32 --- + XHeightOfScreen :: proc(screen: ^Screen) -> i32 --- + XWidthMMOfScreen :: proc(screen: ^Screen) -> i32 --- + XHeightMMOfScreen :: proc(screen: ^Screen) -> i32 --- + XMaxCmapsOfScreen :: proc(screen: ^Screen) -> i32 --- + XMinCmapsOfScreen :: proc(screen: ^Screen) -> i32 --- + XPlanesOfScreen :: proc(screen: ^Screen) -> i32 --- + XRootWindowOfScreen :: proc(screen: ^Screen) -> Window --- + // Threading functions + XInitThreads :: proc() -> Status --- + XLockDisplay :: proc(display: ^Display) --- + XUnlockDisplay :: proc(display: ^Display) --- + // Internal connections + XAddConnectionWatch :: proc( + display: ^Display, + procedure: XConnectionWatchProc, + data: rawptr + ) -> Status --- + XRemoveConnectionWatch :: proc( + display: ^Display, + procedure: XConnectionWatchProc, + data: rawptr + ) -> Status --- + XProcessInternalConnections :: proc( + display: ^Display, + fd: i32 + ) --- + XInternalConnectionNumbers :: proc( + display: ^Display, + fds: ^[^]i32, + count: ^i32 + ) -> Status --- + // Windows functions + XVisualIDFromVisual :: proc(visual: ^Visual) -> VisualID --- + // Windows: creation/destruction + XCreateWindow :: proc( + display: ^Display, + parent: Window, + x: i32, + y: i32, + width: u32, + height: u32, + bordersz: u32, + depth: i32, + class: WindowClass, + visual: ^Visual, + attr_mask: WindowAttributeMask, + attr: ^XSetWindowAttributes + ) -> Window --- + XCreateSimpleWindow :: proc( + display: ^Display, + parent: Window, + x: i32, + y: i32, + width: u32, + height: u32, + bordersz: u32, + border: int, + bg: int + ) -> Window --- + XDestroyWindow :: proc(display: ^Display, window: Window) --- + XDestroySubwindows :: proc(display: ^Display, window: Window) --- + // Windows: mapping/unmapping + XMapWindow :: proc(display: ^Display, window: Window) --- + XMapRaised :: proc(display: ^Display, window: Window) --- + XMapSubwindows :: proc(display: ^Display, window: Window) --- + XUnmapWindow :: proc(display: ^Display, window: Window) --- + XUnmapSubwindows :: proc(display: ^Display, window: Window) --- + // Windows: configuring + XConfigureWindow :: proc( + display: ^Display, + window: Window, + mask: WindowChangesMask, + values: XWindowChanges + ) --- + XMoveWindow :: proc( + display: ^Display, + window: Window, + x: i32, + y: i32 + ) --- + XResizeWindow :: proc( + display: ^Display, + window: Window, + width: u32, + height: u32 + ) --- + XMoveResizeWindow :: proc( + display: ^Display, + window: Window, + x: i32, + y: i32, + width: u32, + height: u32 + ) --- + XSetWindowBorderWidth :: proc( + display: ^Display, + window: Window, + width: u32 + ) --- + // Window: changing stacking order + XRaiseWindow :: proc(display: ^Display, window: Window) --- + XLowerWindow :: proc(display: ^Display, window: Window) --- + XCirculateSubwindows :: proc(display: ^Display, window: Window, direction: CirculationDirection) --- + XCirculateSubwindowsUp :: proc(display: ^Display, window: Window) --- + XCirculateSubwindowsDown :: proc(display: ^Display, window: Window) --- + XRestackWindows :: proc(display: ^Display, windows: [^]Window, nwindows: i32) --- + // Window: changing attributes + XChangeWindowAttributes :: proc( + display: ^Display, + window: Window, + attr_mask: WindowAttributeMask, + attr: XWindowAttributes + ) --- + XSetWindowBackground :: proc( + display: ^Display, + window: Window, + pixel: uint + ) --- + XSetWindowBackgroundMap :: proc( + display: ^Display, + window: Window, + pixmap: Pixmap + ) --- + XSetWindowColormap :: proc( + display: ^Display, + window: Window, + colormap: Colormap + ) --- + XDefineCursor :: proc( + display: ^Display, + window: Window, + cursor: Cursor + ) --- + XUndefineCursor :: proc( + display: ^Display, + window: Window + ) --- + // Windows: querying information + XQueryTree :: proc( + display: ^Display, + window: Window, + root: ^Window, + parent: ^Window, + children: ^[^]Window, + nchildren: ^u32 + ) -> Status --- + XGetWindowAttributes :: proc( + display: ^Display, + window: Window, + attr: XWindowAttributes + ) --- + XGetGeometry :: proc( + display: ^Display, + drawable: Drawable, + root: ^Window, + x: ^i32, + y: ^i32, + width: ^u32, + height: ^u32, + border_sz: ^u32, + depth: ^u32 + ) -> Status --- + // Windows: translating screen coordinates + XTranslateCoordinates :: proc( + display: ^Display, + src_window: Window, + dst_window: Window, + src_x: i32, + src_y: i32, + dst_x: ^i32, + dst_y: ^i32 + ) -> b32 --- + XQueryPointer :: proc( + display: ^Display, + window: Window, + root: ^Window, + root_x: ^i32, + root_y: ^i32, + x: ^i32, + y: ^i32, + mask: ^KeyMask + ) -> b32 --- + // Atoms + XInternAtom :: proc( + display: ^Display, + name: cstring, + existing: b32 + ) -> Atom --- + XInternAtoms :: proc( + display: ^Display, + names: [^]cstring, + count: i32, + atoms: [^]Atom + ) -> Status --- + XGetAtomName :: proc( + display: ^Display, + atom: Atom + ) -> cstring --- + XGetAtomNames :: proc( + display: ^Display, + atoms: [^]Atom, + count: i32, + names: [^]cstring + ) -> Status --- + // Windows: Obtaining and changing properties + XGetWindowProperty :: proc( + display: ^Display, + window: Window, + property: Atom, + long_offs: int, + long_len: int, + delete: b32, + req_type: Atom, + act_type: [^]Atom, + act_format: [^]i32, + nitems: [^]uint, + bytes_after: [^]uint, + props: ^rawptr + ) -> i32 --- + XListProperties :: proc( + display: ^Display, + window: Window, + num: ^i32 + ) -> [^]Atom --- + XChangeProperty :: proc( + display: ^Display, + window: Window, + property: Atom, + type: Atom, + format: i32, + mode: i32, + data: rawptr, + count: i32 + ) --- + XRotateWindowProperties :: proc( + display: ^Display, + window: Window, + props: [^]Atom, + nprops: i32, + npos: i32 + ) --- + XDeleteProperty :: proc( + display: ^Display, + window: Window, + prop: Atom + ) --- + // Selections + XSetSelectionOwner :: proc( + display: ^Display, + selection: Atom, + owber: Window, + time: Time + ) --- + XGetSelectionOwner :: proc( + display: ^Display, + selection: Atom + ) -> Window --- + XConvertSelection :: proc( + display: ^Display, + selection: Atom, + target: Atom, + property: Atom, + requestor: Window, + time: Time + ) --- + // Creating and freeing pixmaps + XCreatePixmap :: proc( + display: ^Display, + drawable: Drawable, + width: u32, + height: u32, + depth: u32 + ) -> Pixmap --- + XFreePixmap :: proc( + display: ^Display, + pixmap: Pixmap + ) --- + // Creating recoloring and freeing cursors + XCreateFontCursor :: proc( + display: ^Display, + shape: CursorShape + ) -> Cursor --- + XCreateGlyphCursor :: proc( + display: ^Display, + src_font: Font, + mask_font: Font, + src_char: u32, + mask_char: u32, + fg: ^XColor, + bg: ^XColor + ) -> Cursor --- + XCreatePixmapCursor :: proc( + display: ^Display, + source: Pixmap, + mask: Pixmap, + fg: XColor, + bg: ^XColor, + x: u32, + y: u32 + ) -> Cursor --- + XQueryBestCursor :: proc( + display: ^Display, + drawable: Drawable, + width: u32, + height: u32, + out_width: ^u32, + out_height: ^u32 + ) -> Status --- + XRecolorCursor :: proc( + display: ^Display, + cursor: Cursor, + fg: ^XColor, + bg: ^XColor + ) --- + XFreeCursor :: proc(display: ^Display, cursor: Cursor) --- + // Creation/destruction of colormaps + XCreateColormap :: proc( + display: ^Display, + window: Window, + visual: Visual, + alloc: ColormapAlloc + ) -> Colormap --- + XCopyColormapAndFree :: proc( + display: ^Display, + colormap: Colormap + ) -> Colormap --- + XFreeColormap :: proc( + display: ^Display, + colormap: Colormap + ) --- + // Mapping color names to values + XLookupColor :: proc( + display: ^Display, + colomap: Colormap, + name: cstring, + exact: ^XColor, + screen: ^XColor + ) -> Status --- + XcmsLookupColor :: proc( + display: ^Display, + colormap: Colormap, + name: cstring, + exact: XcmsColor, + screen: XcmsColor, + format: XcmsColorFormat + ) -> Status --- + // Allocating and freeing color cells + XAllocColor :: proc( + display: ^Display, + colormap: Colormap, + screen: ^XColor + ) -> Status --- + XcmsAllocColor :: proc( + display: ^Display, + colormap: Colormap, + color: ^XcmsColor, + format: XcmsColorFormat + ) -> Status --- + XAllocNamedColor :: proc( + display: ^Display, + colormap: Colormap, + name: cstring, + screen: ^XColor, + exact: ^XColor + ) -> Status --- + XcmsAllocNamedColor :: proc( + display: ^Display, + colormap: Colormap, + name: cstring, + screen: ^XcmsColor, + exact: ^XcmsColor, + format: XcmsColorFormat + ) -> Status --- + XAllocColorCells :: proc( + display: ^Display, + colormap: Colormap, + contig: b32, + pmasks: [^]uint, + np: u32, + pixels: [^]uint, + npixels: u32 + ) -> Status --- + XAllocColorPlanes :: proc( + display: ^Display, + colormap: Colormap, + contig: b32, + pixels: [^]uint, + ncolors: i32, + nreds: i32, + ngreens: i32, + nblues: i32, + rmask: [^]uint, + gmask: [^]uint, + bmask: [^]uint + ) -> Status --- + XFreeColors :: proc( + display: ^Display, + colormap: Colormap, + pixels: [^]uint, + npixels: i32, + planes: uint + ) --- + // Modifying and querying colormap cells + XStoreColor :: proc( + display: ^Display, + colormap: Colormap, + color: ^XColor + ) --- + XStoreColors :: proc( + display: ^Display, + colormap: Colormap, + color: [^]XColor, + ncolors: i32 + ) --- + XcmsStoreColor :: proc( + display: ^Display, + colormap: Colormap, + color: ^XcmsColor + ) -> Status --- + XcmsStoreColors :: proc( + display: ^Display, + colormap: Colormap, + colors: [^]XcmsColor, + ncolors: XcmsColor, + cflags: [^]b32 + ) -> Status --- + XStoreNamedColor :: proc( + display: ^Display, + colormap: Colormap, + name: cstring, + pixel: uint, + flags: ColorFlags + ) --- + XQueryColor :: proc( + display: ^Display, + colormap: Colormap, + color: ^XColor + ) --- + XQueryColors :: proc( + display: ^Display, + colormap: Colormap, + colors: [^]XColor, + ncolors: i32 + ) --- + XcmsQueryColor :: proc( + display: ^Display, + colormap: Colormap, + color: ^XcmsColor, + format: XcmsColorFormat + ) -> Status --- + XcmsQueryColors :: proc( + display: ^Display, + colormap: Colormap, + color: [^]XcmsColor, + ncolors: i32, + format: XcmsColorFormat + ) -> Status --- + // Getting and setting the color conversion context (CCC) of a colormap + XcmsCCCOfColormap :: proc( + display: ^Display, + colormap: Colormap + ) -> XcmsCCC --- + XcmsSetCCCOfColormap :: proc( + display: ^Display, + colormap: Colormap, + ccc: XcmsCCC) -> XcmsCCC --- + XcmsDefaultCCC :: proc(display: ^Display, screen_no: i32) -> XcmsCCC --- + // Color conversion context macros + XcmsDisplayOfCCC :: proc(ccc: XcmsCCC) -> ^Display --- + XcmsVisualOfCCC :: proc(ccc: XcmsCCC) -> ^Visual --- + XcmsScreenNumberOfCCC :: + proc(ccc: XcmsCCC) -> i32 --- + XcmsScreenWhitePointOfCCC :: + proc(ccc: XcmsCCC) -> XcmsColor --- + XcmsClientWhitePointOfCCC :: + proc(ccc: XcmsCCC) -> XcmsColor --- + // Modifying the attributes of color conversion context + XcmsSetWhitePoint :: proc( + ccc: XcmsCCC, + color: ^XcmsColor + ) -> Status --- + XcmsSetCompressionProc :: proc( + ccc: XcmsCCC, + cproc: XcmsCompressionProc, + data: rawptr + ) -> XcmsCompressionProc --- + XcmsSetWhiteAdjustProc :: proc( + ccc: XcmsCCC, + aproc: XcmsWhiteAdjustProc, + data: rawptr + ) -> XcmsWhiteAdjustProc --- + // Creating and freeing the color conversion context + XcmsCreateCCC :: proc( + display: ^Display, + screen_no: i32, + visual: ^Visual, + white_point: ^XcmsColor, + cproc: XcmsCompressionProc, + cdata: rawptr, + aproc: XcmsWhiteAdjustProc, + adata: rawptr + ) -> XcmsCCC --- + XcmsFreeCCC :: proc(ccc: XcmsCCC) --- + // Converting between colorspaces + XcmsConvertColors :: proc( + ccc: XcmsCCC, + colors: [^]XcmsColor, + ncolors: u32, + format: XcmsColorFormat, + cflags: [^]b32 + ) -> Status --- + // Pre-defined gamut compression callbacks + XcmsCIELabClipL :: proc( + ctx: XcmsCCC, + colors: [^]XcmsColor, + ncolors: u32, + index: u32, + flags: [^]b32 + ) -> Status --- + XcmsCIELabClipab :: proc( + ctx: XcmsCCC, + colors: [^]XcmsColor, + ncolors: u32, + index: u32, + flags: [^]b32 + ) -> Status --- + XcmsCIELabClipLab :: proc( + ctx: XcmsCCC, + colors: [^]XcmsColor, + ncolors: u32, + index: u32, + flags: [^]b32 + ) -> Status --- + XcmsCIELuvClipL :: proc( + ctx: XcmsCCC, + colors: [^]XcmsColor, + ncolors: u32, + index: u32, + flags: [^]b32 + ) -> Status --- + XcmsCIELuvClipuv :: proc( + ctx: XcmsCCC, + colors: [^]XcmsColor, + ncolors: u32, + index: u32, + flags: [^]b32 + ) -> Status --- + XcmsCIELuvClipLuv :: proc( + ctx: XcmsCCC, + colors: [^]XcmsColor, + ncolors: u32, + index: u32, + flags: [^]b32 + ) -> Status --- + XcmsTekHVCClipV :: proc( + ctx: XcmsCCC, + colors: [^]XcmsColor, + ncolors: u32, + index: u32, + flags: [^]b32 + ) -> Status --- + XcmsTekHVCClipC :: proc( + ctx: XcmsCCC, + colors: [^]XcmsColor, + ncolors: u32, + index: u32, + flags: [^]b32 + ) -> Status --- + XcmsTekHVCClipVC :: proc( + ctx: XcmsCCC, + colors: [^]XcmsColor, + ncolors: u32, + index: u32, + flags: [^]b32 + ) -> Status --- + // Pre-defined white-point adjustment procedures + XcmsCIELabWhiteShiftColors :: proc( + ctx: XcmsCCC, + initial_white_point: ^XcmsColor, + target_white_point: ^XcmsColor, + target_format: XcmsColorFormat, + colors: [^]XcmsColor, + ncolors: u32, + compression: [^]b32 + ) -> Status --- + XcmsCIELuvWhiteShiftColors :: proc( + ctx: XcmsCCC, + initial_white_point: ^XcmsColor, + target_white_point: ^XcmsColor, + target_format: XcmsColorFormat, + colors: [^]XcmsColor, + ncolors: u32, + compression: [^]b32 + ) -> Status --- + XcmsTekHVCWhiteShiftColors :: proc( + ctx: XcmsCCC, + initial_white_point: ^XcmsColor, + target_white_point: ^XcmsColor, + target_format: XcmsColorFormat, + colors: [^]XcmsColor, + ncolors: u32, + compression: [^]b32 + ) -> Status --- + // Color querying + XcmsQueryBlack :: proc( + ccc: XcmsCCC, + format: XcmsColorFormat, + color: ^XcmsColor + ) -> Status --- + XcmsQueryBlue :: proc( + ccc: XcmsCCC, + format: XcmsColorFormat, + color: ^XcmsColor + ) -> Status --- + XcmsQueryGreen :: proc( + ccc: XcmsCCC, + format: XcmsColorFormat, + color: ^XcmsColor + ) -> Status --- + XcmsQueryRed :: proc( + ccc: XcmsCCC, + format: XcmsColorFormat, + color: ^XcmsColor + ) -> Status --- + XcmsQueryWhite :: proc( + ccc: XcmsCCC, + format: XcmsColorFormat, + color: ^XcmsColor + ) -> Status --- + // CIELab queries + XcmsCIELabQueryMaxC :: proc( + ccc: XcmsCCC, + hue: XcmsFloat, + lstar: XcmsFloat, + color: ^XcmsColor + ) -> Status --- + XcmsCIELabQueryMaxL :: proc( + ccc: XcmsCCC, + hue: XcmsFloat, + chroma: XcmsFloat, + color: ^XcmsColor + ) -> Status --- + XcmsCIELabQueryMaxLC :: proc( + ccc: XcmsCCC, + hue: XcmsFloat, + color: ^XcmsColor + ) -> Status --- + XcmsCIELabQueryMinL :: proc( + ccc: XcmsCCC, + hue: XcmsFloat, + chroma: XcmsFloat, + color: ^XcmsColor + ) -> Status --- + // CIEluv queries + XcmsCIELuvQueryMaxC :: proc( + ccc: XcmsCCC, + hue: XcmsFloat, + lstar: XcmsFloat, + color: ^XcmsColor + ) -> Status --- + XcmsCIELuvQueryMaxL :: proc( + ccc: XcmsCCC, + hue: XcmsFloat, + chroma: XcmsFloat, + color: ^XcmsColor + ) -> Status --- + XcmsCIELuvQueryMaxLC :: proc( + ccc: XcmsCCC, + hue: XcmsFloat, + color: ^XcmsColor + ) -> Status --- + XcmsCIELuvQueryMinL :: proc( + ccc: XcmsCCC, + hue: XcmsFloat, + chroma: XcmsFloat, + color: ^XcmsColor + ) -> Status --- + // TexHVX queries + XcmsTekHVCQueryMaxC :: proc( + ccc: XcmsCCC, + hue: XcmsFloat, + value: XcmsFloat, + color: ^XcmsColor + ) -> Status --- + XcmsTekHVCQueryMaxV :: proc( + ccc: XcmsCCC, + hue: XcmsFloat, + chroma: XcmsFloat, + color: ^XcmsColor + ) -> Status --- + XcmsTekHVCQueryMaxVC :: proc( + ccc: XcmsCCC, + hue: XcmsFloat, + color: ^XcmsColor + ) -> Status --- + XcmsTekHVCQueryMaxVSamples :: proc( + ccc: XcmsCCC, + hue: XcmsFloat, + colors: [^]XcmsColor, + nsamples: u32 + ) -> Status --- + XcmsTekHVCQueryMinV :: proc( + ccc: XcmsCCC, + hue: XcmsFloat, + chroma: XcmsFloat, + color: ^XcmsColor + ) -> Status --- + // Graphics context functions + XCreateGC :: proc( + display: ^Display, + drawable: Drawable, + mask: GCAttributeMask, + attr: ^XGCValues + ) -> GC --- + XCopyGC :: proc( + display: ^Display, + src: GC, + dst: GC, + mask: GCAttributeMask + ) --- + XChangeGC :: proc( + display: ^Display, + gc: GC, + mask: GCAttributeMask, + values: ^XGCValues + ) --- + XGetGCValues :: proc( + display: ^Display, + gc: GC, + mask: GCAttributeMask, + values: ^XGCValues + ) -> Status --- + XFreeGC :: proc(display: ^Display, gc: GC) --- + XGCContextFromGC :: proc(gc: GC) -> GContext --- + XFlushGC :: proc(display: ^Display, gc: GC) --- + // Convenience routines for GC + XSetState :: proc( + display: ^Display, + gc: GC, + fg: uint, + bg: uint, + fn: GCFunction, + pmask: uint + ) --- + XSetForeground :: proc( + display: ^Display, + gc: GC, + fg: uint + ) --- + XSetBackground :: proc( + display: ^Display, + gc: GC, + bg: uint + ) --- + XSetFunction :: proc( + display: ^Display, + gc: GC, + fn: GCFunction + ) --- + XSetPlaneMask :: proc( + display: ^Display, + gc: GC, + pmask: uint + ) --- + XSetLineAttributes :: proc( + display: ^Display, + gc: GC, + width: u32, + line_style: LineStyle, + cap_style: CapStyle, + join_style: JoinStyle + ) --- + XSetDashes :: proc( + display: ^Display, + gc: GC, + dash_offs: i32, + dash_list: [^]i8, + n: i32 + ) --- + XSetFillStyle :: proc( + display: ^Display, + gc: GC, + style: FillStyle + ) --- + XSetFillRule :: proc( + display: ^Display, + gc: GC, + rule: FillRule + ) --- + XQueryBestSize :: proc( + display: ^Display, + class: i32, + which: Drawable, + width: u32, + height: u32, + out_width: ^u32, + out_height: ^u32 + ) -> Status --- + XQueryBestTile :: proc( + display: ^Display, + which: Drawable, + width: u32, + height: u32, + out_width: ^u32, + out_height: ^u32 + ) -> Status --- + XQueryBestStripple :: proc( + display: ^Display, + which: Drawable, + width: u32, + height: u32, + out_width: u32, + out_height: u32 + ) -> Status --- + XSetTile :: proc(display: ^Display, gc: GC, tile: Pixmap) --- + XSetStripple :: proc(display: ^Display, gc: GC, stripple: Pixmap) --- + XSetTSOrigin :: proc(display: ^Display, gc: GC, x: i32, y: i32) --- + XSetFont :: proc(display: ^Display, gc: GC, font: Font) --- + XSetClipOrigin :: proc(display: ^Display, gc: GC, x: i32, y: i32) --- + XSetClipMask :: proc(display: ^Display, gc: GC, pixmap: Pixmap) --- + XSetClipRectangles :: proc( + display: ^Display, + gc: GC, + x: i32, + y: i32, + rects: [^]XRectangle, + n: i32, + ordering: i32 + ) --- + XSetArcMode :: proc(display: ^Display, gc: GC, mode: ArcMode) --- + XSetSubwindowMode :: proc(display: ^Display, gc: GC, mode: SubwindowMode) --- + XSetGraphicsExposures :: proc(display: ^Display, gc: GC, exp: b32) --- + // Graphics functions + XClearArea :: proc( + display: ^Display, + window: Window, + x: i32, + y: i32, + width: u32, + height: u32, + exp: b32 + ) --- + XClearWindow :: proc( + display: ^Display, + window: Window + ) --- + XCopyArea :: proc( + display: ^Display, + src: Drawable, + dst: Drawable, + gc: GC, + src_x: i32, + src_y: i32, + width: u32, + height: u32, + dst_x: i32, + dst_y: i32 + ) --- + XCopyPlane :: proc( + display: ^Display, + src: Drawable, + dst: Drawable, + gc: GC, + src_x: i32, + src_y: i32, + width: u32, + height: u32, + dst_x: i32, + dst_y: i32, + plane: uint + ) --- + // Drawing lines, points, rectangles and arc + XDrawPoint :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + x: i32, + y: i32 + ) --- + XDrawPoints :: proc( + display: Display, + drawable: Drawable, + gc: GC, + point: [^]XPoint, + npoints: i32, + mode: CoordMode + ) --- + XDrawLine :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + x1: i32, + y1: i32, + x2: i32, + y2: i32 + ) --- + XDrawLines :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + points: [^]XPoint, + npoints: i32 + ) --- + XDrawSegments :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + segs: [^]XSegment, + nsegs: i32 + ) --- + XDrawRectangle :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + x: i32, + y: i32, + width: u32, + height: u32 + ) --- + XDrawRectangles :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + rects: [^]XRectangle, + nrects: i32 + ) --- + XDrawArc :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + x: i32, + y: i32, + width: u32, + height: u32, + angle1: i32, + angle2: i32 + ) --- + XDrawArcs :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + arcs: [^]XArc, + narcs: i32 + ) --- + // Filling areas + XFillRectangle :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + x: i32, + y: i32, + width: u32, + height: u32 + ) --- + XFillRectangles :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + rects: [^]XRectangle, + nrects: i32 + ) --- + XFillPolygon :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + points: [^]XPoint, + npoints: i32, + shape: Shape, + mode: CoordMode + ) --- + XFillArc :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + x: i32, + y: i32, + width: u32, + height: u32, + angle1: i32, + angle2: i32 + ) --- + XFillArcs :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + arcs: [^]XArc, + narcs: i32 + ) --- + // Font metrics + XLoadFont :: proc(display: ^Display, name: cstring) -> Font --- + XQueryFont :: proc(display: ^Display, id: XID) -> ^XFontStruct --- + XLoadQueryFont :: proc(display: ^Display, name: cstring) -> ^XFontStruct --- + XFreeFont :: proc(display: ^Display, font_struct: ^XFontStruct) --- + XGetFontProperty :: proc(font_struct: ^XFontStruct, atom: Atom, ret: ^uint) -> b32 --- + XUnloadFont :: proc(display: ^Display, font: Font) --- + XListFonts :: proc(display: ^Display, pat: cstring, max: i32, count: ^i32) -> [^]cstring --- + XFreeFontNames :: proc(display: ^Display, list: [^]cstring) --- + XListFontsWithInfo :: proc( + display: ^Display, + pat: cstring, + max: i32, + count: ^i32, + info: ^[^]XFontStruct + ) -> [^]cstring --- + XFreeFontInfo :: proc(names: [^]cstring, info: [^]XFontStruct, count: i32) --- + // Computing character string sizes + XTextWidth :: proc(font_struct: ^XFontStruct, string: [^]u8, count: i32) -> i32 --- + XTextWidth16 :: proc(font_struct: ^XFontStruct, string: [^]XChar2b, count: i32) -> i32 --- + XTextExtents :: proc( + font_struct: ^XFontStruct, + string: [^]u8, + nchars: i32, + direction: ^FontDirection, + ascent: ^i32, + descent: ^i32, + ret: ^XCharStruct + ) --- + XTextExtents16 :: proc( + font_struct: ^XFontStruct, + string: [^]XChar2b, + nchars: i32, + direction: ^FontDirection, + ascent: ^i32, + descent: ^i32, + ret: ^XCharStruct + ) --- + XQueryTextExtents :: proc( + display: ^Display, + font_id: XID, + string: [^]u8, + nchars: i32, + direction: ^FontDirection, + ascent: ^i32, + descent: ^i32, + ret: ^XCharStruct + ) --- + XQueryTextExtents16 :: proc( + display: ^Display, + font_id: XID, + string: [^]XChar2b, + nchars: i32, + direction: ^FontDirection, + ascent: ^i32, + descent: ^i32, + ret: ^XCharStruct + ) --- + // Drawing complex text + XDrawText :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + x: i32, + y: i32, + items: XTextItem, + nitems: i32 + ) --- + XDrawText16 :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + x: i32, + y: i32, + items: XTextItem16, + nitems: i32 + ) --- + // Drawing text characters + XDrawString :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + x: i32, + y: i32, + string: [^]u8, + length: i32 + ) --- + XDrawString16 :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + x: i32, + y: i32, + string: [^]XChar2b, + length: i32 + ) --- + XDrawImageString :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + x: i32, + y: i32, + string: [^]u8, + length: i32 + ) --- + XDrawImageString16 :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + x: i32, + y: i32, + string: [^]XChar2b, + length: i32 + ) --- + // Transferring images between client and server + XInitImage :: proc(image: ^XImage) -> Status --- + XPutImage :: proc( + display: ^Display, + drawable: Drawable, + gc: GC, + image: XImage, + src_x: i32, + src_y: i32, + dst_x: i32, + dst_y: i32, + width: u32, + height: u32 + ) --- + XGetImage :: proc( + display: ^Display, + drawable: Drawable, + x: i32, + y: i32, + width: u32, + height: u32, + mask: uint, + format: ImageFormat + ) -> ^XImage --- + XGetSubImage :: proc( + display: ^Display, + drawable: Drawable, + src_x: i32, + src_y: i32, + width: u32, + height: u32, + mask: uint, + format: ImageFormat, + dst: ^XImage, + dst_x: i32, + dst_y: i32 + ) -> ^XImage --- + // Window and session manager functions + XReparentWindow :: proc( + display: ^Display, + window: Window, + parent: Window, + x: i32, + y: i32 + ) --- + XChangeSaveSet :: proc( + display: ^Display, + window: Window, + mode: SaveSetChangeMode + ) --- + XAddToSaveSet :: proc( + display: ^Display, + window: Window + ) --- + XRemoveFromSaveSet :: proc( + display: ^Display, + window: Window + ) --- + // Managing installed colormaps + XInstallColormap :: proc(display: ^Display, colormap: Colormap) --- + XUninstallColormap :: proc(display: ^Display, colormap: Colormap) --- + XListInstalledColormaps :: proc(display: ^Display, window: Window, n: ^i32) -> [^]Colormap --- + // Setting and retrieving font search paths + XSetFontPath :: proc(display: ^Display, dirs: [^]cstring, ndirs: i32) --- + XGetFontPath :: proc(display: ^Display, npaths: ^i32) -> [^]cstring --- + XFreeFontPath :: proc(list: [^]cstring) --- + // Grabbing the server + XGrabServer :: proc(display: ^Display) --- + XUngrabServer :: proc(display: ^Display) --- + // Killing clients + XKillClient :: proc(display: ^Display, resource: XID) --- + // Controlling the screen saver + XSetScreenSaver :: proc( + display: ^Display, + timeout: i32, + interval: i32, + blanking: ScreenSaverBlanking, + exposures: ScreenSavingExposures + ) --- + XForceScreenSaver :: proc(display: ^Display, mode: ScreenSaverForceMode) --- + XActivateScreenSaver :: proc(display: ^Display) --- + XResetScreenSaver :: proc(display: ^Display) --- + XGetScreenSaver :: proc( + display: ^Display, + timeout: ^i32, + interval: ^i32, + blanking: ^ScreenSaverBlanking, + exposures: ^ScreenSavingExposures + ) --- + // Controlling host address + XAddHost :: proc(display: ^Display, addr: ^XHostAddress) --- + XAddHosts :: proc(display: ^Display, hosts: [^]XHostAddress, nhosts: i32) --- + XListHosts :: proc(display: ^Display, nhosts: ^i32, state: [^]b32) -> [^]XHostAddress --- + XRemoveHost :: proc(display: ^Display, host: XHostAddress) --- + XRemoveHosts :: proc(display: ^Display, hosts: [^]XHostAddress, nhosts: i32) --- + // Access control list + XSetAccessControl :: proc(display: ^Display, mode: AccessControlMode) --- + XEnableAccessControl :: proc(display: ^Display) --- + XDisableAccessControl :: proc(display: ^Display) --- + // Events + XSelectInput :: proc(display: ^Display, window: Window, mask: EventMask) --- + XFlush :: proc(display: ^Display) --- + XSync :: proc(display: ^Display) --- + XEventsQueued :: proc(display: ^Display, mode: EventQueueMode) -> i32 --- + XPending :: proc(display: ^Display) -> i32 --- + XNextEvent :: proc(display: ^Display, event: ^XEvent) --- + XPeekEvent :: proc(display: ^Display, event: ^XEvent) --- + // Selecting events using a predicate procedure + XIfEvent :: proc( + display: ^Display, + event: ^XEvent, + predicate: #type proc "c" (display: ^Display, event: ^XEvent, ctx: rawptr) -> b32, + ctx: rawptr + ) --- + XCheckIfEvent :: proc( + display: ^Display, + event: ^XEvent, + predicate: #type proc "c" (display: ^Display, event: ^XEvent, ctx: rawptr) -> b32, + arg: rawptr + ) -> b32 --- + XPeekIfEvent :: proc( + display: ^Display, + event: ^XEvent, + predicate: #type proc "c" (display: ^Display, event: ^XEvent, ctx: rawptr) -> b32, + ctx: rawptr + ) --- + // Selecting events using a window or event mask + XWindowEvent :: proc( + display: ^Display, + window: Window, + mask: EventMask, + event: ^XEvent + ) --- + XCheckWindowEvent :: proc( + display: ^Display, + window: Window, + mask: EventMask, + event: ^XEvent + ) -> b32 --- + XMaskEvent :: proc( + display: ^Display, + mask: EventMask, + event: ^XEvent + ) --- + XCheckMaskEvent :: proc( + display: ^Display, + mask: EventMask, + event: ^XEvent + ) -> b32 --- + XCheckTypedEvent :: proc( + display: ^Display, + type: EventType, + event: ^XEvent + ) -> b32 --- + XCheckTypedWindowEvent :: proc( + display: ^Display, + window: Window, + type: EventType, + event: ^XEvent + ) -> b32 --- + // Putting events back + XPutBackEvent :: proc( + display: ^Display, + event: ^XEvent + ) --- + // Sending events to other applications + XSendEvent :: proc( + display: ^Display, + window: Window, + propagate: b32, + mask: EventMask, + event: ^XEvent + ) -> Status --- + // Getting the history of pointer motion + XDisplayMotionBufferSize :: proc(display: ^Display) -> uint --- + XGetMotionEvents :: proc( + display: ^Display, + window: Window, + start: Time, + stop: Time, + nevents: ^i32 + ) -> [^]XTimeCoord --- + // Enabling or disabling synchronization + XSetAfterFunction :: proc( + display: ^Display, + procedure: #type proc "c" (display: ^Display) -> i32 + ) -> i32 --- + XSynchronize :: proc( + display: ^Display, + onoff: b32 + ) -> i32 --- + // Error handling + XSetErrorHandler :: proc( + handler: #type proc "c" (display: ^Display, event: ^XErrorEvent) -> i32 + ) -> i32 --- + XGetErrorText :: proc( + display: ^Display, + code: i32, + buffer: [^]u8, + size: i32 + ) --- + XGetErrorDatabaseText :: proc( + display: ^Display, + name: cstring, + message: cstring, + default_string: cstring, + buffer: [^]u8, + size: i32 + ) --- + XDisplayName :: proc(string: cstring) -> cstring --- + XSetIOErrorHandler :: proc( + handler: #type proc "c" (display: ^Display) -> i32 + ) -> i32 --- + // Pointer grabbing + XGrabPointer :: proc( + display: ^Display, + grab_window: Window, + owner_events: b32, + mask: EventMask, + pointer_mode: GrabMode, + keyboard_mode: GrabMode, + confine_to: Window, + cursor: Cursor, + time: Time + ) -> i32 --- + XUngrabPointer :: proc( + display: ^Display, + time: Time + ) -> i32 --- + XChangeActivePointerGrab :: proc( + display: ^Display, + event_mask: EventMask, + cursor: Cursor, + time: Time + ) --- + XGrabButton :: proc( + display: ^Display, + button: u32, + modifiers: InputMask, + grab_window: Window, + owner_events: b32, + event_mask: EventMask, + pointer_mode: GrabMode, + keyboard_mode: GrabMode, + confine_to: Window, + cursor: Cursor + ) --- + XUngrabButton :: proc( + display: ^Display, + button: u32, + modifiers: InputMask, + grab_window: Window + ) --- + XGrabKeyboard :: proc( + display: ^Display, + grab_window: Window, + owner_events: b32, + pointer_mode: GrabMode, + keyboard_mode: GrabMode, + time: Time + ) -> i32 --- + XUngrabKeyboard :: proc( + display: ^Display, + time: Time + ) --- + XGrabKey :: proc( + display: ^Display, + keycode: i32, + modifiers: InputMask, + grab_window: Window, + owner_events: b32, + pointer_mode: GrabMode, + keyboard_mode: GrabMode + ) --- + XUngrabKey :: proc( + display: ^Display, + keycode: i32, + modifiers: InputMask, + grab_window: Window + ) --- + // Resuming event processing + XAllowEvents :: proc(display: ^Display, evend_mode: AllowEventsMode, time: Time) --- + // Moving the pointer + XWarpPointer :: proc( + display: ^Display, + src_window: Window, + dst_window: Window, + src_x: i32, + src_y: i32, + src_width: u32, + src_height: u32, + dst_x: i32, + dst_y: i32 + ) --- + // Controlling input focus + XSetInputFocus :: proc( + display: ^Display, + focus: Window, + revert_to: FocusRevert, + time: Time + ) --- + XGetInputFocus :: proc( + display: ^Display, + focus: ^Window, + revert_to: ^FocusRevert + ) --- + // Manipulating the keyboard and pointer settings + XChangeKeyboardControl :: proc( + display: ^Display, + mask: KeyboardControlMask, + values: ^XKeyboardControl + ) --- + XGetKeyboardControl :: proc( + display: ^Display, + values: ^XKeyboardState + ) --- + XAutoRepeatOn :: proc(display: ^Display) --- + XAutoRepeatOff :: proc(display: ^Display) --- + XBell :: proc(display: ^Display, percent: i32) --- + XQueryKeymap :: proc(display: ^Display, keys: [^]u32) --- + XSetPointerMapping :: proc(display: ^Display, map_should_not_be_a_keyword: [^]u8, nmap: i32) -> i32 --- + XGetPointerMapping :: proc(display: ^Display, map_should_not_be_a_keyword: [^]u8, nmap: i32) -> i32 --- + XChangePointerControl :: proc( + display: ^Display, + do_accel: b32, + do_threshold: b32, + accel_numerator: i32, + accel_denominator: i32, + threshold: i32 + ) --- + XGetPointerControl :: proc( + display: ^Display, + accel_numerator: ^i32, + accel_denominator: ^i32, + threshold: ^i32 + ) --- + // Manipulating the keyboard encoding + XDisplayKeycodes :: proc( + display: ^Display, + min_keycodes: ^i32, + max_keycodes: ^i32 + ) --- + XGetKeyboardMapping :: proc( + display: ^Display, + first: KeyCode, + count: i32, + keysyms_per: ^i32 + ) -> ^KeySym --- + XChangeKeyboardMapping :: proc( + display: ^Display, + first: KeyCode, + keysyms_per: i32, + keysyms: [^]KeySym, + num_codes: i32 + ) --- + XNewModifiermap :: proc(max_keys_per_mode: i32) -> ^XModifierKeymap --- + XInsertModifiermapEntry :: proc( + modmap: ^XModifierKeymap, + keycode_entry: KeyCode, + modifier: i32 + ) -> ^XModifierKeymap --- + XDeleteModifiermapEntry :: proc( + modmap: ^XModifierKeymap, + keycode_entry: KeyCode, + modifier: i32 + ) -> ^XModifierKeymap --- + XFreeModifiermap :: proc(modmap: ^XModifierKeymap) --- + XSetModifierMapping :: proc(display: ^Display, modmap: ^XModifierKeymap) -> i32 --- + XGetModifierMapping :: proc(display: ^Display) -> ^XModifierKeymap --- +} diff --git a/vendor/x11/xlib/xlib_types.odin b/vendor/x11/xlib/xlib_types.odin new file mode 100644 index 000000000..bb2f16604 --- /dev/null +++ b/vendor/x11/xlib/xlib_types.odin @@ -0,0 +1,1307 @@ +//+build linux, freebsd, openbsd +package xlib + +// Since this is a unix-only library we make a few simplifying assumptions +import "core:c" +#assert(size_of(int) == size_of(c.long)) +#assert(size_of(uint) == size_of(c.ulong)) +#assert(size_of(i32) == size_of(c.int)) +#assert(size_of(u32) == size_of(c.uint)) + +/* ---- X11/X.h ------------------------------------------------------------*/ + +XID :: distinct uint +Mask :: distinct uint +Atom :: distinct uint +VisualID :: distinct uint +Time :: distinct uint + +Window :: XID +Drawable :: XID +Font :: XID +Pixmap :: XID +Cursor :: XID +Colormap :: XID +GContext :: XID + +KeyCode :: u8 + +/* ---- X11/Xlib.h ---------------------------------------------------------*/ + +XExtData :: struct { + number: i32, + next: ^XExtData, + free_private: #type proc "c" (extension: ^XExtData) -> Status, + private_data: rawptr, +} + +XExtCodes :: struct { + extension: i32, + major_opcode: i32, + first_event: i32, + first_error: i32, +} + +XPixmapFormatValues :: struct { + depth: i32, + bits_per_pixel: i32, + scanline_pad: i32, +} + +XGCValues :: struct { + function: GCFunction, + plane_mask: uint, + foreground: uint, + background: uint, + line_width: i32, + line_style: LineStyle, + cap_style: CapStyle, + join_style: JoinStyle, + fill_style: FillStyle, + fill_rule: FillRule, + arc_mode: ArcMode, + tile: Pixmap, + stipple: Pixmap, + ts_x_origin: i32, + ts_y_origin: i32, + font: Font, + subwindow_mode: SubwindowMode, + graphics_exposures: b32, + clip_x_origin: i32, + clip_y_origin: i32, + clip_mask: Pixmap, + dash_offset: i32, + dashes: i8, +} + +GC :: distinct rawptr + +Visual :: struct { + ext_data: ^XExtData, + visualid: VisualID, + class: i32, + red_mask: uint, + green_mask: uint, + blue_mask: uint, + bits_per_rgb: i32, + map_entries: i32, +} + +Depth :: struct { + depth: i32, + nvisuals: i32, + visuals: ^Visual, +} + +XDisplay :: distinct struct {} + +Screen :: struct { + ext_data: ^XExtData, + display: ^XDisplay, + root: Window, + width: i32, + height: i32, + mwidth: i32, + mheight: i32, + ndepths: i32, + depths: ^Depth, + root_depth: i32, + root_visual: ^Visual, + default_gc: GC, + cmap: Colormap, + white_pixel: uint, + black_pixel: uint, + max_maps: i32, + min_maps: i32, + backing_store: i32, + save_unders: i32, + root_input_mask: int, +} + +ScreenFormat :: struct { + ext_data: ^XExtData, + depth: i32, + bits_per_pixel: i32, + scanline_pad: i32, +} + +XSetWindowAttributes :: struct { + background_pixmap: Pixmap, + background_pixel: uint, + border_pixmap: Pixmap, + border_pixel: uint, + bit_gravity: Gravity, + win_gravity: Gravity, + backing_store: BackingStore, + backing_planes: uint, + backing_pixel: uint, + save_under: b32, + event_mask: EventMask, + do_not_propagate_mask: EventMask, + override_redirect: b32, + colormap: Colormap, + cursor: Cursor, +} + +XWindowAttributes :: struct { + x: i32, + y: i32, + width: i32, + height: i32, + border_width: i32, + depth: i32, + visual: ^Visual, + root: Window, + class: WindowClass, + bit_gravity: Gravity, + win_gravity: Gravity, + backing_store: BackingStore, + backing_planes: uint, + backing_pixel: uint, + save_under: b32, + colormap: Colormap, + map_installed: b32, + map_state: WindowMapState, + all_event_masks: EventMask, + your_event_mask: EventMask, + do_not_propagate_mask: EventMask, + override_redirect: b32, + screen: ^Screen, +} + +XHostAddress :: struct { + family: i32, + length: i32, + address: rawptr, +} + +XServerInterpretedAddress :: struct { + typelength: i32, + valuelength: i32, + type: [^]u8, + value: [^]u8, +} + +XImage :: struct { + width: i32, + height: i32, + xoffset: i32, + format: ImageFormat, + data: rawptr, + byte_order: i32, + bitmap_unit: i32, + bitmap_bit_order: ByteOrder, + bitmap_pad: i32, + depth: i32, + bytes_per_line: i32, + bits_per_pixel: i32, + red_mask: uint, + green_mask: uint, + blue_mask: uint, + obdata: rawptr, + f: struct { + create_image: proc "c" ( + display: ^Display, + visual: ^Visual, + depth: u32, + format: i32, + offset: i32, + data: rawptr, + width: u32, + height: u32, + pad: i32, + stride: i32) -> ^XImage, + destroy_image: proc "c" (image: ^XImage) -> i32, + get_pixel: proc "c" (image: ^XImage) -> uint, + put_pixel: proc "c" (image: ^XImage, x: i32, y: i32, pixel: uint) -> i32, + sub_image: proc "c" (image: ^XImage, x: i32, y: i32, w: u32, h: u32) -> ^XImage, + add_pixel: proc "c" (image: ^XImage, val: int) -> i32, + }, +} + +XWindowChanges :: struct { + x: i32, + y: i32, + width: i32, + height: i32, + border_width: i32, + sibling: Window, + stack_mode: WindowStacking, +} + +XColor :: struct { + pixel: uint, + red: u16, + green: u16, + blue: u16, + flags: u8, + pad: u8, +} + +XSegment :: struct { + x1: i16, + y1: i16, + x2: i16, + y2: i16, +} + +XPoint :: struct { + x: i16, + y: i16, +} + +XRectangle :: struct { + x: i16, + y: i16, + width: u16, + height: u16, +} + +XArc :: struct { + x: i16, + y: i16, + width: u16, + height: u16, + angle1: i16, + angle2: i16, +} + +XKeyboardControl :: struct { + key_click_percent: i32, + bell_percent: i32, + bell_pitch: i32, + bell_duration: i32, + led: i32, + led_mode: KeyboardLedMode, + key: i32, + auto_repeat_mode: KeyboardAutoRepeatMode, +} + +XKeyboardState :: struct { + key_click_percent: i32, + bell_percent: i32, + bell_pitch: u32, + bell_duration: u32, + led_mask: uint, + global_auto_repeat: i32, + auto_repeats: [32]u8, +} + +XTimeCoord :: struct { + time: Time, + x: i16, + y: i16, +} + +XModifierKeymap :: struct { + max_keypermod: i32, + modifiermap: ^KeyCode, +} + +Display :: distinct struct {} + +XKeyEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + root: Window, + subwindow: Window, + time: Time, + x: i32, + y: i32, + x_root: i32, + y_root: i32, + state: InputMask, + keycode: u32, + same_screen: b32, +} + +XKeyPressedEvent :: XKeyEvent +XKeyReleasedEvent :: XKeyEvent + +XButtonEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + root: Window, + subwindow: Window, + time: Time, + x: i32, + y: i32, + x_root: i32, + y_root: i32, + state: InputMask, + button: u32, + same_screen: b32, +} + +XButtonPressedEvent :: XButtonEvent +XButtonReleasedEvent :: XButtonEvent + +XMotionEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + root: Window, + subwindow: Window, + time: Time, + x: i32, + y: i32, + x_root: i32, + y_root: i32, + state: InputMask, + is_hint: b8, + same_screen: b32, +} + +XPointerMovedEvent :: XMotionEvent; + +XCrossingEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + root: Window, + subwindow: Window, + time: Time, + x: i32, + y: i32, + x_root: i32, + y_root: i32, + mode: NotifyMode, + detail: NotifyDetail, + same_screen: b32, + focus: i32, + state: InputMask, +} + +XEnterWindowEvent :: XCrossingEvent +XLeaveWindowEvent :: XCrossingEvent + +XFocusChangeEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + mode: NotifyMode, + detail: NotifyDetail, +} + +XFocusInEvent :: XFocusChangeEvent +XFocusOutEvent :: XFocusChangeEvent + +XKeymapEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + key_vector: [32]u8, +} + +XExposeEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + x: i32, + y: i32, + width: i32, + height: i32, + count: i32, +} + +XGraphicsExposeEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + drawable: Drawable, + x: i32, + y: i32, + width: i32, + height: i32, + count: i32, + major_code: i32, + minor_code: i32, +} + +XNoExposeEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + drawable: Drawable, + major_code: i32, + minor_code: i32, +} + +XVisibilityEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + state: VisibilityState, +} + +XCreateWindowEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + parent: Window, + window: Window, + x: i32, + y: i32, + width: i32, + height: i32, + border_width: i32, + override_redirect: b32, +} + +XDestroyWindowEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + event: Window, + window: Window, +} + +XUnmapEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + event: Window, + window: Window, + from_configure: b32, +} + +XMapEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + event: Window, + window: Window, + override_redirect: b32, +} + +XMapRequestEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + parent: Window, + window: Window, +} + +XReparentEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + event: Window, + window: Window, + parent: Window, + x: i32, + y: i32, + override_redirect: b32, +} + +XConfigureEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + event: Window, + window: Window, + x: i32, + y: i32, + width: i32, + height: i32, + border_width: i32, + above: Window, + override_redirect: b32, +} + +XGravityEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + event: Window, + window: Window, + x: i32, + y: i32, +} + +XResizeRequestEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + width: i32, + height: i32, +} + +XConfigureRequestEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + parent: Window, + window: Window, + x: i32, + y: i32, + width: i32, + height: i32, + border_width: i32, + above: Window, + detail: WindowStacking, + value_mask: uint, +} + +XCirculateEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + event: Window, + window: Window, + place: CirculationRequest, +} + +XCirculateRequestEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + parent: Window, + window: Window, + place: CirculationRequest, +} + +XPropertyEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + atom: Atom, + time: Time, + state: PropertyState, +} + +XSelectionClearEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + selection: Atom, + time: Time, +} + +XSelectionRequestEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + owner: Window, + requestor: Window, + selection: Atom, + target: Atom, + property: Atom, + time: Time, +} + +XSelectionEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + requestor: Window, + selection: Atom, + target: Atom, + property: Atom, + time: Time, +} + +XColormapEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + colormap: Colormap, + new: b32, + state: ColormapState, +} + +XClientMessageEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + message_type: Atom, + format: i32, + data: struct #raw_union { + b: [20]i8, + s: [10]i16, + l: [5]int, + }, +} + +XMappingEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, + request: MappingRequest, + first_keycode: i32, + count: i32, +} + +XErrorEvent :: struct { + type: EventType, + display: ^Display, + resourceid: XID, + serial: uint, + error_code: u8, + request_code: u8, + minor_code: u8, +} + +XAnyEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + window: Window, +} + +XGenericEvent :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: ^Display, + extension: i32, + evtype: i32, +} + +XGenericEventCookie :: struct { + type: EventType, + serial: uint, + send_event: b32, + display: Display, + extension: i32, + evtype: i32, + cookie: u32, + data: rawptr, +} + +XEvent :: struct #raw_union { + type: EventType, + xany: XAnyEvent, + xkey: XKeyEvent, + xbutton: XButtonEvent, + xmotion: XMotionEvent, + xcrossing: XCrossingEvent, + xfocus: XFocusChangeEvent, + xexpose: XExposeEvent, + xgraphicsexpose: XGraphicsExposeEvent, + xnoexpose: XNoExposeEvent, + xvisibility: XVisibilityEvent, + xcreatewindow: XCreateWindowEvent, + xdestroywindow: XDestroyWindowEvent, + xunmap: XUnmapEvent, + xmap: XMapEvent, + xmaprequest: XMapRequestEvent, + xreparent: XReparentEvent, + xconfigure: XConfigureEvent, + xgravity: XGravityEvent, + xresizerequest: XResizeRequestEvent, + xconfigurerequest: XConfigureRequestEvent, + xcirculate: XCirculateEvent, + xcirculaterequest: XCirculateRequestEvent, + xproperty: XPropertyEvent, + xselectionclear: XSelectionClearEvent, + xselectionrequest: XSelectionRequestEvent, + xselection: XSelectionEvent, + xcolormap: XColormapEvent, + xclient: XClientMessageEvent, + xmapping: XMappingEvent, + xerror: XErrorEvent, + xkeymap: XKeymapEvent, + xgeneric: XGenericEvent, + xcookie: XGenericEventCookie, + _: [24]int, +} + +XCharStruct :: struct { + lbearing: i16, + rbearing: i16, + width: i16, + ascent: i16, + descent: i16, + attributes: u16, +} + +XFontProp :: struct { + name: Atom, + card32: uint, +} + +XFontStruct :: struct { + ext_data: ^XExtData, + fid: Font, + direction: u32, + min_char_or_byte2: u32, + max_char_or_byte2: u32, + min_byte1: u32, + max_byte1: u32, + all_chars_exist: i32, + default_char: u32, + n_properties: i32, + properties: ^XFontProp, + min_bounds: XCharStruct, + max_bounds: XCharStruct, + per_char: ^XCharStruct, + ascent: i32, + descent: i32, +} + +XTextItem :: struct { + chars: [^]u8, + nchars: i32, + delta: i32, + font: Font, +} + +XChar2b :: struct { + byte1: u8, + byte2: u8, +} + +XTextItem16 :: struct { + chars: ^XChar2b, + nchars: i32, + delta: i32, + font: Font, +} + +XEDataObject :: struct #raw_union { + display: ^Display, + gc: GC, + visual: ^Visual, + screen: ^Screen, + pixmap_format: ^ScreenFormat, + font: ^XFontStruct, +} + +XFontSetExtents :: struct { + max_ink_extent: XRectangle, + max_logical_extent: XRectangle, +} + +XOM :: distinct rawptr +XOC :: distinct rawptr +XFontSet :: XOC + +XmbTextItem :: struct { + chars: [^]u8, + nchars: i32, + delta: i32, + font_set: XFontSet, +} + +XwcTextItem :: struct { + chars: [^]rune, + nchars: i32, + delta: i32, + font_set: XFontSet, +} + +XOMCharSetList :: struct { + charset_count: i32, + charset_list: [^]cstring, +} + +XOrientation :: enum i32 { + XOMOrientation_LTR_TTB = 0, + XOMOrientation_RTL_TTB = 1, + XOMOrientation_TTB_LTR = 2, + XOMOrientation_TTB_RTL = 3, + XOMOrientation_Context = 4, +} + +XOMOrientation :: struct { + num_orientation: i32, + orientation: [^]XOrientation, +} + +XOMFontInfo :: struct { + num_font: i32, + font_struct_list: [^]^XFontStruct, + font_name_list: [^]cstring, +} + +XIM :: distinct rawptr +XIC :: distinct rawptr + +XIMProc :: #type proc "c" (xim: XIM, client_data: rawptr, call_data: rawptr) +XICProc :: #type proc "c" (xim: XIM, client_data: rawptr, call_data: rawptr) +XIDProc :: #type proc "c" (xim: XIM, client_data: rawptr, call_data: rawptr) + +XIMStyle :: uint + +XIMStyles :: struct { + count_styles: u16, + supported_styles: [^]XIMStyle, +} + +XVaNestedList :: distinct rawptr + +XIMCallback :: struct { + client_data: rawptr, + callback: XIMProc, +} + +XICCallback :: struct { + client_data: rawptr, + callback: XICProc, +} + +XIMFeedback :: uint + +XIMText :: struct { + length: u16, + feedback: ^XIMFeedback, + encoding_is_wchar: b32, + string: struct #raw_union { + multi_byte: [^]u8, + wide_char: [^]rune, + }, +} + +XIMPreeditState :: uint + +XIMPreeditStateNotifyCallbackStruct :: struct { + state: XIMPreeditState, +} + +XIMResetState :: uint + +XIMStringConversionFeedback :: uint + +XIMStringConversionText :: struct { + length: u16, + feedback: ^XIMStringConversionFeedback, + encoding_is_wchar: b32, + string: struct #raw_union { + mbs: [^]u8, + wcs: [^]rune, + }, +} + +XIMStringConversionPosition :: u16 +XIMStringConversionType :: u16 +XIMStringConversionOperation :: u16 + +XIMCaretDirection :: enum i32 { + XIMForwardChar = 0, + XIMBackwardChar = 1, + XIMForwardWord = 2, + XIMBackwardWord = 3, + XIMCaretUp = 4, + XIMCaretDown = 5, + XIMNextLine = 6, + XIMPreviousLine = 7, + XIMLineStart = 8, + XIMLineEnd = 9, + XIMAbsolutePosition = 10, + XIMDontChang = 11, +} + +XIMStringConversionCallbackStruct :: struct { + position: XIMStringConversionPosition, + direction: XIMCaretDirection, + operation: XIMStringConversionOperation, + factor: u16, + text: ^XIMStringConversionText, +} + +XIMPreeditDrawCallbackStruct :: struct { + caret: i32, + chg_first: i32, + chg_length: i32, + text: ^XIMText, +} + +XIMCaretStyle :: enum i32 { + XIMIsInvisible, + XIMIsPrimary, + XIMIsSecondary, +} + +XIMPreeditCaretCallbackStruct :: struct { + position: i32, + direction: XIMCaretDirection, + style: XIMCaretStyle, +} + +XIMStatusDataType :: enum { + XIMTextType, + XIMBitmapType, +} + +XIMStatusDrawCallbackStruct :: struct { + type: XIMStatusDataType, + data: struct #raw_union { + text: ^XIMText, + bitmap: Pixmap, + }, +} + +XIMHotKeyTrigger :: struct { + keysym: KeySym, + modifier: i32, + modifier_mask: i32, +} + +XIMHotKeyTriggers :: struct { + num_hot_key: i32, + key: [^]XIMHotKeyTrigger, +} + +XIMHotKeyState :: uint + +XIMValuesList :: struct { + count_values: u16, + supported_values: [^]cstring, +} + +XConnectionWatchProc :: #type proc "c" ( + display: ^Display, + client_data: rawptr, + fd: i32, + opening: b32, + watch_data: rawptr) + +/* ---- X11/Xcms.h ---------------------------------------------------------*/ + +XcmsColorFormat :: uint + +XcmsFloat :: f64 + +XcmsRGB :: struct { + red: u16, + green: u16, + blue: u16, +} + +XcmsRGBi :: struct { + red: XcmsFloat, + green: XcmsFloat, + blue: XcmsFloat, +} + +XcmsCIEXYZ :: struct { + X: XcmsFloat, + Y: XcmsFloat, + Z: XcmsFloat, +} + +XcmsCIEuvY :: struct { + u_prime: XcmsFloat, + v_prime: XcmsFloat, + Y: XcmsFloat, +} + +XcmsCIExyY :: struct { + x: XcmsFloat, + y: XcmsFloat, + Y: XcmsFloat, +} + +XcmsCIELab :: struct { + L_star: XcmsFloat, + a_star: XcmsFloat, + b_star: XcmsFloat, +} + +XcmsCIELuv :: struct { + L_star: XcmsFloat, + u_star: XcmsFloat, + v_star: XcmsFloat, +} + +XcmsTekHVC :: struct { + H: XcmsFloat, + V: XcmsFloat, + C: XcmsFloat, +} + +XcmsPad :: struct { + _: XcmsFloat, + _: XcmsFloat, + _: XcmsFloat, + _: XcmsFloat, +} + +XcmsColor :: struct { + spec: struct #raw_union { + RGB: XcmsRGB, + RGBi: XcmsRGBi, + CIEXYZ: XcmsCIEXYZ, + CIEuvY: XcmsCIEuvY, + CIExyY: XcmsCIExyY, + CIELab: XcmsCIELab, + CIELuv: XcmsCIELuv, + TekHVC: XcmsTekHVC, + _: XcmsPad, + }, + pixel: uint, + format: XcmsColorFormat, +} + +XcmsPerScrnInfo :: struct { + screenWhitePt: XcmsColor, + functionSet: rawptr, + screenData: rawptr, + state: u8, + _: [3]u8, +} + +XcmsCCC :: distinct rawptr + +XcmsCompressionProc :: #type proc "c" ( + ctx: XcmsCCC, + colors: [^]XcmsColor, + ncolors: u32, + index: u32, + flags: [^]b32) -> Status + +XcmsWhiteAdjustProc :: #type proc "c" ( + ctx: XcmsCCC, + initial_white_point: ^XcmsColor, + target_white_point: ^XcmsColor, + target_format: XcmsColorFormat, + colors: [^]XcmsColor, + ncolors: u32, + compression: [^]b32) -> Status + +XcmsCCCRec :: struct { + dpy: ^Display, + screenNumber: i32, + visual: ^Visual, + clientWhitePt: XcmsColor, + gamutCompProc: XcmsCompressionProc, + gamutCompClientData: rawptr, + whitePtAdjProc: XcmsWhiteAdjustProc, + whitePtAdjClientData: rawptr, + pPerScrnInfo: ^XcmsPerScrnInfo, +} + +XcmsScreenInitProc :: #type proc "c" ( + display: ^Display, + screen_number: i32, + screen_info: ^XcmsPerScrnInfo) -> i32 + +XcmsScreenFreeProc :: #type proc "c" (screen: rawptr) + +XcmsDDConversionProc :: #type proc "c" ( + ctx: XcmsCCC, + colors: [^]XcmsColor, + ncolors: u32, + compressed: [^]b32) -> i32 + +XcmsDIConversionProc :: #type proc "c" ( + ctx: XcmsCCC, + white_point: ^XcmsColor, + colors: ^XcmsColor, + ncolors: u32) -> i32 + + +XcmsConversionProc :: XcmsDIConversionProc +XcmsFuncListPtr :: [^]XcmsConversionProc + +XcmsParseStringProc :: #type proc "c" (color_string: cstring, color: ^XcmsColor) -> i32 + +XcmsColorSpace :: struct { + prefix: cstring, + id: XcmsColorFormat, + parseString: XcmsParseStringProc, + to_CIEXYZ: XcmsFuncListPtr, + from_CIEXYZ: XcmsFuncListPtr, + inverse_flag: i32, +} + +XcmsFunctionSet :: struct { + DDColorSpaces: [^]^XcmsColorSpace, + screenInitProc: XcmsScreenInitProc, + screenFreeProc: XcmsScreenFreeProc, +} + + +/* ---- X11/Xutil.h --------------------------------------------------------*/ + +XSizeHints :: struct { + flags: int, + x: i32, + y: i32, + width: i32, + height: i32, + min_width: i32, + min_height: i32, + max_width: i32, + max_height: i32, + width_inc: i32, + height_inc: i32, + min_aspect: struct {x,y: i32}, + max_aspect: struct {x,y: i32}, + base_width: i32, + base_height: i32, + win_gravity: i32, +} + +XWMHints :: struct { + flags: int, + input: i32, + initial_state: i32, + icon_pixmap: Pixmap, + icon_window: Window, + icon_x: i32, + icon_y: i32, + icon_mask: Pixmap, + window_group: XID, +} + +XTextProperty :: struct { + value: [^]u8, + encoding: Atom, + format: int, + nitems: uint, +} + +XICCEncodingStyle :: enum i32 { + XStringStyle, + XCompoundTextStyle, + XTextStyle, + XStdICCTextStyle, + XUTF8StringStyle, +} + +XIconSize :: struct { + min_width: i32, + min_height: i32, + max_width: i32, + max_height: i32, + width_inc: i32, + height_inc: i32, +} + +XClassHint :: struct { + res_name: cstring, + res_class: cstring, +} + +XComposeStatus :: struct { + compose_ptr: rawptr, + chars_matched: i32, +} + +Region :: distinct rawptr + +XVisualInfo :: struct { + visual: ^Visual, + visualid: VisualID, + screen: i32, + depth: i32, + class: i32, + red_mask: uint, + green_mask: uint, + blue_mask: uint, + colormap_size: i32, + bits_per_rgb: i32, +} + +XStandardColormap :: struct { + colormap: Colormap, + red_max: uint, + red_mult: uint, + green_max: uint, + green_mult: uint, + blue_max: uint, + blue_mult: uint, + base_pixel: uint, + visualid: VisualID, + killid: XID, +} + +XContext :: i32 + +/* ---- X11/Xresource.h ----------------------------------------------------*/ + +XrmQuark :: i32 +XrmQuarkList :: [^]i32 +XrmString :: cstring + +XrmBinding :: enum i32 { + XrmBindTightly, + XrmBindLoosely, +} + +XrmBindingList :: [^]XrmBinding + +XrmName :: XrmQuark +XrmNameList :: XrmQuarkList +XrmClass :: XrmQuark +XrmClassList :: XrmQuarkList +XrmRepresentation :: XrmQuark + +XrmValue :: struct { + size: u32, + addr: rawptr, +} +XrmValuePtr :: [^]XrmValue + +XrmHashBucket :: distinct rawptr +XrmHashTable :: [^]XrmHashBucket +XrmSearchList :: [^]XrmHashTable +XrmDatabase :: distinct rawptr + +XrmOptionKind :: enum { + XrmoptionNoArg, + XrmoptionIsArg, + XrmoptionStickyArg, + XrmoptionSepArg, + XrmoptionResArg, + XrmoptionSkipArg, + XrmoptionSkipLine, + XrmoptionSkipNArgs, +} + +XrmOptionDescRec :: struct { + option: cstring, + specifier: cstring, + argKind: XrmOptionKind, + value: rawptr, +} + +XrmOptionDescList :: [^]XrmOptionDescRec From bd190815436f77558740afce2df2eac74da660df Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Sun, 12 Nov 2023 01:53:14 +0100 Subject: [PATCH 07/52] fix nil exceptions with incomplete code parse This makes the parser more fault tolerant because the different parse_foo procs return nil when in an invalid state, which is fine most of the time but when creating a node it would crash accessing its position. --- core/odin/ast/clone.odin | 11 +++- core/odin/parser/parser.odin | 98 +++++++++++++++++++----------------- 2 files changed, 61 insertions(+), 48 deletions(-) diff --git a/core/odin/ast/clone.odin b/core/odin/ast/clone.odin index 79e7a166e..c9bfdfe89 100644 --- a/core/odin/ast/clone.odin +++ b/core/odin/ast/clone.odin @@ -7,7 +7,7 @@ import "core:reflect" import "core:odin/tokenizer" _ :: intrinsics -new :: proc($T: typeid, pos, end: tokenizer.Pos) -> ^T { +new_from_positions :: proc($T: typeid, pos, end: tokenizer.Pos) -> ^T { n, _ := mem.new(T) n.pos = pos n.end = end @@ -23,6 +23,15 @@ new :: proc($T: typeid, pos, end: tokenizer.Pos) -> ^T { return n } +new_from_pos_and_end_node :: proc($T: typeid, pos: tokenizer.Pos, end: ^Node) -> ^T { + return new(T, pos, end != nil ? end.end : {}) +} + +new :: proc { + new_from_positions, + new_from_pos_and_end_node, +} + clone :: proc{ clone_node, clone_expr, diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index bbfaf9114..39bd77055 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -786,8 +786,11 @@ parse_if_stmt :: proc(p: ^Parser) -> ^ast.If_Stmt { else_stmt = ast.new(ast.Bad_Stmt, p.curr_tok.pos, end_pos(p.curr_tok)) } } - - end := body.end + + end: tokenizer.Pos + if body != nil { + end = body.end + } if else_stmt != nil { end = else_stmt.end } @@ -850,7 +853,7 @@ parse_for_stmt :: proc(p: ^Parser) -> ^ast.Stmt { body = parse_body(p) } - range_stmt := ast.new(ast.Range_Stmt, tok.pos, body.end) + range_stmt := ast.new(ast.Range_Stmt, tok.pos, body) range_stmt.for_pos = tok.pos range_stmt.in_pos = in_tok.pos range_stmt.expr = rhs @@ -910,7 +913,7 @@ parse_for_stmt :: proc(p: ^Parser) -> ^ast.Stmt { rhs = assign_stmt.rhs[0] } - range_stmt := ast.new(ast.Range_Stmt, tok.pos, body.end) + range_stmt := ast.new(ast.Range_Stmt, tok.pos, body) range_stmt.for_pos = tok.pos range_stmt.vals = vals range_stmt.in_pos = assign_stmt.op.pos @@ -920,7 +923,7 @@ parse_for_stmt :: proc(p: ^Parser) -> ^ast.Stmt { } cond_expr := convert_stmt_to_expr(p, cond, "boolean expression") - for_stmt := ast.new(ast.For_Stmt, tok.pos, body.end) + for_stmt := ast.new(ast.For_Stmt, tok.pos, body) for_stmt.for_pos = tok.pos for_stmt.init = init for_stmt.cond = cond_expr @@ -976,7 +979,7 @@ parse_switch_stmt :: proc(p: ^Parser) -> ^ast.Stmt { lhs[0] = new_blank_ident(p, tok.pos) rhs[0] = parse_expr(p, true) - as := ast.new(ast.Assign_Stmt, tok.pos, rhs[0].end) + as := ast.new(ast.Assign_Stmt, tok.pos, rhs[0]) as.lhs = lhs as.op = in_tok as.rhs = rhs @@ -1010,14 +1013,14 @@ parse_switch_stmt :: proc(p: ^Parser) -> ^ast.Stmt { body.stmts = clauses[:] if is_type_switch { - ts := ast.new(ast.Type_Switch_Stmt, tok.pos, body.end) + ts := ast.new(ast.Type_Switch_Stmt, tok.pos, body) ts.tag = tag ts.body = body ts.switch_pos = tok.pos return ts } else { cond := convert_stmt_to_expr(p, tag, "switch expression") - ts := ast.new(ast.Switch_Stmt, tok.pos, body.end) + ts := ast.new(ast.Switch_Stmt, tok.pos, body) ts.init = init ts.cond = cond ts.body = body @@ -1044,7 +1047,7 @@ parse_attribute :: proc(p: ^Parser, tok: tokenizer.Token, open_kind, close_kind: if p.curr_tok.kind == .Eq { eq := expect_token(p, .Eq) value := parse_value(p) - fv := ast.new(ast.Field_Value, elem.pos, value.end) + fv := ast.new(ast.Field_Value, elem.pos, value) fv.field = elem fv.sep = eq.pos fv.value = value @@ -1137,7 +1140,7 @@ parse_foreign_block :: proc(p: ^Parser, tok: tokenizer.Token) -> ^ast.Foreign_Bl body.stmts = decls[:] body.close = close.pos - decl := ast.new(ast.Foreign_Block_Decl, tok.pos, body.end) + decl := ast.new(ast.Foreign_Block_Decl, tok.pos, body) decl.docs = docs decl.tok = tok decl.foreign_library = foreign_library @@ -1248,7 +1251,7 @@ parse_unrolled_for_loop :: proc(p: ^Parser, inline_tok: tokenizer.Token) -> ^ast return ast.new(ast.Bad_Stmt, inline_tok.pos, end_pos(p.prev_tok)) } - range_stmt := ast.new(ast.Inline_Range_Stmt, inline_tok.pos, body.end) + range_stmt := ast.new(ast.Inline_Range_Stmt, inline_tok.pos, body) range_stmt.inline_pos = inline_tok.pos range_stmt.for_pos = for_tok.pos range_stmt.val0 = val0 @@ -1304,7 +1307,7 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt { case ^ast.Return_Stmt: error(p, s.pos, "you cannot defer a return statement") } - ds := ast.new(ast.Defer_Stmt, tok.pos, stmt.end) + ds := ast.new(ast.Defer_Stmt, tok.pos, stmt) ds.stmt = stmt return ds @@ -1341,8 +1344,7 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt { if tok.kind != .Fallthrough && p.curr_tok.kind == .Ident { label = parse_ident(p) } - end := label.end if label != nil else end_pos(tok) - s := ast.new(ast.Branch_Stmt, tok.pos, end) + s := ast.new(ast.Branch_Stmt, tok.pos, label) s.tok = tok s.label = label expect_semicolon(p, s) @@ -1366,7 +1368,7 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt { if p.curr_tok.kind != .Colon { end := list[len(list)-1] expect_semicolon(p, end) - us := ast.new(ast.Using_Stmt, tok.pos, end.end) + us := ast.new(ast.Using_Stmt, tok.pos, end) us.list = list return us } @@ -1416,13 +1418,13 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt { bd.tok = tok bd.name = name ce := parse_call_expr(p, bd) - es := ast.new(ast.Expr_Stmt, ce.pos, ce.end) + es := ast.new(ast.Expr_Stmt, ce.pos, ce) es.expr = ce return es case "force_inline", "force_no_inline": expr := parse_inlining_operand(p, true, tag) - es := ast.new(ast.Expr_Stmt, expr.pos, expr.end) + es := ast.new(ast.Expr_Stmt, expr.pos, expr) es.expr = expr return es case "unroll": @@ -1444,7 +1446,8 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt { return ast.new(ast.Bad_Stmt, tok.pos, end_pos(tag)) case: stmt := parse_stmt(p) - te := ast.new(ast.Tag_Stmt, tok.pos, stmt.pos) + end := stmt.pos if stmt != nil else end_pos(tok) + te := ast.new(ast.Tag_Stmt, tok.pos, end) te.op = tok te.name = name te.stmt = stmt @@ -1572,7 +1575,7 @@ convert_stmt_to_body :: proc(p: ^Parser, stmt: ^ast.Stmt) -> ^ast.Stmt { error(p, stmt.pos, "expected a non-empty statement") } - bs := ast.new(ast.Block_Stmt, stmt.pos, stmt.end) + bs := ast.new(ast.Block_Stmt, stmt.pos, stmt) bs.open = stmt.pos bs.stmts = make([]^ast.Stmt, 1) bs.stmts[0] = stmt @@ -1741,7 +1744,7 @@ parse_var_type :: proc(p: ^Parser, flags: ast.Field_Flags) -> ^ast.Expr { error(p, tok.pos, "variadic field missing type after '..'") type = ast.new(ast.Bad_Expr, tok.pos, end_pos(tok)) } - e := ast.new(ast.Ellipsis, type.pos, type.end) + e := ast.new(ast.Ellipsis, type.pos, type) e.expr = type return e } @@ -1808,7 +1811,7 @@ parse_ident_list :: proc(p: ^Parser, allow_poly_names: bool) -> []^ast.Expr { if is_blank_ident(ident) { error(p, ident.pos, "invalid polymorphic type definition with a blank identifier") } - poly_name := ast.new(ast.Poly_Type, tok.pos, ident.end) + poly_name := ast.new(ast.Poly_Type, tok.pos, ident) poly_name.type = ident append(&list, poly_name) } else { @@ -2154,7 +2157,7 @@ parse_inlining_operand :: proc(p: ^Parser, lhs: bool, tok: tokenizer.Token) -> ^ e.inlining = pi case: error(p, tok.pos, "'%s' must be followed by a procedure literal or call", tok.text) - return ast.new(ast.Bad_Expr, tok.pos, expr.end) + return ast.new(ast.Bad_Expr, tok.pos, expr) } return expr } @@ -2204,7 +2207,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { case .Distinct: tok := advance_token(p) type := parse_type(p) - dt := ast.new(ast.Distinct_Type, tok.pos, type.end) + dt := ast.new(ast.Distinct_Type, tok.pos, type) dt.tok = tok.kind dt.type = type return dt @@ -2215,7 +2218,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { switch name.text { case "type": type := parse_type(p) - hp := ast.new(ast.Helper_Type, tok.pos, type.end) + hp := ast.new(ast.Helper_Type, tok.pos, type) hp.tok = tok.kind hp.type = type return hp @@ -2319,7 +2322,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { tag_call := parse_call_expr(p, tag) type := parse_type(p) - rt := ast.new(ast.Relative_Type, tok.pos, type.end) + rt := ast.new(ast.Relative_Type, tok.pos, type) rt.tag = tag_call rt.type = type return rt @@ -2328,7 +2331,8 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { return parse_inlining_operand(p, lhs, name) case: expr := parse_expr(p, lhs) - te := ast.new(ast.Tag_Expr, tok.pos, expr.pos) + end := expr.pos if expr != nil else end_pos(tok) + te := ast.new(ast.Tag_Expr, tok.pos, end) te.op = tok te.name = name.text te.expr = expr @@ -2456,7 +2460,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { case .Pointer: tok := expect_token(p, .Pointer) elem := parse_type(p) - ptr := ast.new(ast.Pointer_Type, tok.pos, elem.end) + ptr := ast.new(ast.Pointer_Type, tok.pos, elem) ptr.pointer = tok.pos ptr.elem = elem return ptr @@ -2470,7 +2474,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { tok := expect_token(p, .Pointer) close := expect_token(p, .Close_Bracket) elem := parse_type(p) - t := ast.new(ast.Multi_Pointer_Type, open.pos, elem.end) + t := ast.new(ast.Multi_Pointer_Type, open.pos, elem) t.open = open.pos t.pointer = tok.pos t.close = close.pos @@ -2480,7 +2484,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { tok := expect_token(p, .Dynamic) close := expect_token(p, .Close_Bracket) elem := parse_type(p) - da := ast.new(ast.Dynamic_Array_Type, open.pos, elem.end) + da := ast.new(ast.Dynamic_Array_Type, open.pos, elem) da.open = open.pos da.dynamic_pos = tok.pos da.close = close.pos @@ -2500,7 +2504,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { } close := expect_token(p, .Close_Bracket) elem := parse_type(p) - at := ast.new(ast.Array_Type, open.pos, elem.end) + at := ast.new(ast.Array_Type, open.pos, elem) at.open = open.pos at.len = count at.close = close.pos @@ -2514,7 +2518,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { expect_token(p, .Close_Bracket) value := parse_type(p) - mt := ast.new(ast.Map_Type, tok.pos, value.end) + mt := ast.new(ast.Map_Type, tok.pos, value) mt.tok_pos = tok.pos mt.key = key mt.value = value @@ -2755,7 +2759,7 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { expect_token(p, .Close_Bracket) elem := parse_type(p) - mt := ast.new(ast.Matrix_Type, tok.pos, elem.end) + mt := ast.new(ast.Matrix_Type, tok.pos, elem) mt.tok_pos = tok.pos mt.row_count = row_count mt.column_count = column_count @@ -2893,7 +2897,7 @@ parse_elem_list :: proc(p: ^Parser) -> []^ast.Expr { eq := expect_token(p, .Eq) value := parse_value(p) - fv := ast.new(ast.Field_Value, elem.pos, value.end) + fv := ast.new(ast.Field_Value, elem.pos, value) fv.field = elem fv.sep = eq.pos fv.value = value @@ -2962,7 +2966,7 @@ parse_call_expr :: proc(p: ^Parser, operand: ^ast.Expr) -> ^ast.Expr { } value := parse_value(p) - fv := ast.new(ast.Field_Value, arg.pos, value.end) + fv := ast.new(ast.Field_Value, arg.pos, value) fv.field = arg fv.sep = eq.pos fv.value = value @@ -2993,7 +2997,7 @@ parse_call_expr :: proc(p: ^Parser, operand: ^ast.Expr) -> ^ast.Expr { o := ast.unparen_expr(operand) if se, ok := o.derived.(^ast.Selector_Expr); ok && se.op.kind == .Arrow_Right { - sce := ast.new(ast.Selector_Call_Expr, ce.pos, ce.end) + sce := ast.new(ast.Selector_Call_Expr, ce.pos, ce) sce.expr = o sce.call = ce return sce @@ -3101,7 +3105,7 @@ parse_atom_expr :: proc(p: ^Parser, value: ^ast.Expr, lhs: bool) -> (operand: ^a case .Ident: field := parse_ident(p) - sel := ast.new(ast.Selector_Expr, operand.pos, field.end) + sel := ast.new(ast.Selector_Expr, operand.pos, field) sel.expr = operand sel.op = tok sel.field = field @@ -3127,7 +3131,7 @@ parse_atom_expr :: proc(p: ^Parser, value: ^ast.Expr, lhs: bool) -> (operand: ^a type.op = question type.expr = nil - ta := ast.new(ast.Type_Assertion, operand.pos, type.end) + ta := ast.new(ast.Type_Assertion, operand.pos, type) ta.expr = operand ta.type = type @@ -3145,7 +3149,7 @@ parse_atom_expr :: proc(p: ^Parser, value: ^ast.Expr, lhs: bool) -> (operand: ^a case .Ident: field := parse_ident(p) - sel := ast.new(ast.Selector_Expr, operand.pos, field.end) + sel := ast.new(ast.Selector_Expr, operand.pos, field) sel.expr = operand sel.op = tok sel.field = field @@ -3225,7 +3229,7 @@ parse_unary_expr :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { close := expect_token(p, .Close_Paren) expr := parse_unary_expr(p, lhs) - tc := ast.new(ast.Type_Cast, tok.pos, expr.end) + tc := ast.new(ast.Type_Cast, tok.pos, expr) tc.tok = tok tc.open = open.pos tc.type = type @@ -3237,7 +3241,7 @@ parse_unary_expr :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { op := advance_token(p) expr := parse_unary_expr(p, lhs) - ac := ast.new(ast.Auto_Cast, op.pos, expr.end) + ac := ast.new(ast.Auto_Cast, op.pos, expr) ac.op = op ac.expr = expr return ac @@ -3247,8 +3251,8 @@ parse_unary_expr :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { .And: op := advance_token(p) expr := parse_unary_expr(p, lhs) - - ue := ast.new(ast.Unary_Expr, op.pos, expr.end) + + ue := ast.new(ast.Unary_Expr, op.pos, expr) ue.op = op ue.expr = expr return ue @@ -3258,7 +3262,7 @@ parse_unary_expr :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { error(p, op.pos, "unary '%s' operator is not supported", op.text) expr := parse_unary_expr(p, lhs) - ue := ast.new(ast.Unary_Expr, op.pos, expr.end) + ue := ast.new(ast.Unary_Expr, op.pos, expr) ue.op = op ue.expr = expr return ue @@ -3266,7 +3270,7 @@ parse_unary_expr :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { case .Period: op := advance_token(p) field := parse_ident(p) - ise := ast.new(ast.Implicit_Selector_Expr, op.pos, field.end) + ise := ast.new(ast.Implicit_Selector_Expr, op.pos, field) ise.field = field return ise @@ -3407,7 +3411,7 @@ parse_simple_stmt :: proc(p: ^Parser, flags: Stmt_Allow_Flags) -> ^ast.Stmt { error(p, p.curr_tok.pos, "no right-hand side in assignment statement") return ast.new(ast.Bad_Stmt, start_tok.pos, end_pos(p.curr_tok)) } - stmt := ast.new(ast.Assign_Stmt, lhs[0].pos, rhs[len(rhs)-1].end) + stmt := ast.new(ast.Assign_Stmt, lhs[0].pos, rhs[len(rhs)-1]) stmt.lhs = lhs stmt.op = op stmt.rhs = rhs @@ -3424,7 +3428,7 @@ parse_simple_stmt :: proc(p: ^Parser, flags: Stmt_Allow_Flags) -> ^ast.Stmt { rhs := make([]^ast.Expr, 1) rhs[0] = expr - stmt := ast.new(ast.Assign_Stmt, lhs[0].pos, rhs[len(rhs)-1].end) + stmt := ast.new(ast.Assign_Stmt, lhs[0].pos, rhs[len(rhs)-1]) stmt.lhs = lhs stmt.op = op stmt.rhs = rhs @@ -3466,7 +3470,7 @@ parse_simple_stmt :: proc(p: ^Parser, flags: Stmt_Allow_Flags) -> ^ast.Stmt { error(p, op.pos, "postfix '%s' statement is not supported", op.text) } - es := ast.new(ast.Expr_Stmt, lhs[0].pos, lhs[0].end) + es := ast.new(ast.Expr_Stmt, lhs[0].pos, lhs[0]) es.expr = lhs[0] return es } From cce42f4a6bf45903efa898a9f9c2bc3e5be78601 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 12 Nov 2023 20:48:32 +1100 Subject: [PATCH 08/52] [vendor/x11]: Fix XOpenDisplay --- vendor/x11/xlib/xlib_procs.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index 811ed31ee..86b926ade 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -13,7 +13,7 @@ foreign xlib { // Free data allocated by Xlib XFree :: proc(ptr: rawptr) --- // Opening/closing a display - XOpenDisplay :: proc(display: ^Display, name: cstring) -> ^Display --- + XOpenDisplay :: proc(name: cstring) -> ^Display --- XCloseDisplay :: proc(display: ^Display) --- XSetCloseDownMode :: proc(display: ^Display, mode: CloseMode) --- // Generate a no-op request From 9e35361eb89eeb3e99224d83dfd5bec98d400863 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 12 Nov 2023 20:57:48 +1100 Subject: [PATCH 09/52] [vendor/x11]: Fix definition for EventType --- vendor/x11/xlib/xlib_const.odin | 41 +++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/vendor/x11/xlib/xlib_const.odin b/vendor/x11/xlib/xlib_const.odin index b925ec27e..5c3579a8c 100644 --- a/vendor/x11/xlib/xlib_const.odin +++ b/vendor/x11/xlib/xlib_const.odin @@ -68,8 +68,8 @@ BackingStore :: enum i32 { Always = 2, } -EventMask :: bit_set[EventType; int] -EventType :: enum i32 { +EventMask :: bit_set[EventMaskBits; int] +EventMaskBits :: enum i32 { KeyPress = 0, KeyRelease = 1, ButtonPress = 2, @@ -97,6 +97,43 @@ EventType :: enum i32 { OwnerGrabButton = 24, } +EventType :: enum i32 { + KeyPress = 2, + KeyRelease = 3, + ButtonPress = 4, + ButtonRelease = 5, + MotionNotify = 6, + EnterNotify = 7, + LeaveNotify = 8, + FocusIn = 9, + FocusOut = 10, + KeymapNotify = 11, + Expose = 12, + GraphicsExpose = 13, + NoExpose = 14, + VisibilityNotify = 15, + CreateNotify = 16, + DestroyNotify = 17, + UnmapNotify = 18, + MapNotify = 19, + MapRequest = 20, + ReparentNotify = 21, + ConfigureNotify = 22, + ConfigureRequest = 23, + GravityNotify = 24, + ResizeRequest = 25, + CirculateNotify = 26, + CirculateRequest = 27, + PropertyNotify = 28, + SelectionClear = 29, + SelectionRequest = 30, + SelectionNotify = 31, + ColormapNotify = 32, + ClientMessage = 33, + MappingNotify = 34, + GenericEvent = 35, +} + InputMask :: bit_set[InputMaskBits; i32] InputMaskBits :: enum { ShiftMask = 0, From c0bbe1e23d6f966de9fc6d939fd510eb8800f310 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 12 Nov 2023 21:09:41 +1100 Subject: [PATCH 10/52] [vendor/x11]: Add a special type for mouse events --- vendor/x11/xlib/xlib_const.odin | 8 ++++++++ vendor/x11/xlib/xlib_types.odin | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/vendor/x11/xlib/xlib_const.odin b/vendor/x11/xlib/xlib_const.odin index 5c3579a8c..a37cee64c 100644 --- a/vendor/x11/xlib/xlib_const.odin +++ b/vendor/x11/xlib/xlib_const.odin @@ -68,6 +68,14 @@ BackingStore :: enum i32 { Always = 2, } +MouseButton :: enum i32 { + Button1 = 1, + Button2 = 2, + Button3 = 3, + Button4 = 4, + Button5 = 5, +} + EventMask :: bit_set[EventMaskBits; int] EventMaskBits :: enum i32 { KeyPress = 0, diff --git a/vendor/x11/xlib/xlib_types.odin b/vendor/x11/xlib/xlib_types.odin index bb2f16604..3cee181c8 100644 --- a/vendor/x11/xlib/xlib_types.odin +++ b/vendor/x11/xlib/xlib_types.odin @@ -335,7 +335,7 @@ XButtonEvent :: struct { x_root: i32, y_root: i32, state: InputMask, - button: u32, + button: MouseButton, same_screen: b32, } From 1db95aa09d904a2862d9da22f1efe4862ed7735e Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 12 Nov 2023 21:30:45 +1100 Subject: [PATCH 11/52] [vendor/x11]: Fix XDefaultScreen --- vendor/x11/xlib/xlib_procs.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index 86b926ade..82b32594b 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -44,7 +44,7 @@ foreign xlib { XDefaultDepth :: proc(display: ^Display) -> i32 --- XDefaultGC :: proc(display: ^Display, screen_no: i32) -> GC --- XDefaultRootWindow :: proc(display: ^Display) -> Window --- - XDefaultScreen :: proc(display: ^Display) -> ^Screen --- + XDefaultScreen :: proc(display: ^Display) -> i32 --- XDefaultVisual :: proc(display: ^Display, screen_no: i32) -> ^Visual --- XDefaultScreenOfDisplay :: proc(display: ^Display) -> ^Screen --- From 9737c2ad0b6f7737b50f5157d20ec51da1d25d67 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Mon, 13 Nov 2023 11:28:39 +1100 Subject: [PATCH 12/52] [examples]: Import x11/xlib instead of x11 --- examples/all/all_vendor.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/all/all_vendor.odin b/examples/all/all_vendor.odin index 76dd9903a..0486bf852 100644 --- a/examples/all/all_vendor.odin +++ b/examples/all/all_vendor.odin @@ -46,7 +46,7 @@ import nvg "vendor:nanovg" import nvg_gl "vendor:nanovg/gl" import fontstash "vendor:fontstash" -import x11 "vendor:x11" +import xlib "vendor:x11/xlib" _ :: botan_bindings _ :: botan_blake2b @@ -94,4 +94,4 @@ _ :: nvg _ :: nvg_gl _ :: fontstash -_ :: x11 \ No newline at end of file +_ :: xlib \ No newline at end of file From 55d42492ac31154db9a60a32d361d572c0dfdf2a Mon Sep 17 00:00:00 2001 From: flysand7 Date: Mon, 13 Nov 2023 11:59:36 +1100 Subject: [PATCH 13/52] [vendor/x11]: Add some client to window management communication functions --- vendor/x11/xlib/xlib_const.odin | 54 +++++++++++ vendor/x11/xlib/xlib_procs.odin | 159 ++++++++++++++++++++++++++++++++ vendor/x11/xlib/xlib_types.odin | 8 +- 3 files changed, 217 insertions(+), 4 deletions(-) diff --git a/vendor/x11/xlib/xlib_const.odin b/vendor/x11/xlib/xlib_const.odin index a37cee64c..876df9d4b 100644 --- a/vendor/x11/xlib/xlib_const.odin +++ b/vendor/x11/xlib/xlib_const.odin @@ -17,6 +17,18 @@ AllTemporary :: 0 CurrentTime :: 0 NoSymbol :: 0 +XA_WM_CLASS :: Atom(67) +XA_WM_CLIENT_MACHINE :: Atom(36) +XA_WM_COMMAND :: Atom(34) +XA_WM_HINTS :: Atom(35) +XA_WM_ICON_NAME :: Atom(37) +XA_WM_ICON_SIZE :: Atom(38) +XA_WM_NAME :: Atom(39) +XA_WM_NORMAL_HINTS :: Atom(40) +XA_WM_SIZE_HINTS :: Atom(41) +XA_WM_TRANSIENT_FOR :: Atom(68) +XA_WM_ZOOM_HINTS :: Atom(42) + // NOTE(flysand): Some implementations return Status as enum, other return it // as an integer. I will make it a status. Status :: enum i32 { @@ -569,3 +581,45 @@ KeyboardLedMode :: enum i32 { LedModeOff = 0, LedModeOn = 1, } + +WMHints :: bit_set[WMHintsBits; uint] +WMHintsBits :: enum { + InputHint = 0, + StateHint = 1, + IconPixmapHint = 2, + IconWindowHint = 3, + IconPositionHint = 4, + IconMaskHint = 5, + WindowGroupHint = 6, + XUrgencyHint = 8, +} + +WMHintState :: enum i32 { + WithdrawnState = 0, + NormalState = 1, + IconicState = 3, +} + +AllHints :: WMHints{ + .InputHint, + .StateHint, + .IconPixmapHint, + .IconWindowHint, + .IconPositionHint, + .IconMaskHint, + .WindowGroupHint, +} + +SizeHints :: bit_set[SizeHintsBits; uint] +SizeHintsBits :: enum { + USPosition = 0, + USSize = 1, + PPosition = 2, + PSize = 3, + PMinSize = 4, + PMaxSize = 5, + PResizeInc = 6, + PAspect = 7, + PBaseSize = 8, + PWinGravity = 9, +} diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index 82b32594b..d359e48c0 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -1546,4 +1546,163 @@ foreign xlib { XFreeModifiermap :: proc(modmap: ^XModifierKeymap) --- XSetModifierMapping :: proc(display: ^Display, modmap: ^XModifierKeymap) -> i32 --- XGetModifierMapping :: proc(display: ^Display) -> ^XModifierKeymap --- + // Manipulating top-level windows + XIconifyWindow :: proc( + dipslay: ^Display, + window: Window, + screen_no: i32, + ) -> Status --- + XWithdrawWindow :: proc( + dipslay: ^Display, + window: Window, + screen_no: i32, + ) -> Status --- + XReconfigureWMWindow :: proc( + dipslay: ^Display, + window: Window, + screen_no: i32, + mask: WindowChangesMask, + changes: ^XWindowChanges, + ) -> Status --- + // Getting and setting the WM_NAME property + XSetWMName :: proc( + display: ^Display, + window: Window, + prop: ^XTextProperty + ) --- + XGetWMName :: proc( + display: ^Display, + window: Window, + prop: ^XTextProperty, + ) -> Status --- + XStoreName :: proc( + display: ^Display, + window: Window, + name: cstring + ) --- + XFetchName :: proc( + display: ^Display, + window: Window, + name: ^cstring + ) -> Status --- + XSetWMIconName :: proc( + display: ^Display, + window: Window, + prop: ^XTextProperty + ) --- + XGetWMIconName :: proc( + display: ^Display, + window: Window, + prop: ^XTextProperty, + ) -> Status --- + XSetIconName :: proc( + display: ^Display, + window: Window, + name: cstring, + ) --- + XGetIconName :: proc( + display: ^Display, + window: Window, + prop: ^cstring, + ) -> Status --- + // Setting and reading WM_HINTS property + XAllocWMHints :: proc() -> ^XWMHints --- + XSetWMHints :: proc( + display: ^Display, + window: Window, + hints: ^XWMHints, + ) --- + XGetWMHints :: proc( + display: ^Display, + window: Window, + ) -> ^XWMHints --- + // Setting and reading MW_NORMAL_HINTS property + XAllocSizeHints :: proc() -> ^XSizeHints --- + XSetWMNormalHints :: proc( + display: ^Display, + window: Window, + hints: ^XSizeHints, + ) --- + XGetWMNormalHints :: proc( + display: ^Display, + window: Window, + hints: ^XSizeHints, + flags: ^SizeHints, + ) -> Status --- + XSetWMSizeHints :: proc( + display: ^Display, + window: Window, + hints: ^XSizeHints, + prop: Atom, + ) --- + XGetWMSizeHints :: proc( + display: ^Display, + window: Window, + hints: ^XSizeHints, + masks: ^SizeHints, + prop: Atom, + ) -> Status --- + // Setting and reading the WM_CLASS property + XAllocClassHint :: proc() -> ^XClassHint --- + XSetClassHint :: proc( + display: ^Display, + window: Window, + hint: ^XClassHint, + ) --- + XGetClassHint :: proc( + display: ^Display, + window: Window, + hint: ^XClassHint, + ) -> Status --- + // Setting and reading WM_TRANSIENT_FOR property + XSetTransientForHint :: proc( + display: ^Display, + window: Window, + prop_window: Window, + ) --- + XGetTransientForHint :: proc( + display: ^Display, + window: Window, + prop_window: ^Window, + ) -> Status --- + // Setting and reading the WM_PROTOCOLS property + XSetWMProtocols :: proc( + display: ^Display, + window: Window, + protocols: [^]Atom, + count: i32, + ) -> Status --- + XGetWMProtocols :: proc( + display: ^Display, + window: Window, + protocols: ^[^]Atom, + count: ^i32 + ) -> Status --- + // Setting and reading the WM_COLORMAP_WINDOWS property + XSetWMColormapWindows :: proc( + display: ^Display, + window: Window, + colormap_windows: [^]Window, + count: i32, + ) -> Status --- + XGetWMColormapWindows :: proc( + display: ^Display, + window: Window, + colormap_windows: ^[^]Window, + count: ^i32, + ) -> Status --- + // Setting and reading the WM_ICON_SIZE_PROPERTY + XAllocIconSize :: proc() -> ^XIconSize --- + XSetIconSizes :: proc( + display: ^Display, + window: Window, + size_list: [^]XIconSize, + count: i32, + ) --- + XGetIconSizes :: proc( + display: ^Display, + window: Window, + size_list: ^[^]XIconSize, + count: ^i32, + ) -> Status --- } diff --git a/vendor/x11/xlib/xlib_types.odin b/vendor/x11/xlib/xlib_types.odin index 3cee181c8..9122341f3 100644 --- a/vendor/x11/xlib/xlib_types.odin +++ b/vendor/x11/xlib/xlib_types.odin @@ -1162,7 +1162,7 @@ XcmsFunctionSet :: struct { /* ---- X11/Xutil.h --------------------------------------------------------*/ XSizeHints :: struct { - flags: int, + flags: SizeHints, x: i32, y: i32, width: i32, @@ -1181,9 +1181,9 @@ XSizeHints :: struct { } XWMHints :: struct { - flags: int, - input: i32, - initial_state: i32, + flags: WMHints, + input: b32, + initial_state: WMHintState, icon_pixmap: Pixmap, icon_window: Window, icon_x: i32, From 79d3c3be6685105a9912520b11f57f26578131fe Mon Sep 17 00:00:00 2001 From: flysand7 Date: Mon, 13 Nov 2023 19:40:06 +1100 Subject: [PATCH 14/52] [vendor/x11]: Add xlib utility functions, make compileable with -strict-style --- vendor/x11/xlib/xlib_const.odin | 26 ++ vendor/x11/xlib/xlib_procs.odin | 594 +++++++++++++++++++++----------- vendor/x11/xlib/xlib_types.odin | 2 +- 3 files changed, 424 insertions(+), 198 deletions(-) diff --git a/vendor/x11/xlib/xlib_const.odin b/vendor/x11/xlib/xlib_const.odin index 876df9d4b..87b13479e 100644 --- a/vendor/x11/xlib/xlib_const.odin +++ b/vendor/x11/xlib/xlib_const.odin @@ -623,3 +623,29 @@ SizeHintsBits :: enum { PBaseSize = 8, PWinGravity = 9, } + +VisualInfoMask :: bit_set[VisualInfoMaskBits; int] +VisualInfoMaskBits :: enum { + VisualIDMask = 0, + VisualScreenMask = 1, + VisualDepthMask = 2, + VisualClassMask = 3, + VisualRedMaskMask = 4, + VisualGreenMaskMask = 5, + VisualBlueMaskMask = 6, + VisualColormapSizeMask = 7, + VisualBitsPerRGBMask = 8, +} + +VisualNoMask :: VisualInfoMask {} +VisualAllMask :: VisualInfoMask { + .VisualIDMask, + .VisualScreenMask, + .VisualDepthMask, + .VisualClassMask, + .VisualRedMaskMask, + .VisualGreenMaskMask, + .VisualBlueMaskMask, + .VisualColormapSizeMask, + .VisualBitsPerRGBMask, +} diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index d359e48c0..dc2141624 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -90,21 +90,21 @@ foreign xlib { XAddConnectionWatch :: proc( display: ^Display, procedure: XConnectionWatchProc, - data: rawptr + data: rawptr, ) -> Status --- XRemoveConnectionWatch :: proc( display: ^Display, procedure: XConnectionWatchProc, - data: rawptr + data: rawptr, ) -> Status --- XProcessInternalConnections :: proc( display: ^Display, - fd: i32 + fd: i32, ) --- XInternalConnectionNumbers :: proc( display: ^Display, fds: ^[^]i32, - count: ^i32 + count: ^i32, ) -> Status --- // Windows functions XVisualIDFromVisual :: proc(visual: ^Visual) -> VisualID --- @@ -121,7 +121,7 @@ foreign xlib { class: WindowClass, visual: ^Visual, attr_mask: WindowAttributeMask, - attr: ^XSetWindowAttributes + attr: ^XSetWindowAttributes, ) -> Window --- XCreateSimpleWindow :: proc( display: ^Display, @@ -132,7 +132,7 @@ foreign xlib { height: u32, bordersz: u32, border: int, - bg: int + bg: int, ) -> Window --- XDestroyWindow :: proc(display: ^Display, window: Window) --- XDestroySubwindows :: proc(display: ^Display, window: Window) --- @@ -147,19 +147,19 @@ foreign xlib { display: ^Display, window: Window, mask: WindowChangesMask, - values: XWindowChanges + values: XWindowChanges, ) --- XMoveWindow :: proc( display: ^Display, window: Window, x: i32, - y: i32 + y: i32, ) --- XResizeWindow :: proc( display: ^Display, window: Window, width: u32, - height: u32 + height: u32, ) --- XMoveResizeWindow :: proc( display: ^Display, @@ -167,12 +167,12 @@ foreign xlib { x: i32, y: i32, width: u32, - height: u32 + height: u32, ) --- XSetWindowBorderWidth :: proc( display: ^Display, window: Window, - width: u32 + width: u32, ) --- // Window: changing stacking order XRaiseWindow :: proc(display: ^Display, window: Window) --- @@ -186,31 +186,31 @@ foreign xlib { display: ^Display, window: Window, attr_mask: WindowAttributeMask, - attr: XWindowAttributes + attr: XWindowAttributes, ) --- XSetWindowBackground :: proc( display: ^Display, window: Window, - pixel: uint + pixel: uint, ) --- XSetWindowBackgroundMap :: proc( display: ^Display, window: Window, - pixmap: Pixmap + pixmap: Pixmap, ) --- XSetWindowColormap :: proc( display: ^Display, window: Window, - colormap: Colormap + colormap: Colormap, ) --- XDefineCursor :: proc( display: ^Display, window: Window, - cursor: Cursor + cursor: Cursor, ) --- XUndefineCursor :: proc( display: ^Display, - window: Window + window: Window, ) --- // Windows: querying information XQueryTree :: proc( @@ -219,12 +219,12 @@ foreign xlib { root: ^Window, parent: ^Window, children: ^[^]Window, - nchildren: ^u32 + nchildren: ^u32, ) -> Status --- XGetWindowAttributes :: proc( display: ^Display, window: Window, - attr: XWindowAttributes + attr: XWindowAttributes, ) --- XGetGeometry :: proc( display: ^Display, @@ -235,7 +235,7 @@ foreign xlib { width: ^u32, height: ^u32, border_sz: ^u32, - depth: ^u32 + depth: ^u32, ) -> Status --- // Windows: translating screen coordinates XTranslateCoordinates :: proc( @@ -245,7 +245,7 @@ foreign xlib { src_x: i32, src_y: i32, dst_x: ^i32, - dst_y: ^i32 + dst_y: ^i32, ) -> b32 --- XQueryPointer :: proc( display: ^Display, @@ -255,29 +255,29 @@ foreign xlib { root_y: ^i32, x: ^i32, y: ^i32, - mask: ^KeyMask + mask: ^KeyMask, ) -> b32 --- // Atoms XInternAtom :: proc( display: ^Display, name: cstring, - existing: b32 + existing: b32, ) -> Atom --- XInternAtoms :: proc( display: ^Display, names: [^]cstring, count: i32, - atoms: [^]Atom + atoms: [^]Atom, ) -> Status --- XGetAtomName :: proc( display: ^Display, - atom: Atom + atom: Atom, ) -> cstring --- XGetAtomNames :: proc( display: ^Display, atoms: [^]Atom, count: i32, - names: [^]cstring + names: [^]cstring, ) -> Status --- // Windows: Obtaining and changing properties XGetWindowProperty :: proc( @@ -292,12 +292,12 @@ foreign xlib { act_format: [^]i32, nitems: [^]uint, bytes_after: [^]uint, - props: ^rawptr + props: ^rawptr, ) -> i32 --- XListProperties :: proc( display: ^Display, window: Window, - num: ^i32 + num: ^i32, ) -> [^]Atom --- XChangeProperty :: proc( display: ^Display, @@ -307,30 +307,30 @@ foreign xlib { format: i32, mode: i32, data: rawptr, - count: i32 + count: i32, ) --- XRotateWindowProperties :: proc( display: ^Display, window: Window, props: [^]Atom, nprops: i32, - npos: i32 + npos: i32, ) --- XDeleteProperty :: proc( display: ^Display, window: Window, - prop: Atom + prop: Atom, ) --- // Selections XSetSelectionOwner :: proc( display: ^Display, selection: Atom, owber: Window, - time: Time + time: Time, ) --- XGetSelectionOwner :: proc( display: ^Display, - selection: Atom + selection: Atom, ) -> Window --- XConvertSelection :: proc( display: ^Display, @@ -338,7 +338,7 @@ foreign xlib { target: Atom, property: Atom, requestor: Window, - time: Time + time: Time, ) --- // Creating and freeing pixmaps XCreatePixmap :: proc( @@ -346,16 +346,16 @@ foreign xlib { drawable: Drawable, width: u32, height: u32, - depth: u32 + depth: u32, ) -> Pixmap --- XFreePixmap :: proc( display: ^Display, - pixmap: Pixmap + pixmap: Pixmap, ) --- // Creating recoloring and freeing cursors XCreateFontCursor :: proc( display: ^Display, - shape: CursorShape + shape: CursorShape, ) -> Cursor --- XCreateGlyphCursor :: proc( display: ^Display, @@ -364,7 +364,7 @@ foreign xlib { src_char: u32, mask_char: u32, fg: ^XColor, - bg: ^XColor + bg: ^XColor, ) -> Cursor --- XCreatePixmapCursor :: proc( display: ^Display, @@ -373,7 +373,7 @@ foreign xlib { fg: XColor, bg: ^XColor, x: u32, - y: u32 + y: u32, ) -> Cursor --- XQueryBestCursor :: proc( display: ^Display, @@ -381,13 +381,13 @@ foreign xlib { width: u32, height: u32, out_width: ^u32, - out_height: ^u32 + out_height: ^u32, ) -> Status --- XRecolorCursor :: proc( display: ^Display, cursor: Cursor, fg: ^XColor, - bg: ^XColor + bg: ^XColor, ) --- XFreeCursor :: proc(display: ^Display, cursor: Cursor) --- // Creation/destruction of colormaps @@ -395,15 +395,15 @@ foreign xlib { display: ^Display, window: Window, visual: Visual, - alloc: ColormapAlloc + alloc: ColormapAlloc, ) -> Colormap --- XCopyColormapAndFree :: proc( display: ^Display, - colormap: Colormap + colormap: Colormap, ) -> Colormap --- XFreeColormap :: proc( display: ^Display, - colormap: Colormap + colormap: Colormap, ) --- // Mapping color names to values XLookupColor :: proc( @@ -411,7 +411,7 @@ foreign xlib { colomap: Colormap, name: cstring, exact: ^XColor, - screen: ^XColor + screen: ^XColor, ) -> Status --- XcmsLookupColor :: proc( display: ^Display, @@ -419,26 +419,26 @@ foreign xlib { name: cstring, exact: XcmsColor, screen: XcmsColor, - format: XcmsColorFormat + format: XcmsColorFormat, ) -> Status --- // Allocating and freeing color cells XAllocColor :: proc( display: ^Display, colormap: Colormap, - screen: ^XColor + screen: ^XColor, ) -> Status --- XcmsAllocColor :: proc( display: ^Display, colormap: Colormap, color: ^XcmsColor, - format: XcmsColorFormat + format: XcmsColorFormat, ) -> Status --- XAllocNamedColor :: proc( display: ^Display, colormap: Colormap, name: cstring, screen: ^XColor, - exact: ^XColor + exact: ^XColor, ) -> Status --- XcmsAllocNamedColor :: proc( display: ^Display, @@ -446,7 +446,7 @@ foreign xlib { name: cstring, screen: ^XcmsColor, exact: ^XcmsColor, - format: XcmsColorFormat + format: XcmsColorFormat, ) -> Status --- XAllocColorCells :: proc( display: ^Display, @@ -455,7 +455,7 @@ foreign xlib { pmasks: [^]uint, np: u32, pixels: [^]uint, - npixels: u32 + npixels: u32, ) -> Status --- XAllocColorPlanes :: proc( display: ^Display, @@ -468,74 +468,74 @@ foreign xlib { nblues: i32, rmask: [^]uint, gmask: [^]uint, - bmask: [^]uint + bmask: [^]uint, ) -> Status --- XFreeColors :: proc( display: ^Display, colormap: Colormap, pixels: [^]uint, npixels: i32, - planes: uint + planes: uint, ) --- // Modifying and querying colormap cells XStoreColor :: proc( display: ^Display, colormap: Colormap, - color: ^XColor + color: ^XColor, ) --- XStoreColors :: proc( display: ^Display, colormap: Colormap, color: [^]XColor, - ncolors: i32 + ncolors: i32, ) --- XcmsStoreColor :: proc( display: ^Display, colormap: Colormap, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsStoreColors :: proc( display: ^Display, colormap: Colormap, colors: [^]XcmsColor, ncolors: XcmsColor, - cflags: [^]b32 + cflags: [^]b32, ) -> Status --- XStoreNamedColor :: proc( display: ^Display, colormap: Colormap, name: cstring, pixel: uint, - flags: ColorFlags + flags: ColorFlags, ) --- XQueryColor :: proc( display: ^Display, colormap: Colormap, - color: ^XColor + color: ^XColor, ) --- XQueryColors :: proc( display: ^Display, colormap: Colormap, colors: [^]XColor, - ncolors: i32 + ncolors: i32, ) --- XcmsQueryColor :: proc( display: ^Display, colormap: Colormap, color: ^XcmsColor, - format: XcmsColorFormat + format: XcmsColorFormat, ) -> Status --- XcmsQueryColors :: proc( display: ^Display, colormap: Colormap, color: [^]XcmsColor, ncolors: i32, - format: XcmsColorFormat + format: XcmsColorFormat, ) -> Status --- // Getting and setting the color conversion context (CCC) of a colormap XcmsCCCOfColormap :: proc( display: ^Display, - colormap: Colormap + colormap: Colormap, ) -> XcmsCCC --- XcmsSetCCCOfColormap :: proc( display: ^Display, @@ -554,17 +554,17 @@ foreign xlib { // Modifying the attributes of color conversion context XcmsSetWhitePoint :: proc( ccc: XcmsCCC, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsSetCompressionProc :: proc( ccc: XcmsCCC, cproc: XcmsCompressionProc, - data: rawptr + data: rawptr, ) -> XcmsCompressionProc --- XcmsSetWhiteAdjustProc :: proc( ccc: XcmsCCC, aproc: XcmsWhiteAdjustProc, - data: rawptr + data: rawptr, ) -> XcmsWhiteAdjustProc --- // Creating and freeing the color conversion context XcmsCreateCCC :: proc( @@ -575,7 +575,7 @@ foreign xlib { cproc: XcmsCompressionProc, cdata: rawptr, aproc: XcmsWhiteAdjustProc, - adata: rawptr + adata: rawptr, ) -> XcmsCCC --- XcmsFreeCCC :: proc(ccc: XcmsCCC) --- // Converting between colorspaces @@ -584,7 +584,7 @@ foreign xlib { colors: [^]XcmsColor, ncolors: u32, format: XcmsColorFormat, - cflags: [^]b32 + cflags: [^]b32, ) -> Status --- // Pre-defined gamut compression callbacks XcmsCIELabClipL :: proc( @@ -592,63 +592,63 @@ foreign xlib { colors: [^]XcmsColor, ncolors: u32, index: u32, - flags: [^]b32 + flags: [^]b32, ) -> Status --- XcmsCIELabClipab :: proc( ctx: XcmsCCC, colors: [^]XcmsColor, ncolors: u32, index: u32, - flags: [^]b32 + flags: [^]b32, ) -> Status --- XcmsCIELabClipLab :: proc( ctx: XcmsCCC, colors: [^]XcmsColor, ncolors: u32, index: u32, - flags: [^]b32 + flags: [^]b32, ) -> Status --- XcmsCIELuvClipL :: proc( ctx: XcmsCCC, colors: [^]XcmsColor, ncolors: u32, index: u32, - flags: [^]b32 + flags: [^]b32, ) -> Status --- XcmsCIELuvClipuv :: proc( ctx: XcmsCCC, colors: [^]XcmsColor, ncolors: u32, index: u32, - flags: [^]b32 + flags: [^]b32, ) -> Status --- XcmsCIELuvClipLuv :: proc( ctx: XcmsCCC, colors: [^]XcmsColor, ncolors: u32, index: u32, - flags: [^]b32 + flags: [^]b32, ) -> Status --- XcmsTekHVCClipV :: proc( ctx: XcmsCCC, colors: [^]XcmsColor, ncolors: u32, index: u32, - flags: [^]b32 + flags: [^]b32, ) -> Status --- XcmsTekHVCClipC :: proc( ctx: XcmsCCC, colors: [^]XcmsColor, ncolors: u32, index: u32, - flags: [^]b32 + flags: [^]b32, ) -> Status --- XcmsTekHVCClipVC :: proc( ctx: XcmsCCC, colors: [^]XcmsColor, ncolors: u32, index: u32, - flags: [^]b32 + flags: [^]b32, ) -> Status --- // Pre-defined white-point adjustment procedures XcmsCIELabWhiteShiftColors :: proc( @@ -658,7 +658,7 @@ foreign xlib { target_format: XcmsColorFormat, colors: [^]XcmsColor, ncolors: u32, - compression: [^]b32 + compression: [^]b32, ) -> Status --- XcmsCIELuvWhiteShiftColors :: proc( ctx: XcmsCCC, @@ -667,7 +667,7 @@ foreign xlib { target_format: XcmsColorFormat, colors: [^]XcmsColor, ncolors: u32, - compression: [^]b32 + compression: [^]b32, ) -> Status --- XcmsTekHVCWhiteShiftColors :: proc( ctx: XcmsCCC, @@ -676,136 +676,136 @@ foreign xlib { target_format: XcmsColorFormat, colors: [^]XcmsColor, ncolors: u32, - compression: [^]b32 + compression: [^]b32, ) -> Status --- // Color querying XcmsQueryBlack :: proc( ccc: XcmsCCC, format: XcmsColorFormat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsQueryBlue :: proc( ccc: XcmsCCC, format: XcmsColorFormat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsQueryGreen :: proc( ccc: XcmsCCC, format: XcmsColorFormat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsQueryRed :: proc( ccc: XcmsCCC, format: XcmsColorFormat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsQueryWhite :: proc( ccc: XcmsCCC, format: XcmsColorFormat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- // CIELab queries XcmsCIELabQueryMaxC :: proc( ccc: XcmsCCC, hue: XcmsFloat, lstar: XcmsFloat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsCIELabQueryMaxL :: proc( ccc: XcmsCCC, hue: XcmsFloat, chroma: XcmsFloat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsCIELabQueryMaxLC :: proc( ccc: XcmsCCC, hue: XcmsFloat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsCIELabQueryMinL :: proc( ccc: XcmsCCC, hue: XcmsFloat, chroma: XcmsFloat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- // CIEluv queries XcmsCIELuvQueryMaxC :: proc( ccc: XcmsCCC, hue: XcmsFloat, lstar: XcmsFloat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsCIELuvQueryMaxL :: proc( ccc: XcmsCCC, hue: XcmsFloat, chroma: XcmsFloat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsCIELuvQueryMaxLC :: proc( ccc: XcmsCCC, hue: XcmsFloat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsCIELuvQueryMinL :: proc( ccc: XcmsCCC, hue: XcmsFloat, chroma: XcmsFloat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- // TexHVX queries XcmsTekHVCQueryMaxC :: proc( ccc: XcmsCCC, hue: XcmsFloat, value: XcmsFloat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsTekHVCQueryMaxV :: proc( ccc: XcmsCCC, hue: XcmsFloat, chroma: XcmsFloat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsTekHVCQueryMaxVC :: proc( ccc: XcmsCCC, hue: XcmsFloat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- XcmsTekHVCQueryMaxVSamples :: proc( ccc: XcmsCCC, hue: XcmsFloat, colors: [^]XcmsColor, - nsamples: u32 + nsamples: u32, ) -> Status --- XcmsTekHVCQueryMinV :: proc( ccc: XcmsCCC, hue: XcmsFloat, chroma: XcmsFloat, - color: ^XcmsColor + color: ^XcmsColor, ) -> Status --- // Graphics context functions XCreateGC :: proc( display: ^Display, drawable: Drawable, mask: GCAttributeMask, - attr: ^XGCValues + attr: ^XGCValues, ) -> GC --- XCopyGC :: proc( display: ^Display, src: GC, dst: GC, - mask: GCAttributeMask + mask: GCAttributeMask, ) --- XChangeGC :: proc( display: ^Display, gc: GC, mask: GCAttributeMask, - values: ^XGCValues + values: ^XGCValues, ) --- XGetGCValues :: proc( display: ^Display, gc: GC, mask: GCAttributeMask, - values: ^XGCValues + values: ^XGCValues, ) -> Status --- XFreeGC :: proc(display: ^Display, gc: GC) --- XGCContextFromGC :: proc(gc: GC) -> GContext --- @@ -817,27 +817,27 @@ foreign xlib { fg: uint, bg: uint, fn: GCFunction, - pmask: uint + pmask: uint, ) --- XSetForeground :: proc( display: ^Display, gc: GC, - fg: uint + fg: uint, ) --- XSetBackground :: proc( display: ^Display, gc: GC, - bg: uint + bg: uint, ) --- XSetFunction :: proc( display: ^Display, gc: GC, - fn: GCFunction + fn: GCFunction, ) --- XSetPlaneMask :: proc( display: ^Display, gc: GC, - pmask: uint + pmask: uint, ) --- XSetLineAttributes :: proc( display: ^Display, @@ -845,24 +845,24 @@ foreign xlib { width: u32, line_style: LineStyle, cap_style: CapStyle, - join_style: JoinStyle + join_style: JoinStyle, ) --- XSetDashes :: proc( display: ^Display, gc: GC, dash_offs: i32, dash_list: [^]i8, - n: i32 + n: i32, ) --- XSetFillStyle :: proc( display: ^Display, gc: GC, - style: FillStyle + style: FillStyle, ) --- XSetFillRule :: proc( display: ^Display, gc: GC, - rule: FillRule + rule: FillRule, ) --- XQueryBestSize :: proc( display: ^Display, @@ -871,7 +871,7 @@ foreign xlib { width: u32, height: u32, out_width: ^u32, - out_height: ^u32 + out_height: ^u32, ) -> Status --- XQueryBestTile :: proc( display: ^Display, @@ -879,7 +879,7 @@ foreign xlib { width: u32, height: u32, out_width: ^u32, - out_height: ^u32 + out_height: ^u32, ) -> Status --- XQueryBestStripple :: proc( display: ^Display, @@ -887,7 +887,7 @@ foreign xlib { width: u32, height: u32, out_width: u32, - out_height: u32 + out_height: u32, ) -> Status --- XSetTile :: proc(display: ^Display, gc: GC, tile: Pixmap) --- XSetStripple :: proc(display: ^Display, gc: GC, stripple: Pixmap) --- @@ -902,7 +902,7 @@ foreign xlib { y: i32, rects: [^]XRectangle, n: i32, - ordering: i32 + ordering: i32, ) --- XSetArcMode :: proc(display: ^Display, gc: GC, mode: ArcMode) --- XSetSubwindowMode :: proc(display: ^Display, gc: GC, mode: SubwindowMode) --- @@ -915,11 +915,11 @@ foreign xlib { y: i32, width: u32, height: u32, - exp: b32 + exp: b32, ) --- XClearWindow :: proc( display: ^Display, - window: Window + window: Window, ) --- XCopyArea :: proc( display: ^Display, @@ -931,7 +931,7 @@ foreign xlib { width: u32, height: u32, dst_x: i32, - dst_y: i32 + dst_y: i32, ) --- XCopyPlane :: proc( display: ^Display, @@ -944,7 +944,7 @@ foreign xlib { height: u32, dst_x: i32, dst_y: i32, - plane: uint + plane: uint, ) --- // Drawing lines, points, rectangles and arc XDrawPoint :: proc( @@ -952,7 +952,7 @@ foreign xlib { drawable: Drawable, gc: GC, x: i32, - y: i32 + y: i32, ) --- XDrawPoints :: proc( display: Display, @@ -960,7 +960,7 @@ foreign xlib { gc: GC, point: [^]XPoint, npoints: i32, - mode: CoordMode + mode: CoordMode, ) --- XDrawLine :: proc( display: ^Display, @@ -969,21 +969,21 @@ foreign xlib { x1: i32, y1: i32, x2: i32, - y2: i32 + y2: i32, ) --- XDrawLines :: proc( display: ^Display, drawable: Drawable, gc: GC, points: [^]XPoint, - npoints: i32 + npoints: i32, ) --- XDrawSegments :: proc( display: ^Display, drawable: Drawable, gc: GC, segs: [^]XSegment, - nsegs: i32 + nsegs: i32, ) --- XDrawRectangle :: proc( display: ^Display, @@ -992,14 +992,14 @@ foreign xlib { x: i32, y: i32, width: u32, - height: u32 + height: u32, ) --- XDrawRectangles :: proc( display: ^Display, drawable: Drawable, gc: GC, rects: [^]XRectangle, - nrects: i32 + nrects: i32, ) --- XDrawArc :: proc( display: ^Display, @@ -1010,14 +1010,14 @@ foreign xlib { width: u32, height: u32, angle1: i32, - angle2: i32 + angle2: i32, ) --- XDrawArcs :: proc( display: ^Display, drawable: Drawable, gc: GC, arcs: [^]XArc, - narcs: i32 + narcs: i32, ) --- // Filling areas XFillRectangle :: proc( @@ -1027,14 +1027,14 @@ foreign xlib { x: i32, y: i32, width: u32, - height: u32 + height: u32, ) --- XFillRectangles :: proc( display: ^Display, drawable: Drawable, gc: GC, rects: [^]XRectangle, - nrects: i32 + nrects: i32, ) --- XFillPolygon :: proc( display: ^Display, @@ -1043,7 +1043,7 @@ foreign xlib { points: [^]XPoint, npoints: i32, shape: Shape, - mode: CoordMode + mode: CoordMode, ) --- XFillArc :: proc( display: ^Display, @@ -1054,14 +1054,14 @@ foreign xlib { width: u32, height: u32, angle1: i32, - angle2: i32 + angle2: i32, ) --- XFillArcs :: proc( display: ^Display, drawable: Drawable, gc: GC, arcs: [^]XArc, - narcs: i32 + narcs: i32, ) --- // Font metrics XLoadFont :: proc(display: ^Display, name: cstring) -> Font --- @@ -1077,7 +1077,7 @@ foreign xlib { pat: cstring, max: i32, count: ^i32, - info: ^[^]XFontStruct + info: ^[^]XFontStruct, ) -> [^]cstring --- XFreeFontInfo :: proc(names: [^]cstring, info: [^]XFontStruct, count: i32) --- // Computing character string sizes @@ -1090,7 +1090,7 @@ foreign xlib { direction: ^FontDirection, ascent: ^i32, descent: ^i32, - ret: ^XCharStruct + ret: ^XCharStruct, ) --- XTextExtents16 :: proc( font_struct: ^XFontStruct, @@ -1099,7 +1099,7 @@ foreign xlib { direction: ^FontDirection, ascent: ^i32, descent: ^i32, - ret: ^XCharStruct + ret: ^XCharStruct, ) --- XQueryTextExtents :: proc( display: ^Display, @@ -1109,7 +1109,7 @@ foreign xlib { direction: ^FontDirection, ascent: ^i32, descent: ^i32, - ret: ^XCharStruct + ret: ^XCharStruct, ) --- XQueryTextExtents16 :: proc( display: ^Display, @@ -1119,7 +1119,7 @@ foreign xlib { direction: ^FontDirection, ascent: ^i32, descent: ^i32, - ret: ^XCharStruct + ret: ^XCharStruct, ) --- // Drawing complex text XDrawText :: proc( @@ -1129,7 +1129,7 @@ foreign xlib { x: i32, y: i32, items: XTextItem, - nitems: i32 + nitems: i32, ) --- XDrawText16 :: proc( display: ^Display, @@ -1138,7 +1138,7 @@ foreign xlib { x: i32, y: i32, items: XTextItem16, - nitems: i32 + nitems: i32, ) --- // Drawing text characters XDrawString :: proc( @@ -1148,7 +1148,7 @@ foreign xlib { x: i32, y: i32, string: [^]u8, - length: i32 + length: i32, ) --- XDrawString16 :: proc( display: ^Display, @@ -1157,7 +1157,7 @@ foreign xlib { x: i32, y: i32, string: [^]XChar2b, - length: i32 + length: i32, ) --- XDrawImageString :: proc( display: ^Display, @@ -1166,7 +1166,7 @@ foreign xlib { x: i32, y: i32, string: [^]u8, - length: i32 + length: i32, ) --- XDrawImageString16 :: proc( display: ^Display, @@ -1175,7 +1175,7 @@ foreign xlib { x: i32, y: i32, string: [^]XChar2b, - length: i32 + length: i32, ) --- // Transferring images between client and server XInitImage :: proc(image: ^XImage) -> Status --- @@ -1189,7 +1189,7 @@ foreign xlib { dst_x: i32, dst_y: i32, width: u32, - height: u32 + height: u32, ) --- XGetImage :: proc( display: ^Display, @@ -1199,7 +1199,7 @@ foreign xlib { width: u32, height: u32, mask: uint, - format: ImageFormat + format: ImageFormat, ) -> ^XImage --- XGetSubImage :: proc( display: ^Display, @@ -1212,7 +1212,7 @@ foreign xlib { format: ImageFormat, dst: ^XImage, dst_x: i32, - dst_y: i32 + dst_y: i32, ) -> ^XImage --- // Window and session manager functions XReparentWindow :: proc( @@ -1220,20 +1220,20 @@ foreign xlib { window: Window, parent: Window, x: i32, - y: i32 + y: i32, ) --- XChangeSaveSet :: proc( display: ^Display, window: Window, - mode: SaveSetChangeMode + mode: SaveSetChangeMode, ) --- XAddToSaveSet :: proc( display: ^Display, - window: Window + window: Window, ) --- XRemoveFromSaveSet :: proc( display: ^Display, - window: Window + window: Window, ) --- // Managing installed colormaps XInstallColormap :: proc(display: ^Display, colormap: Colormap) --- @@ -1254,7 +1254,7 @@ foreign xlib { timeout: i32, interval: i32, blanking: ScreenSaverBlanking, - exposures: ScreenSavingExposures + exposures: ScreenSavingExposures, ) --- XForceScreenSaver :: proc(display: ^Display, mode: ScreenSaverForceMode) --- XActivateScreenSaver :: proc(display: ^Display) --- @@ -1264,7 +1264,7 @@ foreign xlib { timeout: ^i32, interval: ^i32, blanking: ^ScreenSaverBlanking, - exposures: ^ScreenSavingExposures + exposures: ^ScreenSavingExposures, ) --- // Controlling host address XAddHost :: proc(display: ^Display, addr: ^XHostAddress) --- @@ -1289,58 +1289,58 @@ foreign xlib { display: ^Display, event: ^XEvent, predicate: #type proc "c" (display: ^Display, event: ^XEvent, ctx: rawptr) -> b32, - ctx: rawptr + ctx: rawptr, ) --- XCheckIfEvent :: proc( display: ^Display, event: ^XEvent, predicate: #type proc "c" (display: ^Display, event: ^XEvent, ctx: rawptr) -> b32, - arg: rawptr + arg: rawptr, ) -> b32 --- XPeekIfEvent :: proc( display: ^Display, event: ^XEvent, predicate: #type proc "c" (display: ^Display, event: ^XEvent, ctx: rawptr) -> b32, - ctx: rawptr + ctx: rawptr, ) --- // Selecting events using a window or event mask XWindowEvent :: proc( display: ^Display, window: Window, mask: EventMask, - event: ^XEvent + event: ^XEvent, ) --- XCheckWindowEvent :: proc( display: ^Display, window: Window, mask: EventMask, - event: ^XEvent + event: ^XEvent, ) -> b32 --- XMaskEvent :: proc( display: ^Display, mask: EventMask, - event: ^XEvent + event: ^XEvent, ) --- XCheckMaskEvent :: proc( display: ^Display, mask: EventMask, - event: ^XEvent + event: ^XEvent, ) -> b32 --- XCheckTypedEvent :: proc( display: ^Display, type: EventType, - event: ^XEvent + event: ^XEvent, ) -> b32 --- XCheckTypedWindowEvent :: proc( display: ^Display, window: Window, type: EventType, - event: ^XEvent + event: ^XEvent, ) -> b32 --- // Putting events back XPutBackEvent :: proc( display: ^Display, - event: ^XEvent + event: ^XEvent, ) --- // Sending events to other applications XSendEvent :: proc( @@ -1348,7 +1348,7 @@ foreign xlib { window: Window, propagate: b32, mask: EventMask, - event: ^XEvent + event: ^XEvent, ) -> Status --- // Getting the history of pointer motion XDisplayMotionBufferSize :: proc(display: ^Display) -> uint --- @@ -1357,26 +1357,26 @@ foreign xlib { window: Window, start: Time, stop: Time, - nevents: ^i32 + nevents: ^i32, ) -> [^]XTimeCoord --- // Enabling or disabling synchronization XSetAfterFunction :: proc( display: ^Display, - procedure: #type proc "c" (display: ^Display) -> i32 + procedure: #type proc "c" (display: ^Display) -> i32, ) -> i32 --- XSynchronize :: proc( display: ^Display, - onoff: b32 + onoff: b32, ) -> i32 --- // Error handling XSetErrorHandler :: proc( - handler: #type proc "c" (display: ^Display, event: ^XErrorEvent) -> i32 + handler: #type proc "c" (display: ^Display, event: ^XErrorEvent) -> i32, ) -> i32 --- XGetErrorText :: proc( display: ^Display, code: i32, buffer: [^]u8, - size: i32 + size: i32, ) --- XGetErrorDatabaseText :: proc( display: ^Display, @@ -1384,11 +1384,11 @@ foreign xlib { message: cstring, default_string: cstring, buffer: [^]u8, - size: i32 + size: i32, ) --- XDisplayName :: proc(string: cstring) -> cstring --- XSetIOErrorHandler :: proc( - handler: #type proc "c" (display: ^Display) -> i32 + handler: #type proc "c" (display: ^Display) -> i32, ) -> i32 --- // Pointer grabbing XGrabPointer :: proc( @@ -1400,17 +1400,17 @@ foreign xlib { keyboard_mode: GrabMode, confine_to: Window, cursor: Cursor, - time: Time + time: Time, ) -> i32 --- XUngrabPointer :: proc( display: ^Display, - time: Time + time: Time, ) -> i32 --- XChangeActivePointerGrab :: proc( display: ^Display, event_mask: EventMask, cursor: Cursor, - time: Time + time: Time, ) --- XGrabButton :: proc( display: ^Display, @@ -1422,13 +1422,13 @@ foreign xlib { pointer_mode: GrabMode, keyboard_mode: GrabMode, confine_to: Window, - cursor: Cursor + cursor: Cursor, ) --- XUngrabButton :: proc( display: ^Display, button: u32, modifiers: InputMask, - grab_window: Window + grab_window: Window, ) --- XGrabKeyboard :: proc( display: ^Display, @@ -1436,11 +1436,11 @@ foreign xlib { owner_events: b32, pointer_mode: GrabMode, keyboard_mode: GrabMode, - time: Time + time: Time, ) -> i32 --- XUngrabKeyboard :: proc( display: ^Display, - time: Time + time: Time, ) --- XGrabKey :: proc( display: ^Display, @@ -1449,13 +1449,13 @@ foreign xlib { grab_window: Window, owner_events: b32, pointer_mode: GrabMode, - keyboard_mode: GrabMode + keyboard_mode: GrabMode, ) --- XUngrabKey :: proc( display: ^Display, keycode: i32, modifiers: InputMask, - grab_window: Window + grab_window: Window, ) --- // Resuming event processing XAllowEvents :: proc(display: ^Display, evend_mode: AllowEventsMode, time: Time) --- @@ -1469,29 +1469,29 @@ foreign xlib { src_width: u32, src_height: u32, dst_x: i32, - dst_y: i32 + dst_y: i32, ) --- // Controlling input focus XSetInputFocus :: proc( display: ^Display, focus: Window, revert_to: FocusRevert, - time: Time + time: Time, ) --- XGetInputFocus :: proc( display: ^Display, focus: ^Window, - revert_to: ^FocusRevert + revert_to: ^FocusRevert, ) --- // Manipulating the keyboard and pointer settings XChangeKeyboardControl :: proc( display: ^Display, mask: KeyboardControlMask, - values: ^XKeyboardControl + values: ^XKeyboardControl, ) --- XGetKeyboardControl :: proc( display: ^Display, - values: ^XKeyboardState + values: ^XKeyboardState, ) --- XAutoRepeatOn :: proc(display: ^Display) --- XAutoRepeatOff :: proc(display: ^Display) --- @@ -1505,43 +1505,43 @@ foreign xlib { do_threshold: b32, accel_numerator: i32, accel_denominator: i32, - threshold: i32 + threshold: i32, ) --- XGetPointerControl :: proc( display: ^Display, accel_numerator: ^i32, accel_denominator: ^i32, - threshold: ^i32 + threshold: ^i32, ) --- // Manipulating the keyboard encoding XDisplayKeycodes :: proc( display: ^Display, min_keycodes: ^i32, - max_keycodes: ^i32 + max_keycodes: ^i32, ) --- XGetKeyboardMapping :: proc( display: ^Display, first: KeyCode, count: i32, - keysyms_per: ^i32 + keysyms_per: ^i32, ) -> ^KeySym --- XChangeKeyboardMapping :: proc( display: ^Display, first: KeyCode, keysyms_per: i32, keysyms: [^]KeySym, - num_codes: i32 + num_codes: i32, ) --- XNewModifiermap :: proc(max_keys_per_mode: i32) -> ^XModifierKeymap --- XInsertModifiermapEntry :: proc( modmap: ^XModifierKeymap, keycode_entry: KeyCode, - modifier: i32 + modifier: i32, ) -> ^XModifierKeymap --- XDeleteModifiermapEntry :: proc( modmap: ^XModifierKeymap, keycode_entry: KeyCode, - modifier: i32 + modifier: i32, ) -> ^XModifierKeymap --- XFreeModifiermap :: proc(modmap: ^XModifierKeymap) --- XSetModifierMapping :: proc(display: ^Display, modmap: ^XModifierKeymap) -> i32 --- @@ -1568,7 +1568,7 @@ foreign xlib { XSetWMName :: proc( display: ^Display, window: Window, - prop: ^XTextProperty + prop: ^XTextProperty, ) --- XGetWMName :: proc( display: ^Display, @@ -1578,17 +1578,17 @@ foreign xlib { XStoreName :: proc( display: ^Display, window: Window, - name: cstring + name: cstring, ) --- XFetchName :: proc( display: ^Display, window: Window, - name: ^cstring + name: ^cstring, ) -> Status --- XSetWMIconName :: proc( display: ^Display, window: Window, - prop: ^XTextProperty + prop: ^XTextProperty, ) --- XGetWMIconName :: proc( display: ^Display, @@ -1676,7 +1676,7 @@ foreign xlib { display: ^Display, window: Window, protocols: ^[^]Atom, - count: ^i32 + count: ^i32, ) -> Status --- // Setting and reading the WM_COLORMAP_WINDOWS property XSetWMColormapWindows :: proc( @@ -1705,4 +1705,204 @@ foreign xlib { size_list: ^[^]XIconSize, count: ^i32, ) -> Status --- + // Using window manager convenience functions + XmbSetWMProperties :: proc( + display: ^Display, + window: Window, + window_name: cstring, + icon_name: cstring, + argv: [^]cstring, + argc: i32, + normal_hints: ^XSizeHints, + wm_hints: ^XWMHints, + class_hints: ^XClassHint, + ) --- + XSetWMProperties :: proc( + display: ^Display, + window: Window, + window_name: ^XTextProperty, + argv: [^]cstring, + argc: i32, + normal_hints: ^XSizeHints, + wm_hints: ^XWMHints, + class_hints: ^XWMHints, + ) --- + // Client to session manager communication + XSetCommand :: proc( + display: ^Display, + window: Window, + argv: [^]cstring, + argc: i32, + ) --- + XGetCommand :: proc( + display: ^Display, + window: Window, + argv: ^[^]cstring, + argc: ^i32, + ) -> Status --- + XSetWMClientMachine :: proc( + display: ^Display, + window: Window, + prop: ^XTextProperty, + ) --- + XGetWMClientMachine :: proc( + display: ^Display, + window: Window, + prop: ^XTextProperty, + ) -> Status --- + XSetRGBColormaps :: proc( + display: ^Display, + window: Window, + colormap: ^XStandardColormap, + prop: Atom, + ) --- + XGetRGBColormaps :: proc( + display: ^Display, + window: Window, + colormap: ^[^]XStandardColormap, + count: ^i32, + prop: Atom, + ) -> Status --- + // Keyboard utility functions + XLookupKeysym :: proc( + event: ^XKeyEvent, + index: i32, + ) -> KeySym --- + XKeycodeToKeysym :: proc( + display: ^Display, + keycode: KeyCode, + index: i32, + ) -> KeySym --- + XKeysymToKeycode :: proc( + display: ^Display, + keysym: KeySym, + ) -> KeyCode --- + XRefreshKeyboardMapping :: proc(event_map: ^XMappingEvent) --- + XConvertCase :: proc( + keysym: KeySym, + lower: ^KeySym, + upper: ^KeySym, + ) --- + XStringToKeysym :: proc(str: cstring) -> KeySym --- + XKeysymToString :: proc(keysym: KeySym) -> cstring --- + XLookupString :: proc( + event: ^XKeyEvent, + buffer: [^]u8, + count: i32, + keysym: ^KeySym, + status: ^XComposeStatus, + ) -> i32 --- + XRebindKeysym :: proc( + display: ^Display, + keysym: KeySym, + list: [^]KeySym, + mod_count: i32, + string: [^]u8, + num_bytes: i32, + ) --- + // Allocating permanent storage + XPermalloc :: proc(size: u32) -> rawptr --- + // Parsing the window geometry + XParseGeometry :: proc( + parsestring: cstring, + x_ret: ^i32, + y_ret: ^i32, + width: ^u32, + height: ^u32, + ) -> i32 --- + XWMGeometry :: proc( + display: ^Display, + screen_no: i32, + user_geom: cstring, + def_geom: cstring, + bwidth: u32, + hints: ^XSizeHints, + x_ret: ^i32, + y_ret: ^i32, + w_ret: ^u32, + h_ret: ^u32, + grav: ^Gravity, + ) -> i32 --- + // Creating, copying and destroying regions + XCreateRegion :: proc() -> Region --- + XPolygonRegion :: proc( + points: [^]XPoint, + n: i32, + fill: FillRule, + ) -> Region --- + XSetRegion :: proc( + display: ^Display, + gc: GC, + region: Region, + ) --- + XDestroyRegion :: proc(r: Region) --- + // Moving or shrinking regions + XOffsetRegion :: proc(region: Region, dx, dy: i32) --- + XShrinkRegion :: proc(region: Region, dx, dy: i32) --- + // Computing with regions + XClipBox :: proc(region: Region, rect: ^XRectangle) --- + XIntersectRegion :: proc(sra, srb, ret: Region) --- + XUnionRegion :: proc(sra, srb, ret: Region) --- + XUnionRectWithRegion :: proc(rect: ^XRectangle, src, dst: Region) --- + XSubtractRegion :: proc(sra, srb, ret: Region) --- + XXorRegion :: proc(sra, srb, ret: Region) --- + XEmptyRegion :: proc(reg: Region) -> b32 --- + XEqualRegion :: proc(a,b: Region) -> b32 --- + XPointInRegion :: proc(reg: Region, x,y: i32) -> b32 --- + XRectInRegion :: proc(reg: Region, x,y: i32, w,h: u32) -> b32 --- + // Using cut buffers + XStoreBytes :: proc(display: ^Display, bytes: [^]u8, nbytes: i32) --- + XStoreBuffer :: proc(display: ^Display, bytes: [^]u8, nbytes: i32, buffer: i32) --- + XFetchBytes :: proc(display: ^Display, nbytes: ^i32) -> [^]u8 --- + XFetchBuffer :: proc(display: ^Display, nbytes: ^i32, buffer: i32) -> [^]u8 --- + // Determining the appropriate visual types + XGetVisualInfo :: proc( + display: ^Display, + mask: VisualInfoMask, + info: ^XVisualInfo, + nret: ^i32, + ) -> [^]XVisualInfo --- + XMatchVisualInfo :: proc( + display: ^Display, + screen_no: i32, + depth: i32, + class: i32, + ret: ^XVisualInfo, + ) -> Status --- + // Manipulating images + XCreateImage :: proc( + display: ^Display, + visual: ^Visual, + depth: u32, + format: ImageFormat, + offset: i32, + data: rawptr, + width: u32, + height: u32, + pad: i32, + stride: i32, + ) -> ^XImage --- + XGetPixel :: proc( + image: ^XImage, + x: i32, + y: i32, + ) -> uint --- + XPutPixel :: proc( + image: ^XImage, + x: i32, + y: i32, + pixel: uint, + ) --- + XSubImage :: proc( + image: ^XImage, + x: i32, + y: i32, + w: u32, + h: u32, + ) -> ^XImage --- + XAddPixel :: proc( + image: ^XImage, + value: int, + ) --- + XDestroyImage :: proc(image: ^XImage) --- } diff --git a/vendor/x11/xlib/xlib_types.odin b/vendor/x11/xlib/xlib_types.odin index 9122341f3..2411c038c 100644 --- a/vendor/x11/xlib/xlib_types.odin +++ b/vendor/x11/xlib/xlib_types.odin @@ -360,7 +360,7 @@ XMotionEvent :: struct { same_screen: b32, } -XPointerMovedEvent :: XMotionEvent; +XPointerMovedEvent :: XMotionEvent XCrossingEvent :: struct { type: EventType, From 1b770fc3b279d2b0529419ec0d6be9a0e6539b22 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Mon, 13 Nov 2023 19:45:26 +1100 Subject: [PATCH 15/52] [vendor/x11]: Correction on XPutImage definition --- vendor/x11/xlib/xlib_procs.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index dc2141624..1ea389620 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -1183,7 +1183,7 @@ foreign xlib { display: ^Display, drawable: Drawable, gc: GC, - image: XImage, + image: ^XImage, src_x: i32, src_y: i32, dst_x: i32, From 5f7843a13d457eff3bac837f0ce1e5ff1ed2a9dc Mon Sep 17 00:00:00 2001 From: flysand7 Date: Mon, 13 Nov 2023 19:49:23 +1100 Subject: [PATCH 16/52] [vendor/x11]: Correct system import for linux --- vendor/x11/xlib/xlib_procs.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index 1ea389620..7abe1dcc2 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -1,7 +1,7 @@ //+build linux, openbsd, freebsd package xlib -foreign import xlib "system:x11" +foreign import xlib "system:X11" foreign xlib { @(link_name="_Xdebug") _Xdebug: i32 } From 2cb5cc774df173b2c08724ab2a5474bde6177a14 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Mon, 13 Nov 2023 19:51:35 +1100 Subject: [PATCH 17/52] [vendor/x11]: Add build guards for other xlib files --- vendor/x11/xlib/xlib_const.odin | 2 +- vendor/x11/xlib/xlib_keysym.odin | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/x11/xlib/xlib_const.odin b/vendor/x11/xlib/xlib_const.odin index 87b13479e..910940dec 100644 --- a/vendor/x11/xlib/xlib_const.odin +++ b/vendor/x11/xlib/xlib_const.odin @@ -1,4 +1,4 @@ - +//+build linux, freebsd, openbsd package xlib // Special values for many types. Most of these constants diff --git a/vendor/x11/xlib/xlib_keysym.odin b/vendor/x11/xlib/xlib_keysym.odin index c712bf784..594d966a4 100644 --- a/vendor/x11/xlib/xlib_keysym.odin +++ b/vendor/x11/xlib/xlib_keysym.odin @@ -1,4 +1,4 @@ - +//+build linux, freebsd, openbsd package xlib KeySym :: enum u32 { From 9078ddaf5a89b1b8d46f0fa7d86dee027f686f5a Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 9 Nov 2023 12:12:01 +0100 Subject: [PATCH 18/52] Allow larger thread poly data The poly data currently has the restriction of being less than a pointer's size, but there is much more space in the `Thread.user_args` array which can be utilized, this commit allows you to pass types that are larger than pointer length as long as the total size of the poly data is less than that of the `Thread.user_args`. --- core/thread/thread.odin | 93 +++++++++++++++---------- tests/core/Makefile | 5 +- tests/core/build.bat | 5 ++ tests/core/thread/test_core_thread.odin | 80 +++++++++++++++++++++ 4 files changed, 144 insertions(+), 39 deletions(-) create mode 100644 tests/core/thread/test_core_thread.odin diff --git a/core/thread/thread.odin b/core/thread/thread.odin index 9ba03203f..9fcc5b84f 100644 --- a/core/thread/thread.odin +++ b/core/thread/thread.odin @@ -116,26 +116,21 @@ run_with_data :: proc(data: rawptr, fn: proc(data: rawptr), init_context: Maybe( } run_with_poly_data :: proc(data: $T, fn: proc(data: T), init_context: Maybe(runtime.Context) = nil, priority := Thread_Priority.Normal) - where size_of(T) <= size_of(rawptr) { + where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { create_and_start_with_poly_data(data, fn, init_context, priority, true) } run_with_poly_data2 :: proc(arg1: $T1, arg2: $T2, fn: proc(T1, T2), init_context: Maybe(runtime.Context) = nil, priority := Thread_Priority.Normal) - where size_of(T1) <= size_of(rawptr), - size_of(T2) <= size_of(rawptr) { + where size_of(T1) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { create_and_start_with_poly_data2(arg1, arg2, fn, init_context, priority, true) } run_with_poly_data3 :: proc(arg1: $T1, arg2: $T2, arg3: $T3, fn: proc(arg1: T1, arg2: T2, arg3: T3), init_context: Maybe(runtime.Context) = nil, priority := Thread_Priority.Normal) - where size_of(T1) <= size_of(rawptr), - size_of(T2) <= size_of(rawptr), - size_of(T3) <= size_of(rawptr) { + where size_of(T1) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { create_and_start_with_poly_data3(arg1, arg2, arg3, fn, init_context, priority, true) } run_with_poly_data4 :: proc(arg1: $T1, arg2: $T2, arg3: $T3, arg4: $T4, fn: proc(arg1: T1, arg2: T2, arg3: T3, arg4: T4), init_context: Maybe(runtime.Context) = nil, priority := Thread_Priority.Normal) - where size_of(T1) <= size_of(rawptr), - size_of(T2) <= size_of(rawptr), - size_of(T3) <= size_of(rawptr) { + where size_of(T1) + size_of(T2) + size_of(T3) + size_of(T4) <= size_of(rawptr) * MAX_USER_ARGUMENTS { create_and_start_with_poly_data4(arg1, arg2, arg3, arg4, fn, init_context, priority, true) } @@ -178,7 +173,7 @@ create_and_start_with_data :: proc(data: rawptr, fn: proc(data: rawptr), init_co } create_and_start_with_poly_data :: proc(data: $T, fn: proc(data: T), init_context: Maybe(runtime.Context) = nil, priority := Thread_Priority.Normal, self_cleanup := false) -> ^Thread - where size_of(T) <= size_of(rawptr) { + where size_of(T) <= size_of(rawptr) * MAX_USER_ARGUMENTS { thread_proc :: proc(t: ^Thread) { fn := cast(proc(T))t.data assert(t.user_index >= 1) @@ -188,96 +183,118 @@ create_and_start_with_poly_data :: proc(data: $T, fn: proc(data: T), init_contex t := create(thread_proc, priority) t.data = rawptr(fn) t.user_index = 1 + data := data - mem.copy(&t.user_args[0], &data, size_of(data)) + + mem.copy(&t.user_args[0], &data, size_of(T)) + if self_cleanup { t.flags += {.Self_Cleanup} } + t.init_context = init_context start(t) return t } create_and_start_with_poly_data2 :: proc(arg1: $T1, arg2: $T2, fn: proc(T1, T2), init_context: Maybe(runtime.Context) = nil, priority := Thread_Priority.Normal, self_cleanup := false) -> ^Thread - where size_of(T1) <= size_of(rawptr), - size_of(T2) <= size_of(rawptr) { + where size_of(T1) + size_of(T2) <= size_of(rawptr) * MAX_USER_ARGUMENTS { thread_proc :: proc(t: ^Thread) { fn := cast(proc(T1, T2))t.data assert(t.user_index >= 2) - arg1 := (^T1)(&t.user_args[0])^ - arg2 := (^T2)(&t.user_args[1])^ + + user_args := mem.slice_to_bytes(t.user_args[:]) + arg1 := (^T1)(raw_data(user_args))^ + arg2 := (^T2)(raw_data(user_args[size_of(T1):]))^ + fn(arg1, arg2) } t := create(thread_proc, priority) t.data = rawptr(fn) t.user_index = 2 + arg1, arg2 := arg1, arg2 - mem.copy(&t.user_args[0], &arg1, size_of(arg1)) - mem.copy(&t.user_args[1], &arg2, size_of(arg2)) + user_args := mem.slice_to_bytes(t.user_args[:]) + + n := copy(user_args, mem.ptr_to_bytes(&arg1)) + _ = copy(user_args[n:], mem.ptr_to_bytes(&arg2)) + if self_cleanup { t.flags += {.Self_Cleanup} } + t.init_context = init_context start(t) return t } create_and_start_with_poly_data3 :: proc(arg1: $T1, arg2: $T2, arg3: $T3, fn: proc(arg1: T1, arg2: T2, arg3: T3), init_context: Maybe(runtime.Context) = nil, priority := Thread_Priority.Normal, self_cleanup := false) -> ^Thread - where size_of(T1) <= size_of(rawptr), - size_of(T2) <= size_of(rawptr), - size_of(T3) <= size_of(rawptr) { + where size_of(T1) + size_of(T2) + size_of(T3) <= size_of(rawptr) * MAX_USER_ARGUMENTS { thread_proc :: proc(t: ^Thread) { fn := cast(proc(T1, T2, T3))t.data assert(t.user_index >= 3) - arg1 := (^T1)(&t.user_args[0])^ - arg2 := (^T2)(&t.user_args[1])^ - arg3 := (^T3)(&t.user_args[2])^ + + user_args := mem.slice_to_bytes(t.user_args[:]) + arg1 := (^T1)(raw_data(user_args))^ + arg2 := (^T2)(raw_data(user_args[size_of(T1):]))^ + arg3 := (^T3)(raw_data(user_args[size_of(T1) + size_of(T2):]))^ + fn(arg1, arg2, arg3) } t := create(thread_proc, priority) t.data = rawptr(fn) t.user_index = 3 + arg1, arg2, arg3 := arg1, arg2, arg3 - mem.copy(&t.user_args[0], &arg1, size_of(arg1)) - mem.copy(&t.user_args[1], &arg2, size_of(arg2)) - mem.copy(&t.user_args[2], &arg3, size_of(arg3)) + user_args := mem.slice_to_bytes(t.user_args[:]) + + n := copy(user_args, mem.ptr_to_bytes(&arg1)) + n += copy(user_args[n:], mem.ptr_to_bytes(&arg2)) + _ = copy(user_args[n:], mem.ptr_to_bytes(&arg3)) + if self_cleanup { t.flags += {.Self_Cleanup} } + t.init_context = init_context start(t) return t } create_and_start_with_poly_data4 :: proc(arg1: $T1, arg2: $T2, arg3: $T3, arg4: $T4, fn: proc(arg1: T1, arg2: T2, arg3: T3, arg4: T4), init_context: Maybe(runtime.Context) = nil, priority := Thread_Priority.Normal, self_cleanup := false) -> ^Thread - where size_of(T1) <= size_of(rawptr), - size_of(T2) <= size_of(rawptr), - size_of(T3) <= size_of(rawptr) { + where size_of(T1) + size_of(T2) + size_of(T3) + size_of(T4) <= size_of(rawptr) * MAX_USER_ARGUMENTS { thread_proc :: proc(t: ^Thread) { fn := cast(proc(T1, T2, T3, T4))t.data assert(t.user_index >= 4) - arg1 := (^T1)(&t.user_args[0])^ - arg2 := (^T2)(&t.user_args[1])^ - arg3 := (^T3)(&t.user_args[2])^ - arg4 := (^T4)(&t.user_args[3])^ + + user_args := mem.slice_to_bytes(t.user_args[:]) + arg1 := (^T1)(raw_data(user_args))^ + arg2 := (^T2)(raw_data(user_args[size_of(T1):]))^ + arg3 := (^T3)(raw_data(user_args[size_of(T1) + size_of(T2):]))^ + arg4 := (^T4)(raw_data(user_args[size_of(T1) + size_of(T2) + size_of(T3):]))^ + fn(arg1, arg2, arg3, arg4) } t := create(thread_proc, priority) t.data = rawptr(fn) t.user_index = 4 + arg1, arg2, arg3, arg4 := arg1, arg2, arg3, arg4 - mem.copy(&t.user_args[0], &arg1, size_of(arg1)) - mem.copy(&t.user_args[1], &arg2, size_of(arg2)) - mem.copy(&t.user_args[2], &arg3, size_of(arg3)) - mem.copy(&t.user_args[3], &arg4, size_of(arg4)) + user_args := mem.slice_to_bytes(t.user_args[:]) + + n := copy(user_args, mem.ptr_to_bytes(&arg1)) + n += copy(user_args[n:], mem.ptr_to_bytes(&arg2)) + n += copy(user_args[n:], mem.ptr_to_bytes(&arg3)) + _ = copy(user_args[n:], mem.ptr_to_bytes(&arg4)) + if self_cleanup { t.flags += {.Self_Cleanup} } + t.init_context = init_context start(t) return t } - _select_context_for_thread :: proc(init_context: Maybe(runtime.Context)) -> runtime.Context { ctx, ok := init_context.? if !ok { diff --git a/tests/core/Makefile b/tests/core/Makefile index 919262f85..3fdadc246 100644 --- a/tests/core/Makefile +++ b/tests/core/Makefile @@ -3,7 +3,7 @@ PYTHON=$(shell which python3) all: download_test_assets image_test compress_test strings_test hash_test crypto_test noise_test encoding_test \ math_test linalg_glsl_math_test filepath_test reflect_test os_exit_test i18n_test match_test c_libc_test net_test \ - fmt_test + fmt_test thread_test download_test_assets: $(PYTHON) download_assets.py @@ -61,3 +61,6 @@ net_test: fmt_test: $(ODIN) run fmt -out:test_core_fmt + +thread_test: + $(ODIN) run thread -out:test_core_thread diff --git a/tests/core/build.bat b/tests/core/build.bat index 1d146c8a4..311c9c78e 100644 --- a/tests/core/build.bat +++ b/tests/core/build.bat @@ -85,3 +85,8 @@ echo --- echo Running core:container tests echo --- %PATH_TO_ODIN% run container %COMMON% %COLLECTION% -out:test_core_container.exe || exit /b + +echo --- +echo Running core:thread tests +echo --- +%PATH_TO_ODIN% run thread %COMMON% %COLLECTION% -out:test_core_thread.exe || exit /b diff --git a/tests/core/thread/test_core_thread.odin b/tests/core/thread/test_core_thread.odin new file mode 100644 index 000000000..e02fcc0f7 --- /dev/null +++ b/tests/core/thread/test_core_thread.odin @@ -0,0 +1,80 @@ +package test_core_thread + +import "core:testing" +import "core:thread" +import "core:fmt" +import "core:os" + +TEST_count := 0 +TEST_fail := 0 + +t := &testing.T{} + +when ODIN_TEST { + expect :: testing.expect + log :: testing.log +} else { + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } +} + +main :: proc() { + poly_data_test(t) + + if TEST_fail > 0 { + os.exit(1) + } +} + +@(test) +poly_data_test :: proc(_t: ^testing.T) { + MAX :: size_of(rawptr) * thread.MAX_USER_ARGUMENTS + + @static t: ^testing.T + t = _t + + b: [MAX]byte = 8 + t1 := thread.create_and_start_with_poly_data(b, proc(b: [MAX]byte) { + b_expect: [MAX]byte = 8 + expect(t, b == b_expect, "thread poly data not correct") + }, self_cleanup = true) + + b1: [3]uintptr = 1 + b2: [MAX / 2]byte = 3 + t2 := thread.create_and_start_with_poly_data2(b1, b2, proc(b: [3]uintptr, b2: [MAX / 2]byte) { + b_expect: [3]uintptr = 1 + b2_expect: [MAX / 2]byte = 3 + expect(t, b == b_expect, "thread poly data not correct") + expect(t, b2 == b2_expect, "thread poly data not correct") + }, self_cleanup = true) + + t3 := thread.create_and_start_with_poly_data3(b1, b2, uintptr(333), proc(b: [3]uintptr, b2: [MAX / 2]byte, b3: uintptr) { + b_expect: [3]uintptr = 1 + b2_expect: [MAX / 2]byte = 3 + + expect(t, b == b_expect, "thread poly data not correct") + expect(t, b2 == b2_expect, "thread poly data not correct") + expect(t, b3 == 333, "thread poly data not correct") + }, self_cleanup = true) + + t4 := thread.create_and_start_with_poly_data4(uintptr(111), b1, uintptr(333), u8(5), proc(n: uintptr, b: [3]uintptr, n2: uintptr, n4: u8) { + b_expect: [3]uintptr = 1 + + expect(t, n == 111, "thread poly data not correct") + expect(t, b == b_expect, "thread poly data not correct") + expect(t, n2 == 333, "thread poly data not correct") + expect(t, n4 == 5, "thread poly data not correct") + }, self_cleanup = true) + + thread.join_multiple(t1, t2, t3, t4) +} From 50f86dc14f0575efb52d93953f611157e1026453 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 9 Nov 2023 22:50:52 +0100 Subject: [PATCH 19/52] Fix shadowing --- tests/core/thread/test_core_thread.odin | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/core/thread/test_core_thread.odin b/tests/core/thread/test_core_thread.odin index e02fcc0f7..441b2187f 100644 --- a/tests/core/thread/test_core_thread.odin +++ b/tests/core/thread/test_core_thread.odin @@ -40,13 +40,13 @@ main :: proc() { poly_data_test :: proc(_t: ^testing.T) { MAX :: size_of(rawptr) * thread.MAX_USER_ARGUMENTS - @static t: ^testing.T - t = _t + @static poly_data_test_t: ^testing.T + poly_data_test_t = _t b: [MAX]byte = 8 t1 := thread.create_and_start_with_poly_data(b, proc(b: [MAX]byte) { b_expect: [MAX]byte = 8 - expect(t, b == b_expect, "thread poly data not correct") + expect(poly_data_test_t, b == b_expect, "thread poly data not correct") }, self_cleanup = true) b1: [3]uintptr = 1 @@ -54,26 +54,26 @@ poly_data_test :: proc(_t: ^testing.T) { t2 := thread.create_and_start_with_poly_data2(b1, b2, proc(b: [3]uintptr, b2: [MAX / 2]byte) { b_expect: [3]uintptr = 1 b2_expect: [MAX / 2]byte = 3 - expect(t, b == b_expect, "thread poly data not correct") - expect(t, b2 == b2_expect, "thread poly data not correct") + expect(poly_data_test_t, b == b_expect, "thread poly data not correct") + expect(poly_data_test_t, b2 == b2_expect, "thread poly data not correct") }, self_cleanup = true) t3 := thread.create_and_start_with_poly_data3(b1, b2, uintptr(333), proc(b: [3]uintptr, b2: [MAX / 2]byte, b3: uintptr) { b_expect: [3]uintptr = 1 b2_expect: [MAX / 2]byte = 3 - expect(t, b == b_expect, "thread poly data not correct") - expect(t, b2 == b2_expect, "thread poly data not correct") - expect(t, b3 == 333, "thread poly data not correct") + expect(poly_data_test_t, b == b_expect, "thread poly data not correct") + expect(poly_data_test_t, b2 == b2_expect, "thread poly data not correct") + expect(poly_data_test_t, b3 == 333, "thread poly data not correct") }, self_cleanup = true) t4 := thread.create_and_start_with_poly_data4(uintptr(111), b1, uintptr(333), u8(5), proc(n: uintptr, b: [3]uintptr, n2: uintptr, n4: u8) { b_expect: [3]uintptr = 1 - expect(t, n == 111, "thread poly data not correct") - expect(t, b == b_expect, "thread poly data not correct") - expect(t, n2 == 333, "thread poly data not correct") - expect(t, n4 == 5, "thread poly data not correct") + expect(poly_data_test_t, n == 111, "thread poly data not correct") + expect(poly_data_test_t, b == b_expect, "thread poly data not correct") + expect(poly_data_test_t, n2 == 333, "thread poly data not correct") + expect(poly_data_test_t, n4 == 5, "thread poly data not correct") }, self_cleanup = true) thread.join_multiple(t1, t2, t3, t4) From 2e64866838e6d99387bbcaf272fdeaf063b1a308 Mon Sep 17 00:00:00 2001 From: laytan Date: Mon, 20 Nov 2023 21:23:12 +0100 Subject: [PATCH 20/52] fix self_cleanup causing join to fail --- tests/core/thread/test_core_thread.odin | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/tests/core/thread/test_core_thread.odin b/tests/core/thread/test_core_thread.odin index 441b2187f..c0c7396a7 100644 --- a/tests/core/thread/test_core_thread.odin +++ b/tests/core/thread/test_core_thread.odin @@ -47,8 +47,9 @@ poly_data_test :: proc(_t: ^testing.T) { t1 := thread.create_and_start_with_poly_data(b, proc(b: [MAX]byte) { b_expect: [MAX]byte = 8 expect(poly_data_test_t, b == b_expect, "thread poly data not correct") - }, self_cleanup = true) - + }) + defer free(t1) + b1: [3]uintptr = 1 b2: [MAX / 2]byte = 3 t2 := thread.create_and_start_with_poly_data2(b1, b2, proc(b: [3]uintptr, b2: [MAX / 2]byte) { @@ -56,7 +57,8 @@ poly_data_test :: proc(_t: ^testing.T) { b2_expect: [MAX / 2]byte = 3 expect(poly_data_test_t, b == b_expect, "thread poly data not correct") expect(poly_data_test_t, b2 == b2_expect, "thread poly data not correct") - }, self_cleanup = true) + }) + defer free(t2) t3 := thread.create_and_start_with_poly_data3(b1, b2, uintptr(333), proc(b: [3]uintptr, b2: [MAX / 2]byte, b3: uintptr) { b_expect: [3]uintptr = 1 @@ -65,8 +67,9 @@ poly_data_test :: proc(_t: ^testing.T) { expect(poly_data_test_t, b == b_expect, "thread poly data not correct") expect(poly_data_test_t, b2 == b2_expect, "thread poly data not correct") expect(poly_data_test_t, b3 == 333, "thread poly data not correct") - }, self_cleanup = true) - + }) + defer free(t3) + t4 := thread.create_and_start_with_poly_data4(uintptr(111), b1, uintptr(333), u8(5), proc(n: uintptr, b: [3]uintptr, n2: uintptr, n4: u8) { b_expect: [3]uintptr = 1 @@ -74,7 +77,8 @@ poly_data_test :: proc(_t: ^testing.T) { expect(poly_data_test_t, b == b_expect, "thread poly data not correct") expect(poly_data_test_t, n2 == 333, "thread poly data not correct") expect(poly_data_test_t, n4 == 5, "thread poly data not correct") - }, self_cleanup = true) + }) + defer free(t4) thread.join_multiple(t1, t2, t3, t4) } From 3e7b5670fbb8d56b428375140586c5c94f2c8814 Mon Sep 17 00:00:00 2001 From: evertonse Date: Tue, 21 Nov 2023 18:48:47 -0300 Subject: [PATCH 21/52] Check for llvm-config14 on unix --- build_odin.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build_odin.sh b/build_odin.sh index 2a2505c97..f9747b52c 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -27,11 +27,13 @@ error() { if [ -z "$LLVM_CONFIG" ]; then # darwin, linux, openbsd if [ -n "$(command -v llvm-config-17)" ]; then LLVM_CONFIG="llvm-config-17" + elif [ -n "$(command -v llvm-config-14)" ]; then LLVM_CONFIG="llvm-config-14" elif [ -n "$(command -v llvm-config-13)" ]; then LLVM_CONFIG="llvm-config-13" elif [ -n "$(command -v llvm-config-12)" ]; then LLVM_CONFIG="llvm-config-12" elif [ -n "$(command -v llvm-config-11)" ]; then LLVM_CONFIG="llvm-config-11" # freebsd elif [ -n "$(command -v llvm-config17)" ]; then LLVM_CONFIG="llvm-config-17" + elif [ -n "$(command -v llvm-config14)" ]; then LLVM_CONFIG="llvm-config-14" elif [ -n "$(command -v llvm-config13)" ]; then LLVM_CONFIG="llvm-config-13" elif [ -n "$(command -v llvm-config12)" ]; then LLVM_CONFIG="llvm-config-12" elif [ -n "$(command -v llvm-config11)" ]; then LLVM_CONFIG="llvm-config-11" From 6749639eb133dad03a87aad55feb82f0a3be2e29 Mon Sep 17 00:00:00 2001 From: Brennen Shaughnessy Date: Tue, 14 Nov 2023 09:12:23 -0500 Subject: [PATCH 22/52] Add various missing windows procedures --- core/sys/windows/gdi32.odin | 7 +++++++ core/sys/windows/kernel32.odin | 13 ++++++++++++- core/sys/windows/types.odin | 10 ++++++++++ core/sys/windows/user32.odin | 3 +++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/core/sys/windows/gdi32.odin b/core/sys/windows/gdi32.odin index 9e2294c71..801e483e7 100644 --- a/core/sys/windows/gdi32.odin +++ b/core/sys/windows/gdi32.odin @@ -10,6 +10,8 @@ foreign gdi32 { DeleteObject :: proc(ho: HGDIOBJ) -> BOOL --- SetBkColor :: proc(hdc: HDC, color: COLORREF) -> COLORREF --- + CreateCompatibleDC :: proc(hdc: HDC) -> HDC --- + CreateDIBPatternBrush :: proc(h: HGLOBAL, iUsage: UINT) -> HBRUSH --- CreateDIBitmap :: proc( @@ -81,6 +83,11 @@ foreign gdi32 { GetTextMetricsW :: proc(hdc: HDC, lptm: LPTEXTMETRICW) -> BOOL --- CreateSolidBrush :: proc(color: COLORREF) -> HBRUSH --- + + GetObjectW :: proc(h: HANDLE, c: c_int, pv: LPVOID) -> int --- + CreateCompatibleBitmap :: proc(hdc: HDC, cx, cy: c_int) -> HBITMAP --- + BitBlt :: proc(hdc: HDC, x, y, cx, cy: c_int, hdcSrc: HDC, x1, y1: c_int, rop: DWORD) -> BOOL --- + GetDIBits :: proc(hdc: HDC, hbm: HBITMAP, start, cLines: UINT, lpvBits: LPVOID, lpbmi: ^BITMAPINFO, usage: UINT) -> int --- } RGB :: #force_inline proc "contextless" (r, g, b: u8) -> COLORREF { diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index 0c612a974..016cb0bf8 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -290,6 +290,14 @@ foreign kernel32 { hTemplateFile: HANDLE, ) -> HANDLE --- + GetFileTime :: proc( + hFile: HANDLE, + lpCreationTime: LPFILETIME, + lpLastAccessTime: LPFILETIME, + lpLastWriteTime: LPFILETIME, + ) -> BOOL --- + CompareFileTime :: proc(lpFileTime1: LPFILETIME, lpFileTime2: LPFILETIME) -> LONG --- + FindFirstFileW :: proc(fileName: LPCWSTR, findFileData: LPWIN32_FIND_DATAW) -> HANDLE --- FindNextFileW :: proc(findFile: HANDLE, findFileData: LPWIN32_FIND_DATAW) -> BOOL --- FindClose :: proc(findFile: HANDLE) -> BOOL --- @@ -346,6 +354,9 @@ foreign kernel32 { LocalReAlloc :: proc(mem: LPVOID, bytes: SIZE_T, flags: UINT) -> LPVOID --- LocalFree :: proc(mem: LPVOID) -> LPVOID --- + GlobalAlloc :: proc(flags: UINT, bytes: SIZE_T) -> LPVOID --- + GlobalReAlloc :: proc(mem: LPVOID, bytes: SIZE_T, flags: UINT) -> LPVOID --- + GlobalFree :: proc(mem: LPVOID) -> LPVOID --- ReadDirectoryChangesW :: proc( hDirectory: HANDLE, @@ -414,7 +425,7 @@ foreign kernel32 { GetConsoleWindow :: proc() -> HWND --- GetConsoleScreenBufferInfo :: proc(hConsoleOutput: HANDLE, lpConsoleScreenBufferInfo: PCONSOLE_SCREEN_BUFFER_INFO) -> BOOL --- SetConsoleScreenBufferSize :: proc(hConsoleOutput: HANDLE, dwSize: COORD) -> BOOL --- - SetConsoleWindowInfo :: proc(hConsoleOutput: HANDLE, bAbsolute : BOOL, lpConsoleWindow: ^SMALL_RECT) -> BOOL --- + SetConsoleWindowInfo :: proc(hConsoleOutput: HANDLE, bAbsolute: BOOL, lpConsoleWindow: ^SMALL_RECT) -> BOOL --- GetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- SetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index d5377eb2f..dcd3ad672 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -1969,6 +1969,16 @@ BITMAPINFO :: struct { bmiColors: [1]RGBQUAD, } +BITMAP :: struct { + bmType: LONG, + bmWidth: LONG, + bmHeight: LONG, + bmWidthBytes: LONG, + bmPlanes: WORD, + bmBitsPixel: WORD, + bmBits: LPVOID, +} + // pixel types PFD_TYPE_RGBA :: 0 PFD_TYPE_COLORINDEX :: 1 diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index ee536e0a8..4fe29d2f8 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -160,6 +160,8 @@ foreign user32 { MonitorFromRect :: proc(lprc: LPRECT, dwFlags: Monitor_From_Flags) -> HMONITOR --- MonitorFromWindow :: proc(hwnd: HWND, dwFlags: Monitor_From_Flags) -> HMONITOR --- EnumDisplayMonitors :: proc(hdc: HDC, lprcClip: LPRECT, lpfnEnum: Monitor_Enum_Proc, dwData: LPARAM) -> BOOL --- + + EnumWindows :: proc(lpEnumFunc: Window_Enum_Proc, lParam: LPARAM) -> BOOL --- SetThreadDpiAwarenessContext :: proc(dpiContext: DPI_AWARENESS_CONTEXT) -> DPI_AWARENESS_CONTEXT --- GetThreadDpiAwarenessContext :: proc() -> DPI_AWARENESS_CONTEXT --- @@ -310,6 +312,7 @@ Monitor_From_Flags :: enum DWORD { } Monitor_Enum_Proc :: #type proc "stdcall" (HMONITOR, HDC, LPRECT, LPARAM) -> BOOL +Window_Enum_Proc :: #type proc "stdcall" (HWND, LPARAM) -> BOOL USER_DEFAULT_SCREEN_DPI :: 96 DPI_AWARENESS_CONTEXT :: distinct HANDLE From 08d032859f4b3fe61785414ca97981b1e1c8c036 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Wed, 22 Nov 2023 16:16:43 +0100 Subject: [PATCH 23/52] use start pos as end pos if end node is nil --- core/odin/ast/clone.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/odin/ast/clone.odin b/core/odin/ast/clone.odin index c9bfdfe89..a419369b8 100644 --- a/core/odin/ast/clone.odin +++ b/core/odin/ast/clone.odin @@ -24,7 +24,7 @@ new_from_positions :: proc($T: typeid, pos, end: tokenizer.Pos) -> ^T { } new_from_pos_and_end_node :: proc($T: typeid, pos: tokenizer.Pos, end: ^Node) -> ^T { - return new(T, pos, end != nil ? end.end : {}) + return new(T, pos, end != nil ? end.end : pos) } new :: proc { From 8063569cdd6277044a3eb6d5ae7aee63f519cb85 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Fri, 24 Nov 2023 23:27:12 +1100 Subject: [PATCH 24/52] [net]: Add send_any, recv_any variants to proc groups for Any_Socket --- core/net/socket.odin | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/core/net/socket.odin b/core/net/socket.odin index 40fa6ab56..1bfa52257 100644 --- a/core/net/socket.odin +++ b/core/net/socket.odin @@ -148,7 +148,29 @@ recv_udp :: proc(socket: UDP_Socket, buf: []byte) -> (bytes_read: int, remote_en return _recv_udp(socket, buf) } -recv :: proc{recv_tcp, recv_udp} +/* + Receive data from into a buffer from any socket. + + Note: `remote_endpoint` parameter is non-nil only if the socket type is UDP. On TCP sockets it + will always return `nil`. +*/ +recv_any :: proc(socket: Any_Socket, buf: []byte) -> ( + bytes_read: int, + remote_endpoint: Maybe(Endpoint), + err: Network_Error, +) { + switch socktype in socket { + case TCP_Socket: + bytes_read, err := recv_tcp(socktype, buf) + return bytes_read, nil, err + case UDP_Socket: + bytes_read, endpoint, err := recv_udp(socktype, buf) + return bytes_read, endpoint, err + case: panic("Not supported") + } +} + +recv :: proc{recv_tcp, recv_udp, recv_any} /* Repeatedly sends data until the entire buffer is sent. @@ -168,7 +190,20 @@ send_udp :: proc(socket: UDP_Socket, buf: []byte, to: Endpoint) -> (bytes_writte return _send_udp(socket, buf, to) } -send :: proc{send_tcp, send_udp} +send_any :: proc(socket: Any_Socket, buf: []byte, to: Maybe(Endpoint) = nil) -> ( + bytes_written: int, + err: Network_Error, +) { + switch socktype in socket { + case TCP_Socket: + return send_tcp(socktype, buf) + case UDP_Socket: + return send_udp(socktype, buf, to.(Endpoint)) + case: panic("Not supported") + } +} + +send :: proc{send_tcp, send_udp, send_any} shutdown :: proc(socket: Any_Socket, manner: Shutdown_Manner) -> (err: Network_Error) { return _shutdown(socket, manner) @@ -180,4 +215,4 @@ set_option :: proc(socket: Any_Socket, option: Socket_Option, value: any, loc := set_blocking :: proc(socket: Any_Socket, should_block: bool) -> (err: Network_Error) { return _set_blocking(socket, should_block) -} \ No newline at end of file +} From ff0e976ff3dc1f4a783f1e9d93b18f4a1ce34f25 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Fri, 24 Nov 2023 23:57:53 +1100 Subject: [PATCH 25/52] [net]: Fix passing the wrong socket to on linux --- core/net/socket_linux.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/net/socket_linux.odin b/core/net/socket_linux.odin index 6d3f111d1..ba48959fb 100644 --- a/core/net/socket_linux.odin +++ b/core/net/socket_linux.odin @@ -125,7 +125,7 @@ _create_socket :: proc(family: Address_Family, protocol: Socket_Protocol) -> (An } @(private) -_dial_tcp_from_endpoint :: proc(endpoint: Endpoint, options := default_tcp_options) -> (tcp_sock: TCP_Socket, err: Network_Error) { +_dial_tcp_from_endpoint :: proc(endpoint: Endpoint, options := default_tcp_options) -> (TCP_Socket, Network_Error) { errno: linux.Errno if endpoint.port == 0 { return 0, .Port_Required From 914950592cd05445d5f9b42fb6cf459a002f21fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tar=C4=B1k=20B?= Date: Fri, 24 Nov 2023 14:56:55 +0100 Subject: [PATCH 26/52] Fix indentation --- src/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index b8abe94f4..ccacf168a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1945,9 +1945,9 @@ gb_internal void print_show_help(String const arg0, String const &command) { if (run_or_build) { print_usage_line(1, "-sanitize:"); - print_usage_line(1, "Enables sanitization analysis"); - print_usage_line(1, "Options are 'address', 'memory', and 'thread'"); - print_usage_line(1, "NOTE: This flag can be used multiple times"); + print_usage_line(2, "Enables sanitization analysis"); + print_usage_line(2, "Options are 'address', 'memory', and 'thread'"); + print_usage_line(2, "NOTE: This flag can be used multiple times"); print_usage_line(0, ""); } From 70525a12cadcfa45ea78522c8003227d27f4847b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tar=C4=B1k=20B?= Date: Fri, 24 Nov 2023 20:42:11 +0100 Subject: [PATCH 27/52] Fix typo --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index ccacf168a..066a86fb8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1938,7 +1938,7 @@ gb_internal void print_show_help(String const arg0, String const &command) { print_usage_line(0, ""); print_usage_line(1, "-foreign-error-procedures"); - print_usage_line(2, "States that the error procedues used in the runtime are defined in a separate translation unit"); + print_usage_line(2, "States that the error procedures used in the runtime are defined in a separate translation unit"); print_usage_line(0, ""); } From 6f65ed6cc81318aa22b8aa6709a5eb22ecf8226b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tar=C4=B1k=20B?= Date: Fri, 24 Nov 2023 21:49:23 +0100 Subject: [PATCH 28/52] Add period at the end of sentences. --- src/main.cpp | 208 +++++++++++++++++++++++++-------------------------- 1 file changed, 104 insertions(+), 104 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 066a86fb8..ab1fdda91 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -199,19 +199,19 @@ gb_internal void print_usage_line(i32 indent, char const *fmt, ...) { } gb_internal void usage(String argv0) { - print_usage_line(0, "%.*s is a tool for managing Odin source code", LIT(argv0)); + print_usage_line(0, "%.*s is a tool for managing Odin source code.", LIT(argv0)); print_usage_line(0, "Usage:"); print_usage_line(1, "%.*s command [arguments]", LIT(argv0)); print_usage_line(0, "Commands:"); print_usage_line(1, "build compile directory of .odin files, as an executable."); print_usage_line(1, " one must contain the program's entry point, all must be in the same package."); print_usage_line(1, "run same as 'build', but also then runs the newly compiled executable."); - print_usage_line(1, "check parse, and type check a directory of .odin files"); - print_usage_line(1, "strip-semicolon parse, type check, and remove unneeded semicolons from the entire program"); - print_usage_line(1, "test build and runs procedures with the attribute @(test) in the initial package"); - print_usage_line(1, "doc generate documentation on a directory of .odin files"); - print_usage_line(1, "version print version"); - print_usage_line(1, "report print information useful to reporting a bug"); + print_usage_line(1, "check parse, and type check a directory of .odin files."); + print_usage_line(1, "strip-semicolon parse, type check, and remove unneeded semicolons from the entire program."); + print_usage_line(1, "test build and runs procedures with the attribute @(test) in the initial package."); + print_usage_line(1, "doc generate documentation on a directory of .odin files."); + print_usage_line(1, "version print version."); + print_usage_line(1, "report print information useful to reporting a bug."); print_usage_line(0, ""); print_usage_line(0, "For further details on a command, invoke command help:"); print_usage_line(1, "e.g. `odin build -help` or `odin help build`"); @@ -1580,7 +1580,7 @@ gb_internal void remove_temp_files(lbGenerator *gen) { gb_internal void print_show_help(String const arg0, String const &command) { - print_usage_line(0, "%.*s is a tool for managing Odin source code", LIT(arg0)); + print_usage_line(0, "%.*s is a tool for managing Odin source code.", LIT(arg0)); print_usage_line(0, "Usage:"); print_usage_line(1, "%.*s %.*s [arguments]", LIT(arg0), LIT(command)); print_usage_line(0, ""); @@ -1590,35 +1590,35 @@ gb_internal void print_show_help(String const arg0, String const &command) { print_usage_line(2, "One must contain the program's entry point, all must be in the same package."); print_usage_line(2, "Use `-file` to build a single file instead."); print_usage_line(2, "Examples:"); - print_usage_line(3, "odin build . # Build package in current directory"); - print_usage_line(3, "odin build # Build package in "); + print_usage_line(3, "odin build . # Build package in current directory."); + print_usage_line(3, "odin build # Build package in ."); print_usage_line(3, "odin build filename.odin -file # Build single-file package, must contain entry point."); } else if (command == "run") { print_usage_line(1, "run Same as 'build', but also then runs the newly compiled executable."); print_usage_line(2, "Append an empty flag and then the args, '-- ', to specify args for the output."); print_usage_line(2, "Examples:"); - print_usage_line(3, "odin run . # Build and run package in current directory"); - print_usage_line(3, "odin run # Build and run package in "); + print_usage_line(3, "odin run . # Build and run package in current directory."); + print_usage_line(3, "odin run # Build and run package in ."); print_usage_line(3, "odin run filename.odin -file # Build and run single-file package, must contain entry point."); } else if (command == "check") { - print_usage_line(1, "check Parse and type check directory of .odin files"); + print_usage_line(1, "check Parse and type check directory of .odin files."); print_usage_line(2, "Examples:"); - print_usage_line(3, "odin check . # Type check package in current directory"); - print_usage_line(3, "odin check # Type check package in "); + print_usage_line(3, "odin check . # Type check package in current directory."); + print_usage_line(3, "odin check # Type check package in ."); print_usage_line(3, "odin check filename.odin -file # Type check single-file package, must contain entry point."); } else if (command == "test") { - print_usage_line(1, "test Build and runs procedures with the attribute @(test) in the initial package"); + print_usage_line(1, "test Build and runs procedures with the attribute @(test) in the initial package."); } else if (command == "doc") { - print_usage_line(1, "doc generate documentation from a directory of .odin files"); + print_usage_line(1, "doc generate documentation from a directory of .odin files."); print_usage_line(2, "Examples:"); - print_usage_line(3, "odin doc . # Generate documentation on package in current directory"); - print_usage_line(3, "odin doc # Generate documentation on package in "); + print_usage_line(3, "odin doc . # Generate documentation on package in current directory."); + print_usage_line(3, "odin doc # Generate documentation on package in ."); print_usage_line(3, "odin doc filename.odin -file # Generate documentation on single-file package."); } else if (command == "version") { print_usage_line(1, "version print version"); } else if (command == "strip-semicolon") { print_usage_line(1, "strip-semicolon"); - print_usage_line(2, "Parse and type check .odin file(s) and then remove unneeded semicolons from the entire project"); + print_usage_line(2, "Parse and type check .odin file(s) and then remove unneeded semicolons from the entire project."); } bool doc = command == "doc"; @@ -1642,96 +1642,96 @@ gb_internal void print_show_help(String const arg0, String const &command) { if (doc) { print_usage_line(1, "-short"); - print_usage_line(2, "Show shortened documentation for the packages"); + print_usage_line(2, "Show shortened documentation for the packages."); print_usage_line(0, ""); print_usage_line(1, "-all-packages"); - print_usage_line(2, "Generates documentation for all packages used in the current project"); + print_usage_line(2, "Generates documentation for all packages used in the current project."); print_usage_line(0, ""); print_usage_line(1, "-doc-format"); - print_usage_line(2, "Generates documentation as the .odin-doc format (useful for external tooling)"); + print_usage_line(2, "Generates documentation as the .odin-doc format (useful for external tooling)."); print_usage_line(0, ""); } if (run_or_build) { print_usage_line(1, "-out:"); - print_usage_line(2, "Set the file name of the outputted executable"); + print_usage_line(2, "Set the file name of the outputted executable."); print_usage_line(2, "Example: -out:foo.exe"); print_usage_line(0, ""); print_usage_line(1, "-o:"); - print_usage_line(2, "Set the optimization mode for compilation"); + print_usage_line(2, "Set the optimization mode for compilation."); if (LB_USE_NEW_PASS_SYSTEM) { print_usage_line(2, "Accepted values: none, minimal, size, speed, aggressive"); } else { print_usage_line(2, "Accepted values: none, minimal, size, speed"); } print_usage_line(2, "Example: -o:speed"); - print_usage_line(2, "The default is -o:minimal"); + print_usage_line(2, "The default is -o:minimal."); print_usage_line(0, ""); } if (check) { print_usage_line(1, "-show-timings"); - print_usage_line(2, "Shows basic overview of the timings of different stages within the compiler in milliseconds"); + print_usage_line(2, "Shows basic overview of the timings of different stages within the compiler in milliseconds."); print_usage_line(0, ""); print_usage_line(1, "-show-more-timings"); - print_usage_line(2, "Shows an advanced overview of the timings of different stages within the compiler in milliseconds"); + print_usage_line(2, "Shows an advanced overview of the timings of different stages within the compiler in milliseconds."); print_usage_line(0, ""); print_usage_line(1, "-show-system-calls"); - print_usage_line(2, "Prints the whole command and arguments for calls to external tools like linker and assembler"); + print_usage_line(2, "Prints the whole command and arguments for calls to external tools like linker and assembler."); print_usage_line(0, ""); print_usage_line(1, "-export-timings:"); - print_usage_line(2, "Export timings to one of a few formats. Requires `-show-timings` or `-show-more-timings`"); + print_usage_line(2, "Export timings to one of a few formats. Requires `-show-timings` or `-show-more-timings`."); print_usage_line(2, "Available options:"); - print_usage_line(3, "-export-timings:json Export compile time stats to JSON"); - print_usage_line(3, "-export-timings:csv Export compile time stats to CSV"); + print_usage_line(3, "-export-timings:json Export compile time stats to JSON."); + print_usage_line(3, "-export-timings:csv Export compile time stats to CSV."); print_usage_line(0, ""); print_usage_line(1, "-export-timings-file:"); - print_usage_line(2, "Specify the filename for `-export-timings`"); + print_usage_line(2, "Specify the filename for `-export-timings`."); print_usage_line(2, "Example: -export-timings-file:timings.json"); print_usage_line(0, ""); print_usage_line(1, "-thread-count:"); - print_usage_line(2, "Override the number of threads the compiler will use to compile with"); + print_usage_line(2, "Override the number of threads the compiler will use to compile with."); print_usage_line(2, "Example: -thread-count:2"); print_usage_line(0, ""); } if (check_only) { print_usage_line(1, "-show-unused"); - print_usage_line(2, "Shows unused package declarations within the current project"); + print_usage_line(2, "Shows unused package declarations within the current project."); print_usage_line(0, ""); print_usage_line(1, "-show-unused-with-location"); - print_usage_line(2, "Shows unused package declarations within the current project with the declarations source location"); + print_usage_line(2, "Shows unused package declarations within the current project with the declarations source location."); print_usage_line(0, ""); } if (run_or_build) { print_usage_line(1, "-keep-temp-files"); - print_usage_line(2, "Keeps the temporary files generated during compilation"); + print_usage_line(2, "Keeps the temporary files generated during compilation."); print_usage_line(0, ""); } else if (strip_semicolon) { print_usage_line(1, "-keep-temp-files"); - print_usage_line(2, "Keeps the temporary files generated during stripping the unneeded semicolons from files"); + print_usage_line(2, "Keeps the temporary files generated during stripping the unneeded semicolons from files."); print_usage_line(0, ""); } if (check) { print_usage_line(1, "-collection:="); - print_usage_line(2, "Defines a library collection used for imports"); + print_usage_line(2, "Defines a library collection used for imports."); print_usage_line(2, "Example: -collection:shared=dir/to/shared"); print_usage_line(2, "Usage in Code:"); print_usage_line(3, "import \"shared:foo\""); print_usage_line(0, ""); print_usage_line(1, "-define:="); - print_usage_line(2, "Defines a scalar boolean, integer or string as global constant"); + print_usage_line(2, "Defines a scalar boolean, integer or string as global constant."); print_usage_line(2, "Example: -define:SPAM=123"); print_usage_line(2, "To use: #config(SPAM, default_value)"); print_usage_line(0, ""); @@ -1739,69 +1739,69 @@ gb_internal void print_show_help(String const arg0, String const &command) { if (build) { print_usage_line(1, "-build-mode:"); - print_usage_line(2, "Sets the build mode"); + print_usage_line(2, "Sets the build mode."); print_usage_line(2, "Available options:"); - print_usage_line(3, "-build-mode:exe Build as an executable"); - print_usage_line(3, "-build-mode:dll Build as a dynamically linked library"); - print_usage_line(3, "-build-mode:shared Build as a dynamically linked library"); - print_usage_line(3, "-build-mode:obj Build as an object file"); - print_usage_line(3, "-build-mode:object Build as an object file"); - print_usage_line(3, "-build-mode:assembly Build as an assembly file"); - print_usage_line(3, "-build-mode:assembler Build as an assembly file"); - print_usage_line(3, "-build-mode:asm Build as an assembly file"); - print_usage_line(3, "-build-mode:llvm-ir Build as an LLVM IR file"); - print_usage_line(3, "-build-mode:llvm Build as an LLVM IR file"); + print_usage_line(3, "-build-mode:exe Build as an executable."); + print_usage_line(3, "-build-mode:dll Build as a dynamically linked library."); + print_usage_line(3, "-build-mode:shared Build as a dynamically linked library."); + print_usage_line(3, "-build-mode:obj Build as an object file."); + print_usage_line(3, "-build-mode:object Build as an object file."); + print_usage_line(3, "-build-mode:assembly Build as an assembly file."); + print_usage_line(3, "-build-mode:assembler Build as an assembly file."); + print_usage_line(3, "-build-mode:asm Build as an assembly file."); + print_usage_line(3, "-build-mode:llvm-ir Build as an LLVM IR file."); + print_usage_line(3, "-build-mode:llvm Build as an LLVM IR file."); print_usage_line(0, ""); } if (check) { print_usage_line(1, "-target:"); - print_usage_line(2, "Sets the target for the executable to be built in"); + print_usage_line(2, "Sets the target for the executable to be built in."); print_usage_line(0, ""); } if (run_or_build) { print_usage_line(1, "-debug"); - print_usage_line(2, "Enabled debug information, and defines the global constant ODIN_DEBUG to be 'true'"); + print_usage_line(2, "Enabled debug information, and defines the global constant ODIN_DEBUG to be 'true'."); print_usage_line(0, ""); print_usage_line(1, "-disable-assert"); - print_usage_line(2, "Disable the code generation of the built-in run-time 'assert' procedure, and defines the global constant ODIN_DISABLE_ASSERT to be 'true'"); + print_usage_line(2, "Disable the code generation of the built-in run-time 'assert' procedure, and defines the global constant ODIN_DISABLE_ASSERT to be 'true'."); print_usage_line(0, ""); print_usage_line(1, "-no-bounds-check"); - print_usage_line(2, "Disables bounds checking program wide"); + print_usage_line(2, "Disables bounds checking program wide."); print_usage_line(0, ""); print_usage_line(1, "-no-crt"); - print_usage_line(2, "Disables automatic linking with the C Run Time"); + print_usage_line(2, "Disables automatic linking with the C Run Time."); print_usage_line(0, ""); print_usage_line(1, "-no-thread-local"); - print_usage_line(2, "Ignore @thread_local attribute, effectively treating the program as if it is single-threaded"); + print_usage_line(2, "Ignore @thread_local attribute, effectively treating the program as if it is single-threaded."); print_usage_line(0, ""); print_usage_line(1, "-lld"); - print_usage_line(2, "Use the LLD linker rather than the default"); + print_usage_line(2, "Use the LLD linker rather than the default."); print_usage_line(0, ""); print_usage_line(1, "-use-separate-modules"); print_usage_line(1, "[EXPERIMENTAL]"); - print_usage_line(2, "The backend generates multiple build units which are then linked together"); - print_usage_line(2, "Normally, a single build unit is generated for a standard project"); + print_usage_line(2, "The backend generates multiple build units which are then linked together."); + print_usage_line(2, "Normally, a single build unit is generated for a standard project."); print_usage_line(0, ""); } if (check) { print_usage_line(1, "-no-threaded-checker"); - print_usage_line(2, "Disabled multithreading in the semantic checker stage"); + print_usage_line(2, "Disabled multithreading in the semantic checker stage."); print_usage_line(0, ""); } if (check) { print_usage_line(1, "-vet"); - print_usage_line(2, "Do extra checks on the code"); + print_usage_line(2, "Do extra checks on the code."); print_usage_line(2, "Extra checks include:"); print_usage_line(2, "-vet-unused"); print_usage_line(2, "-vet-shadowing"); @@ -1809,70 +1809,70 @@ gb_internal void print_show_help(String const arg0, String const &command) { print_usage_line(0, ""); print_usage_line(1, "-vet-unused"); - print_usage_line(2, "Checks for unused declarations"); + print_usage_line(2, "Checks for unused declarations."); print_usage_line(0, ""); print_usage_line(1, "-vet-shadowing"); - print_usage_line(2, "Checks for variable shadowing within procedures"); + print_usage_line(2, "Checks for variable shadowing within procedures."); print_usage_line(0, ""); print_usage_line(1, "-vet-using-stmt"); - print_usage_line(2, "Checks for the use of 'using' as a statement"); - print_usage_line(2, "'using' is considered bad practice outside of immediate refactoring"); + print_usage_line(2, "Checks for the use of 'using' as a statement."); + print_usage_line(2, "'using' is considered bad practice outside of immediate refactoring."); print_usage_line(0, ""); print_usage_line(1, "-vet-using-param"); - print_usage_line(2, "Checks for the use of 'using' on procedure parameters"); - print_usage_line(2, "'using' is considered bad practice outside of immediate refactoring"); + print_usage_line(2, "Checks for the use of 'using' on procedure parameters."); + print_usage_line(2, "'using' is considered bad practice outside of immediate refactoring."); print_usage_line(0, ""); print_usage_line(1, "-vet-style"); - print_usage_line(2, "Errs on missing trailing commas followed by a newline"); - print_usage_line(2, "Errs on deprecated syntax"); - print_usage_line(2, "Does not err on unneeded tokens (unlike -strict-style)"); + print_usage_line(2, "Errs on missing trailing commas followed by a newline."); + print_usage_line(2, "Errs on deprecated syntax."); + print_usage_line(2, "Does not err on unneeded tokens (unlike -strict-style)."); print_usage_line(0, ""); print_usage_line(1, "-vet-semicolon"); - print_usage_line(2, "Errs on unneeded semicolons"); + print_usage_line(2, "Errs on unneeded semicolons."); print_usage_line(0, ""); } if (check) { print_usage_line(1, "-ignore-unknown-attributes"); - print_usage_line(2, "Ignores unknown attributes"); - print_usage_line(2, "This can be used with metaprogramming tools"); + print_usage_line(2, "Ignores unknown attributes."); + print_usage_line(2, "This can be used with metaprogramming tools."); print_usage_line(0, ""); if (command != "test") { print_usage_line(1, "-no-entry-point"); - print_usage_line(2, "Removes default requirement of an entry point (e.g. main procedure)"); + print_usage_line(2, "Removes default requirement of an entry point (e.g. main procedure)."); print_usage_line(0, ""); } } if (test_only) { print_usage_line(1, "-test-name:"); - print_usage_line(2, "Run specific test only by name"); + print_usage_line(2, "Run specific test only by name."); print_usage_line(0, ""); } if (run_or_build) { print_usage_line(1, "-minimum-os-version:"); - print_usage_line(2, "Sets the minimum OS version targeted by the application"); + print_usage_line(2, "Sets the minimum OS version targeted by the application."); print_usage_line(2, "e.g. -minimum-os-version:12.0.0"); - print_usage_line(2, "(Only used when target is Darwin)"); + print_usage_line(2, "(Only used when target is Darwin.)"); print_usage_line(0, ""); print_usage_line(1, "-extra-linker-flags:"); - print_usage_line(2, "Adds extra linker specific flags in a string"); + print_usage_line(2, "Adds extra linker specific flags in a string."); print_usage_line(0, ""); print_usage_line(1, "-extra-assembler-flags:"); - print_usage_line(2, "Adds extra assembler specific flags in a string"); + print_usage_line(2, "Adds extra assembler specific flags in a string."); print_usage_line(0, ""); print_usage_line(1, "-microarch:"); - print_usage_line(2, "Specifies the specific micro-architecture for the build in a string"); + print_usage_line(2, "Specifies the specific micro-architecture for the build in a string."); print_usage_line(2, "Examples:"); print_usage_line(3, "-microarch:sandybridge"); print_usage_line(3, "-microarch:native"); @@ -1880,7 +1880,7 @@ gb_internal void print_show_help(String const arg0, String const &command) { print_usage_line(0, ""); print_usage_line(1, "-reloc-mode:"); - print_usage_line(2, "Specifies the reloc mode"); + print_usage_line(2, "Specifies the reloc mode."); print_usage_line(2, "Options:"); print_usage_line(3, "default"); print_usage_line(3, "static"); @@ -1889,65 +1889,65 @@ gb_internal void print_show_help(String const arg0, String const &command) { print_usage_line(0, ""); print_usage_line(1, "-disable-red-zone"); - print_usage_line(2, "Disable red zone on a supported freestanding target"); + print_usage_line(2, "Disable red zone on a supported freestanding target."); print_usage_line(0, ""); print_usage_line(1, "-dynamic-map-calls"); - print_usage_line(2, "Use dynamic map calls to minimize code generation at the cost of runtime execution"); + print_usage_line(2, "Use dynamic map calls to minimize code generation at the cost of runtime execution."); print_usage_line(0, ""); } if (check) { print_usage_line(1, "-disallow-do"); - print_usage_line(2, "Disallows the 'do' keyword in the project"); + print_usage_line(2, "Disallows the 'do' keyword in the project."); print_usage_line(0, ""); print_usage_line(1, "-default-to-nil-allocator"); - print_usage_line(2, "Sets the default allocator to be the nil_allocator, an allocator which does nothing"); + print_usage_line(2, "Sets the default allocator to be the nil_allocator, an allocator which does nothing."); print_usage_line(0, ""); print_usage_line(1, "-strict-style"); - print_usage_line(2, "Errs on unneeded tokens, such as unneeded semicolons"); - print_usage_line(2, "Errs on missing trailing commas followed by a newline"); - print_usage_line(2, "Errs on deprecated syntax"); + print_usage_line(2, "Errs on unneeded tokens, such as unneeded semicolons."); + print_usage_line(2, "Errs on missing trailing commas followed by a newline."); + print_usage_line(2, "Errs on deprecated syntax."); print_usage_line(0, ""); print_usage_line(1, "-ignore-warnings"); - print_usage_line(2, "Ignores warning messages"); + print_usage_line(2, "Ignores warning messages."); print_usage_line(0, ""); print_usage_line(1, "-warnings-as-errors"); - print_usage_line(2, "Treats warning messages as error messages"); + print_usage_line(2, "Treats warning messages as error messages."); print_usage_line(0, ""); print_usage_line(1, "-terse-errors"); - print_usage_line(2, "Prints a terse error message without showing the code on that line and the location in that line"); + print_usage_line(2, "Prints a terse error message without showing the code on that line and the location in that line."); print_usage_line(0, ""); print_usage_line(1, "-error-pos-style:"); - print_usage_line(2, "Options are 'unix', 'odin' and 'default' (odin)"); + print_usage_line(2, "Options are 'unix', 'odin' and 'default' (odin)."); print_usage_line(2, "'odin' file/path(45:3)"); print_usage_line(2, "'unix' file/path:45:3:"); print_usage_line(0, ""); print_usage_line(1, "-max-error-count:"); - print_usage_line(2, "Set the maximum number of errors that can be displayed before the compiler terminates"); - print_usage_line(2, "Must be an integer >0"); - print_usage_line(2, "If not set, the default max error count is %d", DEFAULT_MAX_ERROR_COLLECTOR_COUNT); + print_usage_line(2, "Set the maximum number of errors that can be displayed before the compiler terminates."); + print_usage_line(2, "Must be an integer >0."); + print_usage_line(2, "If not set, the default max error count is %d.", DEFAULT_MAX_ERROR_COLLECTOR_COUNT); print_usage_line(0, ""); print_usage_line(1, "-foreign-error-procedures"); - print_usage_line(2, "States that the error procedures used in the runtime are defined in a separate translation unit"); + print_usage_line(2, "States that the error procedures used in the runtime are defined in a separate translation unit."); print_usage_line(0, ""); } if (run_or_build) { print_usage_line(1, "-sanitize:"); - print_usage_line(2, "Enables sanitization analysis"); - print_usage_line(2, "Options are 'address', 'memory', and 'thread'"); - print_usage_line(2, "NOTE: This flag can be used multiple times"); + print_usage_line(2, "Enables sanitization analysis."); + print_usage_line(2, "Options are 'address', 'memory', and 'thread'."); + print_usage_line(2, "NOTE: This flag can be used multiple times."); print_usage_line(0, ""); } @@ -1956,24 +1956,24 @@ gb_internal void print_show_help(String const arg0, String const &command) { #if defined(GB_SYSTEM_WINDOWS) print_usage_line(1, "-ignore-vs-search"); print_usage_line(2, "[Windows only]"); - print_usage_line(2, "Ignores the Visual Studio search for library paths"); + print_usage_line(2, "Ignores the Visual Studio search for library paths."); print_usage_line(0, ""); print_usage_line(1, "-resource:"); print_usage_line(2, "[Windows only]"); - print_usage_line(2, "Defines the resource file for the executable"); + print_usage_line(2, "Defines the resource file for the executable."); print_usage_line(2, "Example: -resource:path/to/file.rc"); print_usage_line(0, ""); print_usage_line(1, "-pdb-name:"); print_usage_line(2, "[Windows only]"); - print_usage_line(2, "Defines the generated PDB name when -debug is enabled"); + print_usage_line(2, "Defines the generated PDB name when -debug is enabled."); print_usage_line(2, "Example: -pdb-name:different.pdb"); print_usage_line(0, ""); print_usage_line(1, "-subsystem: