|
@@ -0,0 +1,2178 @@
|
|
|
|
+package orca
|
|
|
|
+
|
|
|
|
+import "core:c"
|
|
|
|
+
|
|
|
|
+char :: c.char
|
|
|
|
+
|
|
|
|
+// currently missing in the api.json
|
|
|
|
+window :: distinct u64
|
|
|
|
+
|
|
|
|
+// currently missing in the api.json
|
|
|
|
+pool :: struct {
|
|
|
|
+ arena: arena,
|
|
|
|
+ freeList: list,
|
|
|
|
+ blockSize: u64,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@(link_prefix="OC_")
|
|
|
|
+foreign {
|
|
|
|
+ UI_DARK_THEME: ui_theme
|
|
|
|
+ UI_LIGHT_THEME: ui_theme
|
|
|
|
+
|
|
|
|
+ UI_DARK_PALETTE: ui_palette
|
|
|
|
+ UI_LIGHT_PALETTE: ui_palette
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+SYS_MAX_ERROR :: 1024
|
|
|
|
+
|
|
|
|
+sys_err_def :: struct {
|
|
|
|
+ msg: [SYS_MAX_ERROR]u8 `fmt:"s,0"`,
|
|
|
|
+ code: i32,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@(link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ sys_error: sys_err_def
|
|
|
|
+}
|
|
|
|
+UNICODE_BASIC_LATIN :: unicode_range { 0x0000, 127 }
|
|
|
|
+UNICODE_C1_CONTROLS_AND_LATIN_1_SUPPLEMENT :: unicode_range { 0x0080, 127 }
|
|
|
|
+UNICODE_LATIN_EXTENDED_A :: unicode_range { 0x0100, 127 }
|
|
|
|
+UNICODE_LATIN_EXTENDED_B :: unicode_range { 0x0180, 207 }
|
|
|
|
+UNICODE_IPA_EXTENSIONS :: unicode_range { 0x0250, 95 }
|
|
|
|
+UNICODE_SPACING_MODIFIER_LETTERS :: unicode_range { 0x02b0, 79 }
|
|
|
|
+UNICODE_COMBINING_DIACRITICAL_MARKS :: unicode_range { 0x0300, 111 }
|
|
|
|
+UNICODE_GREEK_COPTIC :: unicode_range { 0x0370, 143 }
|
|
|
|
+UNICODE_CYRILLIC :: unicode_range { 0x0400, 255 }
|
|
|
|
+UNICODE_CYRILLIC_SUPPLEMENT :: unicode_range { 0x0500, 47 }
|
|
|
|
+UNICODE_ARMENIAN :: unicode_range { 0x0530, 95 }
|
|
|
|
+UNICODE_HEBREW :: unicode_range { 0x0590, 111 }
|
|
|
|
+UNICODE_ARABIC :: unicode_range { 0x0600, 255 }
|
|
|
|
+UNICODE_SYRIAC :: unicode_range { 0x0700, 79 }
|
|
|
|
+UNICODE_THAANA :: unicode_range { 0x0780, 63 }
|
|
|
|
+UNICODE_DEVANAGARI :: unicode_range { 0x0900, 127 }
|
|
|
|
+UNICODE_BENGALI_ASSAMESE :: unicode_range { 0x0980, 127 }
|
|
|
|
+UNICODE_GURMUKHI :: unicode_range { 0x0a00, 127 }
|
|
|
|
+UNICODE_GUJARATI :: unicode_range { 0x0a80, 127 }
|
|
|
|
+UNICODE_ORIYA :: unicode_range { 0x0b00, 127 }
|
|
|
|
+UNICODE_TAMIL :: unicode_range { 0x0b80, 127 }
|
|
|
|
+UNICODE_TELUGU :: unicode_range { 0x0c00, 127 }
|
|
|
|
+UNICODE_KANNADA :: unicode_range { 0x0c80, 127 }
|
|
|
|
+UNICODE_MALAYALAM :: unicode_range { 0x0d00, 255 }
|
|
|
|
+UNICODE_SINHALA :: unicode_range { 0x0d80, 127 }
|
|
|
|
+UNICODE_THAI :: unicode_range { 0x0e00, 127 }
|
|
|
|
+UNICODE_LAO :: unicode_range { 0x0e80, 127 }
|
|
|
|
+UNICODE_TIBETAN :: unicode_range { 0x0f00, 255 }
|
|
|
|
+UNICODE_MYANMAR :: unicode_range { 0x1000, 159 }
|
|
|
|
+UNICODE_GEORGIAN :: unicode_range { 0x10a0, 95 }
|
|
|
|
+UNICODE_HANGUL_JAMO :: unicode_range { 0x1100, 255 }
|
|
|
|
+UNICODE_ETHIOPIC :: unicode_range { 0x1200, 383 }
|
|
|
|
+UNICODE_CHEROKEE :: unicode_range { 0x13a0, 95 }
|
|
|
|
+UNICODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS :: unicode_range { 0x1400, 639 }
|
|
|
|
+UNICODE_OGHAM :: unicode_range { 0x1680, 31 }
|
|
|
|
+UNICODE_RUNIC :: unicode_range { 0x16a0, 95 }
|
|
|
|
+UNICODE_TAGALOG :: unicode_range { 0x1700, 31 }
|
|
|
|
+UNICODE_HANUNOO :: unicode_range { 0x1720, 31 }
|
|
|
|
+UNICODE_BUHID :: unicode_range { 0x1740, 31 }
|
|
|
|
+UNICODE_TAGBANWA :: unicode_range { 0x1760, 31 }
|
|
|
|
+UNICODE_KHMER :: unicode_range { 0x1780, 127 }
|
|
|
|
+UNICODE_MONGOLIAN :: unicode_range { 0x1800, 175 }
|
|
|
|
+UNICODE_LIMBU :: unicode_range { 0x1900, 79 }
|
|
|
|
+UNICODE_TAI_LE :: unicode_range { 0x1950, 47 }
|
|
|
|
+UNICODE_KHMER_SYMBOLS :: unicode_range { 0x19e0, 31 }
|
|
|
|
+UNICODE_PHONETIC_EXTENSIONS :: unicode_range { 0x1d00, 127 }
|
|
|
|
+UNICODE_LATIN_EXTENDED_ADDITIONAL :: unicode_range { 0x1e00, 255 }
|
|
|
|
+UNICODE_GREEK_EXTENDED :: unicode_range { 0x1f00, 255 }
|
|
|
|
+UNICODE_GENERAL_PUNCTUATION :: unicode_range { 0x2000, 111 }
|
|
|
|
+UNICODE_SUPERSCRIPTS_AND_SUBSCRIPTS :: unicode_range { 0x2070, 47 }
|
|
|
|
+UNICODE_CURRENCY_SYMBOLS :: unicode_range { 0x20a0, 47 }
|
|
|
|
+UNICODE_COMBINING_DIACRITICAL_MARKS_FOR_SYMBOLS :: unicode_range { 0x20d0, 47 }
|
|
|
|
+UNICODE_LETTERLIKE_SYMBOLS :: unicode_range { 0x2100, 79 }
|
|
|
|
+UNICODE_NUMBER_FORMS :: unicode_range { 0x2150, 63 }
|
|
|
|
+UNICODE_ARROWS :: unicode_range { 0x2190, 111 }
|
|
|
|
+UNICODE_MATHEMATICAL_OPERATORS :: unicode_range { 0x2200, 255 }
|
|
|
|
+UNICODE_MISCELLANEOUS_TECHNICAL :: unicode_range { 0x2300, 255 }
|
|
|
|
+UNICODE_CONTROL_PICTURES :: unicode_range { 0x2400, 63 }
|
|
|
|
+UNICODE_OPTICAL_CHARACTER_RECOGNITION :: unicode_range { 0x2440, 31 }
|
|
|
|
+UNICODE_ENCLOSED_ALPHANUMERICS :: unicode_range { 0x2460, 159 }
|
|
|
|
+UNICODE_BOX_DRAWING :: unicode_range { 0x2500, 127 }
|
|
|
|
+UNICODE_BLOCK_ELEMENTS :: unicode_range { 0x2580, 31 }
|
|
|
|
+UNICODE_GEOMETRIC_SHAPES :: unicode_range { 0x25a0, 95 }
|
|
|
|
+UNICODE_MISCELLANEOUS_SYMBOLS :: unicode_range { 0x2600, 255 }
|
|
|
|
+UNICODE_DINGBATS :: unicode_range { 0x2700, 191 }
|
|
|
|
+UNICODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A :: unicode_range { 0x27c0, 47 }
|
|
|
|
+UNICODE_SUPPLEMENTAL_ARROWS_A :: unicode_range { 0x27f0, 15 }
|
|
|
|
+UNICODE_BRAILLE_PATTERNS :: unicode_range { 0x2800, 255 }
|
|
|
|
+UNICODE_SUPPLEMENTAL_ARROWS_B :: unicode_range { 0x2900, 127 }
|
|
|
|
+UNICODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B :: unicode_range { 0x2980, 127 }
|
|
|
|
+UNICODE_SUPPLEMENTAL_MATHEMATICAL_OPERATORS :: unicode_range { 0x2a00, 255 }
|
|
|
|
+UNICODE_MISCELLANEOUS_SYMBOLS_AND_ARROWS :: unicode_range { 0x2b00, 255 }
|
|
|
|
+UNICODE_CJK_RADICALS_SUPPLEMENT :: unicode_range { 0x2e80, 127 }
|
|
|
|
+UNICODE_KANGXI_RADICALS :: unicode_range { 0x2f00, 223 }
|
|
|
|
+UNICODE_IDEOGRAPHIC_DESCRIPTION_CHARACTERS :: unicode_range { 0x2ff0, 15 }
|
|
|
|
+UNICODE_CJK_SYMBOLS_AND_PUNCTUATION :: unicode_range { 0x3000, 63 }
|
|
|
|
+UNICODE_HIRAGANA :: unicode_range { 0x3040, 95 }
|
|
|
|
+UNICODE_KATAKANA :: unicode_range { 0x30a0, 95 }
|
|
|
|
+UNICODE_BOPOMOFO :: unicode_range { 0x3100, 47 }
|
|
|
|
+UNICODE_HANGUL_COMPATIBILITY_JAMO :: unicode_range { 0x3130, 95 }
|
|
|
|
+UNICODE_KANBUN_KUNTEN :: unicode_range { 0x3190, 15 }
|
|
|
|
+UNICODE_BOPOMOFO_EXTENDED :: unicode_range { 0x31a0, 31 }
|
|
|
|
+UNICODE_KATAKANA_PHONETIC_EXTENSIONS :: unicode_range { 0x31f0, 15 }
|
|
|
|
+UNICODE_ENCLOSED_CJK_LETTERS_AND_MONTHS :: unicode_range { 0x3200, 255 }
|
|
|
|
+UNICODE_CJK_COMPATIBILITY :: unicode_range { 0x3300, 255 }
|
|
|
|
+UNICODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A :: unicode_range { 0x3400, 6591 }
|
|
|
|
+UNICODE_YIJING_HEXAGRAM_SYMBOLS :: unicode_range { 0x4dc0, 63 }
|
|
|
|
+UNICODE_CJK_UNIFIED_IDEOGRAPHS :: unicode_range { 0x4e00, 20911 }
|
|
|
|
+UNICODE_YI_SYLLABLES :: unicode_range { 0xa000, 1167 }
|
|
|
|
+UNICODE_YI_RADICALS :: unicode_range { 0xa490, 63 }
|
|
|
|
+UNICODE_HANGUL_SYLLABLES :: unicode_range { 0xac00, 11183 }
|
|
|
|
+UNICODE_HIGH_SURROGATE_AREA :: unicode_range { 0xd800, 1023 }
|
|
|
|
+UNICODE_LOW_SURROGATE_AREA :: unicode_range { 0xdc00, 1023 }
|
|
|
|
+UNICODE_PRIVATE_USE_AREA :: unicode_range { 0xe000, 6399 }
|
|
|
|
+UNICODE_CJK_COMPATIBILITY_IDEOGRAPHS :: unicode_range { 0xf900, 511 }
|
|
|
|
+UNICODE_ALPHABETIC_PRESENTATION_FORMS :: unicode_range { 0xfb00, 79 }
|
|
|
|
+UNICODE_ARABIC_PRESENTATION_FORMS_A :: unicode_range { 0xfb50, 687 }
|
|
|
|
+UNICODE_VARIATION_SELECTORS :: unicode_range { 0xfe00, 15 }
|
|
|
|
+UNICODE_COMBINING_HALF_MARKS :: unicode_range { 0xfe20, 15 }
|
|
|
|
+UNICODE_CJK_COMPATIBILITY_FORMS :: unicode_range { 0xfe30, 31 }
|
|
|
|
+UNICODE_SMALL_FORM_VARIANTS :: unicode_range { 0xfe50, 31 }
|
|
|
|
+UNICODE_ARABIC_PRESENTATION_FORMS_B :: unicode_range { 0xfe70, 143 }
|
|
|
|
+UNICODE_HALFWIDTH_AND_FULLWIDTH_FORMS :: unicode_range { 0xff00, 239 }
|
|
|
|
+UNICODE_SPECIALS :: unicode_range { 0xfff0, 15 }
|
|
|
|
+UNICODE_LINEAR_B_SYLLABARY :: unicode_range { 0x10000, 127 }
|
|
|
|
+UNICODE_LINEAR_B_IDEOGRAMS :: unicode_range { 0x10080, 127 }
|
|
|
|
+UNICODE_AEGEAN_NUMBERS :: unicode_range { 0x10100, 63 }
|
|
|
|
+UNICODE_OLD_ITALIC :: unicode_range { 0x10300, 47 }
|
|
|
|
+UNICODE_GOTHIC :: unicode_range { 0x10330, 31 }
|
|
|
|
+UNICODE_UGARITIC :: unicode_range { 0x10380, 31 }
|
|
|
|
+UNICODE_DESERET :: unicode_range { 0x10400, 79 }
|
|
|
|
+UNICODE_SHAVIAN :: unicode_range { 0x10450, 47 }
|
|
|
|
+UNICODE_OSMANYA :: unicode_range { 0x10480, 47 }
|
|
|
|
+UNICODE_CYPRIOT_SYLLABARY :: unicode_range { 0x10800, 63 }
|
|
|
|
+UNICODE_BYZANTINE_MUSICAL_SYMBOLS :: unicode_range { 0x1d000, 255 }
|
|
|
|
+UNICODE_MUSICAL_SYMBOLS :: unicode_range { 0x1d100, 255 }
|
|
|
|
+UNICODE_TAI_XUAN_JING_SYMBOLS :: unicode_range { 0x1d300, 95 }
|
|
|
|
+UNICODE_MATHEMATICAL_ALPHANUMERIC_SYMBOLS :: unicode_range { 0x1d400, 1023 }
|
|
|
|
+UNICODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B :: unicode_range { 0x20000, 42719 }
|
|
|
|
+UNICODE_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT :: unicode_range { 0x2f800, 543 }
|
|
|
|
+UNICODE_TAGS :: unicode_range { 0xe0000, 127 }
|
|
|
|
+UNICODE_VARIATION_SELECTORS_SUPPLEMENT :: unicode_range { 0xe0100, 239 }
|
|
|
|
+UNICODE_SUPPLEMENTARY_PRIVATE_USE_AREA_A :: unicode_range { 0xf0000, 65533 }
|
|
|
|
+UNICODE_SUPPLEMENTARY_PRIVATE_USE_AREA_B :: unicode_range { 0x100000, 65533 }
|
|
|
|
+
|
|
|
|
+clock_kind :: enum c.int {
|
|
|
|
+ MONOTONIC,
|
|
|
|
+ UPTIME,
|
|
|
|
+ DATE,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ clock_time :: proc(clock: clock_kind) -> f64 ---
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+file_write_slice :: proc(file: file, slice: []char) -> u64 {
|
|
|
|
+ return file_write(file, u64(len(slice)), raw_data(slice))
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+file_read_slice :: proc(file: file, slice: []char) -> u64 {
|
|
|
|
+ return file_read(file, u64(len(slice)), raw_data(slice))
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+style_enum :: enum {
|
|
|
|
+ SIZE_WIDTH = 1,
|
|
|
|
+ SIZE_HEIGHT,
|
|
|
|
+
|
|
|
|
+ LAYOUT_AXIS,
|
|
|
|
+ LAYOUT_ALIGN_X,
|
|
|
|
+ LAYOUT_ALIGN_Y,
|
|
|
|
+ LAYOUT_SPACING,
|
|
|
|
+ LAYOUT_MARGIN_X,
|
|
|
|
+ LAYOUT_MARGIN_Y,
|
|
|
|
+
|
|
|
|
+ FLOAT_X,
|
|
|
|
+ FLOAT_Y,
|
|
|
|
+
|
|
|
|
+ COLOR,
|
|
|
|
+ BG_COLOR,
|
|
|
|
+ BORDER_COLOR,
|
|
|
|
+ BORDER_SIZE,
|
|
|
|
+ ROUNDNESS,
|
|
|
|
+
|
|
|
|
+ FONT,
|
|
|
|
+ FONT_SIZE,
|
|
|
|
+
|
|
|
|
+ ANIMATION_TIME,
|
|
|
|
+ ANIMATION_MASK,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_style_mask :: bit_set[style_enum; u64]
|
|
|
|
+
|
|
|
|
+// Masks like the C version that can be used as common combinations
|
|
|
|
+SIZE :: ui_style_mask { .SIZE_WIDTH, .SIZE_HEIGHT }
|
|
|
|
+LAYOUT_MARGINS :: ui_style_mask { .LAYOUT_MARGIN_X, .LAYOUT_MARGIN_Y }
|
|
|
|
+LAYOUT :: ui_style_mask { .LAYOUT_AXIS, .LAYOUT_ALIGN_X, .LAYOUT_ALIGN_Y, .LAYOUT_SPACING, .LAYOUT_MARGIN_X, .LAYOUT_MARGIN_Y }
|
|
|
|
+FLOAT :: ui_style_mask { .FLOAT_X, .FLOAT_Y }
|
|
|
|
+MASK_INHERITED :: ui_style_mask { .COLOR, .FONT, .FONT_SIZE, .ANIMATION_TIME, .ANIMATION_MASK }
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// Utility data structures and helpers used throughout the Orca API.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// Types and helpers for vectors and matrices.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+// A 2D vector type.
|
|
|
|
+vec2 :: [2]f32
|
|
|
|
+
|
|
|
|
+// A 3D vector type.
|
|
|
|
+vec3 :: [3]f32
|
|
|
|
+
|
|
|
|
+// A 2D integer vector type.
|
|
|
|
+vec2i :: [2]i32
|
|
|
|
+
|
|
|
|
+// A 4D vector type.
|
|
|
|
+vec4 :: [4]f32
|
|
|
|
+
|
|
|
|
+// A 2-by-3 matrix.
|
|
|
|
+mat2x3 :: [6]f32
|
|
|
|
+
|
|
|
|
+// An axis-aligned rectangle.
|
|
|
|
+rect :: struct { x, y, w, h: f32 }
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ // Check if two 2D vectors are equal.
|
|
|
|
+ vec2_equal :: proc(v0: vec2, v1: vec2) -> bool ---
|
|
|
|
+ // Multiply a 2D vector by a scalar.
|
|
|
|
+ vec2_mul :: proc(f: f32, v: vec2) -> vec2 ---
|
|
|
|
+ // Add two 2D vectors
|
|
|
|
+ vec2_add :: proc(v0: vec2, v1: vec2) -> vec2 ---
|
|
|
|
+ // Transforms a vector by an affine transformation represented as a 2x3 matrix.
|
|
|
|
+ mat2x3_mul :: proc(m: mat2x3, p: vec2) -> vec2 ---
|
|
|
|
+ // Multiply two affine transformations represented as 2x3 matrices. Both matrices are treated as 3x3 matrices with an implicit `(0, 0, 1)` bottom row
|
|
|
|
+ mat2x3_mul_m :: proc(lhs: mat2x3, rhs: mat2x3) -> mat2x3 ---
|
|
|
|
+ // Invert an affine transform represented as a 2x3 matrix.
|
|
|
|
+ mat2x3_inv :: proc(x: mat2x3) -> mat2x3 ---
|
|
|
|
+ // Return a 2x3 matrix representing a rotation.
|
|
|
|
+ mat2x3_rotate :: proc(radians: f32) -> mat2x3 ---
|
|
|
|
+ // Return a 2x3 matrix representing a translation.
|
|
|
|
+ mat2x3_translate :: proc(x: f32, y: f32) -> mat2x3 ---
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// Helpers for logging, asserting and aborting.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+// Constants allowing to specify the level of logging verbosity.
|
|
|
|
+log_level :: enum u32 {
|
|
|
|
+ // Only errors are logged.
|
|
|
|
+ ERROR = 0,
|
|
|
|
+ // Only warnings and errors are logged.
|
|
|
|
+ WARNING = 1,
|
|
|
|
+ // All messages are logged.
|
|
|
|
+ INFO = 2,
|
|
|
|
+ COUNT = 3,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ /*
|
|
|
|
+ Abort the application, showing an error message.
|
|
|
|
+
|
|
|
|
+ This function should not be called directly by user code, which should use the `OC_ABORT` macro instead, as the macro takes care of filling in the source location parameters of the function.
|
|
|
|
+ */
|
|
|
|
+ abort_ext :: proc(file: cstring, function: cstring, line: i32, fmt: cstring, #c_vararg args: ..any) -> ! ---
|
|
|
|
+ /*
|
|
|
|
+ Tigger a failed assertion. This aborts the application, showing the failed assertion and an error message.
|
|
|
|
+
|
|
|
|
+ This function should not be called directly by user code, which should use the `OC_ASSERT` macro instead. The macro checks the assert condition and calls the function if it is false. It also takes care of filling in the source location parameters of the function.
|
|
|
|
+ */
|
|
|
|
+ assert_fail :: proc(file: cstring, function: cstring, line: i32, src: cstring, fmt: cstring, #c_vararg args: ..any) -> ! ---
|
|
|
|
+ // Set the logging verbosity.
|
|
|
|
+ log_set_level :: proc(level: log_level) ---
|
|
|
|
+ /*
|
|
|
|
+ Log a message to the console.
|
|
|
|
+
|
|
|
|
+ This function should not be called directly by user code, which should use the `oc_log_XXX` family of macros instead. The macros take care of filling in the message level and source location parameters of the function.
|
|
|
|
+ */
|
|
|
|
+ log_ext :: proc(level: log_level, function: cstring, file: cstring, line: i32, fmt: cstring, #c_vararg args: ..any) ---
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// Types and helpers for doubly-linked lists.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+// An element of an intrusive doubly-linked list.
|
|
|
|
+list_elt :: struct {
|
|
|
|
+ // Points to the previous element in the list.
|
|
|
|
+ prev: ^list_elt,
|
|
|
|
+ // Points to the next element in the list.
|
|
|
|
+ next: ^list_elt,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A doubly-linked list.
|
|
|
|
+list :: struct {
|
|
|
|
+ // Points to the first element in the list.
|
|
|
|
+ first: ^list_elt,
|
|
|
|
+ // Points to the last element in the list.
|
|
|
|
+ last: ^list_elt,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ // Check if a list is empty.
|
|
|
|
+ list_empty :: proc(list: list) -> bool ---
|
|
|
|
+ // Zero-initializes a linked list.
|
|
|
|
+ list_init :: proc(list: ^list) ---
|
|
|
|
+ // Insert an element in a list after a given element.
|
|
|
|
+ list_insert :: proc(list: ^list, afterElt: ^list_elt, elt: ^list_elt) ---
|
|
|
|
+ // Insert an element in a list before a given element.
|
|
|
|
+ list_insert_before :: proc(list: ^list, beforeElt: ^list_elt, elt: ^list_elt) ---
|
|
|
|
+ // Remove an element from a list.
|
|
|
|
+ list_remove :: proc(list: ^list, elt: ^list_elt) ---
|
|
|
|
+ // Add an element at the end of a list.
|
|
|
|
+ list_push_back :: proc(list: ^list, elt: ^list_elt) ---
|
|
|
|
+ // Remove the last element from a list.
|
|
|
|
+ list_pop_back :: proc(list: ^list) -> ^list_elt ---
|
|
|
|
+ // Add an element at the beginning of a list.
|
|
|
|
+ list_push_front :: proc(list: ^list, elt: ^list_elt) ---
|
|
|
|
+ // Remove the first element from a list.
|
|
|
|
+ list_pop_front :: proc(list: ^list) -> ^list_elt ---
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// Base allocator and memory arenas.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+// The prototype of a procedure to reserve memory from the system.
|
|
|
|
+mem_reserve_proc :: proc "c" (_context: ^base_allocator, size: u64) -> rawptr
|
|
|
|
+
|
|
|
|
+// The prototype of a procedure to modify a memory reservation.
|
|
|
|
+mem_modify_proc :: proc "c" (_context: ^base_allocator, ptr: rawptr, size: u64)
|
|
|
|
+
|
|
|
|
+// A structure that defines how to allocate memory from the system.
|
|
|
|
+base_allocator :: struct {
|
|
|
|
+ // A procedure to reserve memory from the system.
|
|
|
|
+ reserve: mem_reserve_proc,
|
|
|
|
+ // A procedure to commit memory from the system.
|
|
|
|
+ commit: mem_modify_proc,
|
|
|
|
+ // A procedure to decommit memory from the system.
|
|
|
|
+ decommit: mem_modify_proc,
|
|
|
|
+ // A procedure to release memory previously reserved from the system.
|
|
|
|
+ release: mem_modify_proc,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A contiguous chunk of memory managed by a memory arena.
|
|
|
|
+arena_chunk :: struct {
|
|
|
|
+ listElt: list_elt,
|
|
|
|
+ ptr: cstring,
|
|
|
|
+ offset: u64,
|
|
|
|
+ committed: u64,
|
|
|
|
+ cap: u64,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A memory arena, allowing to allocate memory in a linear or stack-like fashion.
|
|
|
|
+arena :: struct {
|
|
|
|
+ // An allocator providing memory pages from the system
|
|
|
|
+ base: ^base_allocator,
|
|
|
|
+ // A list of `oc_arena_chunk` chunks.
|
|
|
|
+ chunks: list,
|
|
|
|
+ // The chunk new memory allocations are pulled from.
|
|
|
|
+ currentChunk: ^arena_chunk,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// This struct provides a way to store the current offset in a given arena, in order to reset the arena to that offset later. This allows using arenas in a stack-like fashion, e.g. to create temporary "scratch" allocations
|
|
|
|
+arena_scope :: struct {
|
|
|
|
+ // The arena which offset is stored.
|
|
|
|
+ arena: ^arena,
|
|
|
|
+ // The arena chunk to which the offset belongs.
|
|
|
|
+ chunk: ^arena_chunk,
|
|
|
|
+ // The offset to rewind the arena to.
|
|
|
|
+ offset: u64,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// Options for arena creation.
|
|
|
|
+arena_options :: struct {
|
|
|
|
+ // The base allocator to use with this arena
|
|
|
|
+ base: ^base_allocator,
|
|
|
|
+ // The amount of memory to reserve up-front when creating the arena.
|
|
|
|
+ reserve: u64,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ // Initialize a memory arena.
|
|
|
|
+ arena_init :: proc(arena: ^arena) ---
|
|
|
|
+ // Initialize a memory arena with additional options.
|
|
|
|
+ arena_init_with_options :: proc(arena: ^arena, options: ^arena_options) ---
|
|
|
|
+ // Release all resources allocated to a memory arena.
|
|
|
|
+ arena_cleanup :: proc(arena: ^arena) ---
|
|
|
|
+ // Allocate a block of memory from an arena.
|
|
|
|
+ arena_push :: proc(arena: ^arena, size: u64) -> rawptr ---
|
|
|
|
+ // Allocate an aligned block of memory from an arena.
|
|
|
|
+ arena_push_aligned :: proc(arena: ^arena, size: u64, alignment: u32) -> rawptr ---
|
|
|
|
+ // Reset an arena. All memory that was previously allocated from this arena is released to the arena, and can be reallocated by later calls to `oc_arena_push` and similar functions. No memory is actually released _to the system_.
|
|
|
|
+ arena_clear :: proc(arena: ^arena) ---
|
|
|
|
+ // Begin a memory scope. This creates an `oc_arena_scope` object that stores the current offset of the arena. The arena can later be reset to that offset by calling `oc_arena_scope_end`, releasing all memory that was allocated within the scope to the arena.
|
|
|
|
+ arena_scope_begin :: proc(arena: ^arena) -> arena_scope ---
|
|
|
|
+ // End a memory scope. This resets an arena to the offset it had when the scope was created. All memory allocated within the scope is released back to the arena.
|
|
|
|
+ arena_scope_end :: proc(scope: arena_scope) ---
|
|
|
|
+ /*
|
|
|
|
+ Begin a scratch scope. This creates a memory scope on a per-thread, global "scratch" arena. This allows easily creating temporary memory for scratch computations or intermediate results, in a stack-like fashion.
|
|
|
|
+
|
|
|
|
+ If you must return results in an arena passed by the caller, and you also use a scratch arena to do intermediate computations, beware that the results arena could itself be a scatch arena. In this case, you have to be careful not to intermingle your scratch computations with the final result, or clear your result entirely. You can either:
|
|
|
|
+
|
|
|
|
+ - Allocate memory for the result upfront and call `oc_scratch_begin` afterwards, if possible.
|
|
|
|
+ - Use `oc_scratch_begin_next()` and pass it the result arena, to get a scratch arena that does not conflict with it.
|
|
|
|
+ */
|
|
|
|
+ scratch_begin :: proc() -> arena_scope ---
|
|
|
|
+ // Begin a scratch scope that does not conflict with a given arena. See `oc_scratch_begin()` for more details about when to use this function.
|
|
|
|
+ scratch_begin_next :: proc(used: ^arena) -> arena_scope ---
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// String slices and string lists.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+// A type representing a string of bytes.
|
|
|
|
+str8 :: string
|
|
|
|
+
|
|
|
|
+// A type representing an element of a string list.
|
|
|
|
+str8_elt :: struct {
|
|
|
|
+ // The string element is linked into its parent string list through this field.
|
|
|
|
+ listElt: list_elt,
|
|
|
|
+ // The string for this element.
|
|
|
|
+ string: str8,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A type representing a string list.
|
|
|
|
+str8_list :: struct {
|
|
|
|
+ // A linked-list of `oc_str8_elt`.
|
|
|
|
+ list: list,
|
|
|
|
+ // The number of elements in `list`.
|
|
|
|
+ eltCount: u64,
|
|
|
|
+ // The total length of the string list, which is the sum of the lengths over all elements.
|
|
|
|
+ len: u64,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A type describing a string of 16-bits characters (typically used for UTF-16).
|
|
|
|
+str16 :: distinct []u16
|
|
|
|
+
|
|
|
|
+// A type representing an element of an `oc_str16` list.
|
|
|
|
+str16_elt :: struct {
|
|
|
|
+ // The string element is linked into its parent string list through this field.
|
|
|
|
+ listElt: list_elt,
|
|
|
|
+ // The string for this element.
|
|
|
|
+ string: str16,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+str16_list :: struct {
|
|
|
|
+ // A linked-list of `oc_str16_elt`.
|
|
|
|
+ list: list,
|
|
|
|
+ // The number of elements in `list`.
|
|
|
|
+ eltCount: u64,
|
|
|
|
+ // The total length of the string list, which is the sum of the lengths over all elements.
|
|
|
|
+ len: u64,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A type describing a string of 32-bits characters (typically used for UTF-32 codepoints).
|
|
|
|
+str32 :: distinct []rune
|
|
|
|
+
|
|
|
|
+// A type representing an element of an `oc_str32` list.
|
|
|
|
+str32_elt :: struct {
|
|
|
|
+ // The string element is linked into its parent string list through this field.
|
|
|
|
+ listElt: list_elt,
|
|
|
|
+ // The string for this element.
|
|
|
|
+ string: str32,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+str32_list :: struct {
|
|
|
|
+ // A linked-list of `oc_str32_elt`.
|
|
|
|
+ list: list,
|
|
|
|
+ // The number of elements in `list`.
|
|
|
|
+ eltCount: u64,
|
|
|
|
+ // The total length of the string list, which is the sum of the lengths over all elements.
|
|
|
|
+ len: u64,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ // Make a string from a bytes buffer and a length.
|
|
|
|
+ str8_from_buffer :: proc(len: u64, buffer: [^]char) -> str8 ---
|
|
|
|
+ // Make a string from a slice of another string. The resulting string designates some subsequence of the input string.
|
|
|
|
+ str8_slice :: proc(s: str8, start: u64, end: u64) -> str8 ---
|
|
|
|
+ // Pushes a copy of a buffer to an arena, and makes a string refering to that copy.
|
|
|
|
+ str8_push_buffer :: proc(arena: ^arena, len: u64, buffer: [^]char) -> str8 ---
|
|
|
|
+ // Pushes a copy of a C null-terminated string to an arena, and makes a string referring to that copy.
|
|
|
|
+ str8_push_cstring :: proc(arena: ^arena, str: cstring) -> str8 ---
|
|
|
|
+ // Copy the contents of a string on an arena and make a new string referring to the copied bytes.
|
|
|
|
+ str8_push_copy :: proc(arena: ^arena, s: str8) -> str8 ---
|
|
|
|
+ // Make a copy of a string slice. This function copies a subsequence of the input string onto an arena, and returns a new string referring to the copied content.
|
|
|
|
+ str8_push_slice :: proc(arena: ^arena, s: str8, start: u64, end: u64) -> str8 ---
|
|
|
|
+ // Lexicographically compare the contents of two strings.
|
|
|
|
+ str8_cmp :: proc(s1: str8, s2: str8) -> i32 ---
|
|
|
|
+ // Create a null-terminated C-string from an `oc_str8` string.
|
|
|
|
+ str8_to_cstring :: proc(arena: ^arena, string: str8) -> cstring ---
|
|
|
|
+ // Push a string element to the back of a string list. This creates a `oc_str8_elt` element referring to the contents of the input string, and links that element at the end of the string list.
|
|
|
|
+ str8_list_push :: proc(arena: ^arena, list: ^str8_list, str: str8) ---
|
|
|
|
+ // Build a string from a null-terminated format string an variadic arguments, and append it to a string list.
|
|
|
|
+ str8_list_pushf :: proc(arena: ^arena, list: ^str8_list, format: cstring, #c_vararg args: ..any) ---
|
|
|
|
+ // Build a string by combining the elements of a string list with a prefix, a suffix, and separators.
|
|
|
|
+ str8_list_collate :: proc(arena: ^arena, list: str8_list, prefix: str8, separator: str8, suffix: str8) -> str8 ---
|
|
|
|
+ // Build a string by joining the elements of a string list.
|
|
|
|
+ str8_list_join :: proc(arena: ^arena, list: str8_list) -> str8 ---
|
|
|
|
+ /*
|
|
|
|
+ Split a list into a string list according to separators.
|
|
|
|
+
|
|
|
|
+ No string copies are made. The elements of the resulting string list refer to subsequences of the input string.
|
|
|
|
+ */
|
|
|
|
+ str8_split :: proc(arena: ^arena, str: str8, separators: str8_list) -> str8_list ---
|
|
|
|
+ // Make an `oc_str16` string from a buffer of 16-bit characters.
|
|
|
|
+ str16_from_buffer :: proc(len: u64, buffer: [^]u16) -> str16 ---
|
|
|
|
+ // Make an `oc_str16` string from a slice of another `oc_str16` string.
|
|
|
|
+ str16_slice :: proc(s: str16, start: u64, end: u64) -> str16 ---
|
|
|
|
+ // Copy the content of a 16-bit character buffer on an arena and make a new `oc_str16` referencing the copied contents.
|
|
|
|
+ str16_push_buffer :: proc(arena: ^arena, len: u64, buffer: [^]u16) -> str16 ---
|
|
|
|
+ // Copy the contents of an `oc_str16` string and make a new string referencing the copied contents.
|
|
|
|
+ str16_push_copy :: proc(arena: ^arena, s: str16) -> str16 ---
|
|
|
|
+ // Copy a slice of an `oc_str16` string an make a new string referencing the copies contents.
|
|
|
|
+ str16_push_slice :: proc(arena: ^arena, s: str16, start: u64, end: u64) -> str16 ---
|
|
|
|
+ // Push a string element to the back of a string list. This creates a `oc_str16_elt` element referring to the contents of the input string, and links that element at the end of the string list.
|
|
|
|
+ str16_list_push :: proc(arena: ^arena, list: ^str16_list, str: str16) ---
|
|
|
|
+ // Build a string by joining the elements of a string list.
|
|
|
|
+ str16_list_join :: proc(arena: ^arena, list: str16_list) -> str16 ---
|
|
|
|
+ /*
|
|
|
|
+ Split a list into a string list according to separators.
|
|
|
|
+
|
|
|
|
+ No string copies are made. The elements of the resulting string list refer to subsequences of the input string.
|
|
|
|
+ */
|
|
|
|
+ str16_split :: proc(arena: ^arena, str: str16, separators: str16_list) -> str16_list ---
|
|
|
|
+ // Make an `oc_str32` string from a buffer of 32-bit characters.
|
|
|
|
+ str32_from_buffer :: proc(len: u64, buffer: [^]u32) -> str32 ---
|
|
|
|
+ // Make an `oc_str32` string from a slice of another `oc_str32` string.
|
|
|
|
+ str32_slice :: proc(s: str32, start: u64, end: u64) -> str32 ---
|
|
|
|
+ // Copy the content of a 32-bit character buffer on an arena and make a new `oc_str32` referencing the copied contents.
|
|
|
|
+ str32_push_buffer :: proc(arena: ^arena, len: u64, buffer: [^]u32) -> str32 ---
|
|
|
|
+ // Copy the contents of an `oc_str32` string and make a new string referencing the copied contents.
|
|
|
|
+ str32_push_copy :: proc(arena: ^arena, s: str32) -> str32 ---
|
|
|
|
+ // Copy a slice of an `oc_str32` string an make a new string referencing the copies contents.
|
|
|
|
+ str32_push_slice :: proc(arena: ^arena, s: str32, start: u64, end: u64) -> str32 ---
|
|
|
|
+ // Push a string element to the back of a string list. This creates a `oc_str32_elt` element referring to the contents of the input string, and links that element at the end of the string list.
|
|
|
|
+ str32_list_push :: proc(arena: ^arena, list: ^str32_list, str: str32) ---
|
|
|
|
+ // Build a string by joining the elements of a string list.
|
|
|
|
+ str32_list_join :: proc(arena: ^arena, list: str32_list) -> str32 ---
|
|
|
|
+ /*
|
|
|
|
+ Split a list into a string list according to separators.
|
|
|
|
+
|
|
|
|
+ No string copies are made. The elements of the resulting string list refer to subsequences of the input string.
|
|
|
|
+ */
|
|
|
|
+ str32_split :: proc(arena: ^arena, str: str32, separators: str32_list) -> str32_list ---
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// UTF8 encoding/decoding.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+// A unicode codepoint.
|
|
|
|
+utf32 :: rune
|
|
|
|
+
|
|
|
|
+// A type representing the result of decoding of utf8-encoded codepoint.
|
|
|
|
+utf8_dec :: struct {
|
|
|
|
+ // The decoded codepoint.
|
|
|
|
+ codepoint: utf32,
|
|
|
|
+ // The size of the utf8 sequence encoding that codepoint.
|
|
|
|
+ size: u32,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A type representing a contiguous range of unicode codepoints.
|
|
|
|
+unicode_range :: struct {
|
|
|
|
+ // The first codepoint of the range.
|
|
|
|
+ firstCodePoint: utf32,
|
|
|
|
+ // The number of codepoints in the range.
|
|
|
|
+ count: u32,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ // Get the size of a utf8-encoded codepoint for the first byte of the encoded sequence.
|
|
|
|
+ utf8_size_from_leading_char :: proc(leadingChar: char) -> u32 ---
|
|
|
|
+ // Get the size of the utf8 encoding of a codepoint.
|
|
|
|
+ utf8_codepoint_size :: proc(codePoint: utf32) -> u32 ---
|
|
|
|
+ utf8_codepoint_count_for_string :: proc(string: str8) -> u64 ---
|
|
|
|
+ // Get the length of the utf8 encoding of a sequence of unicode codepoints.
|
|
|
|
+ utf8_byte_count_for_codepoints :: proc(codePoints: str32) -> u64 ---
|
|
|
|
+ // Get the offset of the next codepoint after a given offset, in a utf8 encoded string.
|
|
|
|
+ utf8_next_offset :: proc(string: str8, byteOffset: u64) -> u64 ---
|
|
|
|
+ // Get the offset of the previous codepoint before a given offset, in a utf8 encoded string.
|
|
|
|
+ utf8_prev_offset :: proc(string: str8, byteOffset: u64) -> u64 ---
|
|
|
|
+ // Decode a utf8 encoded codepoint.
|
|
|
|
+ utf8_decode :: proc(string: str8) -> utf8_dec ---
|
|
|
|
+ // Decode a codepoint at a given offset in a utf8 encoded string.
|
|
|
|
+ utf8_decode_at :: proc(string: str8, offset: u64) -> utf8_dec ---
|
|
|
|
+ // Encode a unicode codepoint into a utf8 sequence.
|
|
|
|
+ utf8_encode :: proc(dst: cstring, codePoint: utf32) -> str8 ---
|
|
|
|
+ // Decode a utf8 string to a string of unicode codepoints using memory passed by the caller.
|
|
|
|
+ utf8_to_codepoints :: proc(maxCount: u64, backing: ^utf32, string: str8) -> str32 ---
|
|
|
|
+ // Encode a string of unicode codepoints into a utf8 string using memory passed by the caller.
|
|
|
|
+ utf8_from_codepoints :: proc(maxBytes: u64, backing: cstring, codePoints: str32) -> str8 ---
|
|
|
|
+ // Decode a utf8 encoded string to a string of unicode codepoints using an arena.
|
|
|
|
+ utf8_push_to_codepoints :: proc(arena: ^arena, string: str8) -> str32 ---
|
|
|
|
+ // Encode a string of unicode codepoints into a utf8 string using an arena.
|
|
|
|
+ utf8_push_from_codepoints :: proc(arena: ^arena, codePoints: str32) -> str8 ---
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// Input, windowing, dialogs.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// Application events.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+// This enum defines the type events that can be sent to the application by the runtime. This determines which member of the `oc_event` union field is active.
|
|
|
|
+event_type :: enum u32 {
|
|
|
|
+ // No event. That could be used simply to wake up the application.
|
|
|
|
+ NONE = 0,
|
|
|
|
+ // A modifier key event. This event is sent when a key such as <kbd>Alt</kbd>, <kbd>Control</kbd>, <kbd>Command</kbd> or <kbd>Shift</kbd> are pressed, released, or repeated. The `key` field contains the event's details.
|
|
|
|
+ KEYBOARD_MODS = 1,
|
|
|
|
+ // A key event. This event is sent when a normal key is pressed, released, or repeated. The `key` field contains the event's details.
|
|
|
|
+ KEYBOARD_KEY = 2,
|
|
|
|
+ // A character input event. This event is sent when an input character is produced by the keyboard. The `character` field contains the event's details.
|
|
|
|
+ KEYBOARD_CHAR = 3,
|
|
|
|
+ // A mouse button event. This is event sent when one of the mouse buttons is pressed, released, or clicked. The `key` field contains the event's details.
|
|
|
|
+ MOUSE_BUTTON = 4,
|
|
|
|
+ // A mouse move event. This is event sent when the mouse is moved. The `mouse` field contains the event's details.
|
|
|
|
+ MOUSE_MOVE = 5,
|
|
|
|
+ // A mouse wheel event. This is event sent when the mouse wheel is moved (or when a trackpad is scrolled). The `mouse` field contains the event's details.
|
|
|
|
+ MOUSE_WHEEL = 6,
|
|
|
|
+ // A mouse enter event. This event is sent when the mouse enters the application's window. The `mouse` field contains the event's details.
|
|
|
|
+ MOUSE_ENTER = 7,
|
|
|
|
+ // A mouse leave event. This event is sent when the mouse leaves the application's window.
|
|
|
|
+ MOUSE_LEAVE = 8,
|
|
|
|
+ // A clipboard paste event. This event is sent when the user uses the paste shortcut while the application window has focus.
|
|
|
|
+ CLIPBOARD_PASTE = 9,
|
|
|
|
+ // A resize event. This event is sent when the application's window is resized. The `move` field contains the event's details.
|
|
|
|
+ WINDOW_RESIZE = 10,
|
|
|
|
+ // A move event. This event is sent when the window is moved. The `move` field contains the event's details.
|
|
|
|
+ WINDOW_MOVE = 11,
|
|
|
|
+ // A focus event. This event is sent when the application gains focus.
|
|
|
|
+ WINDOW_FOCUS = 12,
|
|
|
|
+ // An unfocus event. This event is sent when the application looses focus.
|
|
|
|
+ WINDOW_UNFOCUS = 13,
|
|
|
|
+ // A hide event. This event is sent when the application's window is hidden or minimized.
|
|
|
|
+ WINDOW_HIDE = 14,
|
|
|
|
+ // A show event. This event is sent when the application's window is shown or de-minimized.
|
|
|
|
+ WINDOW_SHOW = 15,
|
|
|
|
+ // A close event. This event is sent when the window is about to be closed.
|
|
|
|
+ WINDOW_CLOSE = 16,
|
|
|
|
+ // A path drop event. This event is sent when the user drops files onto the application's window. The `paths` field contains the event's details.
|
|
|
|
+ PATHDROP = 17,
|
|
|
|
+ // A frame event. This event is sent when the application should render a frame.
|
|
|
|
+ FRAME = 18,
|
|
|
|
+ // A quit event. This event is sent when the application has been requested to quit.
|
|
|
|
+ QUIT = 19,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// This enum describes the actions that can happen to a key.
|
|
|
|
+key_action :: enum u32 {
|
|
|
|
+ // No action happened on that key.
|
|
|
|
+ NO_ACTION = 0,
|
|
|
|
+ // The key was pressed.
|
|
|
|
+ PRESS = 1,
|
|
|
|
+ // The key was released.
|
|
|
|
+ RELEASE = 2,
|
|
|
|
+ // The key was maintained pressed at least for the system's key repeat period.
|
|
|
|
+ REPEAT = 3,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A code representing a key's physical location. This is independent of the system's keyboard layout.
|
|
|
|
+scan_code :: enum u32 {
|
|
|
|
+ UNKNOWN = 0,
|
|
|
|
+ SPACE = 32,
|
|
|
|
+ APOSTROPHE = 39,
|
|
|
|
+ COMMA = 44,
|
|
|
|
+ MINUS = 45,
|
|
|
|
+ PERIOD = 46,
|
|
|
|
+ SLASH = 47,
|
|
|
|
+ _0 = 48,
|
|
|
|
+ _1 = 49,
|
|
|
|
+ _2 = 50,
|
|
|
|
+ _3 = 51,
|
|
|
|
+ _4 = 52,
|
|
|
|
+ _5 = 53,
|
|
|
|
+ _6 = 54,
|
|
|
|
+ _7 = 55,
|
|
|
|
+ _8 = 56,
|
|
|
|
+ _9 = 57,
|
|
|
|
+ SEMICOLON = 59,
|
|
|
|
+ EQUAL = 61,
|
|
|
|
+ LEFT_BRACKET = 91,
|
|
|
|
+ BACKSLASH = 92,
|
|
|
|
+ RIGHT_BRACKET = 93,
|
|
|
|
+ GRAVE_ACCENT = 96,
|
|
|
|
+ A = 97,
|
|
|
|
+ B = 98,
|
|
|
|
+ C = 99,
|
|
|
|
+ D = 100,
|
|
|
|
+ E = 101,
|
|
|
|
+ F = 102,
|
|
|
|
+ G = 103,
|
|
|
|
+ H = 104,
|
|
|
|
+ I = 105,
|
|
|
|
+ J = 106,
|
|
|
|
+ K = 107,
|
|
|
|
+ L = 108,
|
|
|
|
+ M = 109,
|
|
|
|
+ N = 110,
|
|
|
|
+ O = 111,
|
|
|
|
+ P = 112,
|
|
|
|
+ Q = 113,
|
|
|
|
+ R = 114,
|
|
|
|
+ S = 115,
|
|
|
|
+ T = 116,
|
|
|
|
+ U = 117,
|
|
|
|
+ V = 118,
|
|
|
|
+ W = 119,
|
|
|
|
+ X = 120,
|
|
|
|
+ Y = 121,
|
|
|
|
+ Z = 122,
|
|
|
|
+ WORLD_1 = 161,
|
|
|
|
+ WORLD_2 = 162,
|
|
|
|
+ ESCAPE = 256,
|
|
|
|
+ ENTER = 257,
|
|
|
|
+ TAB = 258,
|
|
|
|
+ BACKSPACE = 259,
|
|
|
|
+ INSERT = 260,
|
|
|
|
+ DELETE = 261,
|
|
|
|
+ RIGHT = 262,
|
|
|
|
+ LEFT = 263,
|
|
|
|
+ DOWN = 264,
|
|
|
|
+ UP = 265,
|
|
|
|
+ PAGE_UP = 266,
|
|
|
|
+ PAGE_DOWN = 267,
|
|
|
|
+ HOME = 268,
|
|
|
|
+ END = 269,
|
|
|
|
+ CAPS_LOCK = 280,
|
|
|
|
+ SCROLL_LOCK = 281,
|
|
|
|
+ NUM_LOCK = 282,
|
|
|
|
+ PRINT_SCREEN = 283,
|
|
|
|
+ PAUSE = 284,
|
|
|
|
+ F1 = 290,
|
|
|
|
+ F2 = 291,
|
|
|
|
+ F3 = 292,
|
|
|
|
+ F4 = 293,
|
|
|
|
+ F5 = 294,
|
|
|
|
+ F6 = 295,
|
|
|
|
+ F7 = 296,
|
|
|
|
+ F8 = 297,
|
|
|
|
+ F9 = 298,
|
|
|
|
+ F10 = 299,
|
|
|
|
+ F11 = 300,
|
|
|
|
+ F12 = 301,
|
|
|
|
+ F13 = 302,
|
|
|
|
+ F14 = 303,
|
|
|
|
+ F15 = 304,
|
|
|
|
+ F16 = 305,
|
|
|
|
+ F17 = 306,
|
|
|
|
+ F18 = 307,
|
|
|
|
+ F19 = 308,
|
|
|
|
+ F20 = 309,
|
|
|
|
+ F21 = 310,
|
|
|
|
+ F22 = 311,
|
|
|
|
+ F23 = 312,
|
|
|
|
+ F24 = 313,
|
|
|
|
+ F25 = 314,
|
|
|
|
+ KP_0 = 320,
|
|
|
|
+ KP_1 = 321,
|
|
|
|
+ KP_2 = 322,
|
|
|
|
+ KP_3 = 323,
|
|
|
|
+ KP_4 = 324,
|
|
|
|
+ KP_5 = 325,
|
|
|
|
+ KP_6 = 326,
|
|
|
|
+ KP_7 = 327,
|
|
|
|
+ KP_8 = 328,
|
|
|
|
+ KP_9 = 329,
|
|
|
|
+ KP_DECIMAL = 330,
|
|
|
|
+ KP_DIVIDE = 331,
|
|
|
|
+ KP_MULTIPLY = 332,
|
|
|
|
+ KP_SUBTRACT = 333,
|
|
|
|
+ KP_ADD = 334,
|
|
|
|
+ KP_ENTER = 335,
|
|
|
|
+ KP_EQUAL = 336,
|
|
|
|
+ LEFT_SHIFT = 340,
|
|
|
|
+ LEFT_CONTROL = 341,
|
|
|
|
+ LEFT_ALT = 342,
|
|
|
|
+ LEFT_SUPER = 343,
|
|
|
|
+ RIGHT_SHIFT = 344,
|
|
|
|
+ RIGHT_CONTROL = 345,
|
|
|
|
+ RIGHT_ALT = 346,
|
|
|
|
+ RIGHT_SUPER = 347,
|
|
|
|
+ MENU = 348,
|
|
|
|
+ COUNT = 349,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A code identifying a key. The physical location of the key corresponding to a given key code depends on the system's keyboard layout.
|
|
|
|
+key_code :: enum u32 {
|
|
|
|
+ UNKNOWN = 0,
|
|
|
|
+ SPACE = 32,
|
|
|
|
+ APOSTROPHE = 39,
|
|
|
|
+ COMMA = 44,
|
|
|
|
+ MINUS = 45,
|
|
|
|
+ PERIOD = 46,
|
|
|
|
+ SLASH = 47,
|
|
|
|
+ _0 = 48,
|
|
|
|
+ _1 = 49,
|
|
|
|
+ _2 = 50,
|
|
|
|
+ _3 = 51,
|
|
|
|
+ _4 = 52,
|
|
|
|
+ _5 = 53,
|
|
|
|
+ _6 = 54,
|
|
|
|
+ _7 = 55,
|
|
|
|
+ _8 = 56,
|
|
|
|
+ _9 = 57,
|
|
|
|
+ SEMICOLON = 59,
|
|
|
|
+ EQUAL = 61,
|
|
|
|
+ LEFT_BRACKET = 91,
|
|
|
|
+ BACKSLASH = 92,
|
|
|
|
+ RIGHT_BRACKET = 93,
|
|
|
|
+ GRAVE_ACCENT = 96,
|
|
|
|
+ A = 97,
|
|
|
|
+ B = 98,
|
|
|
|
+ C = 99,
|
|
|
|
+ D = 100,
|
|
|
|
+ E = 101,
|
|
|
|
+ F = 102,
|
|
|
|
+ G = 103,
|
|
|
|
+ H = 104,
|
|
|
|
+ I = 105,
|
|
|
|
+ J = 106,
|
|
|
|
+ K = 107,
|
|
|
|
+ L = 108,
|
|
|
|
+ M = 109,
|
|
|
|
+ N = 110,
|
|
|
|
+ O = 111,
|
|
|
|
+ P = 112,
|
|
|
|
+ Q = 113,
|
|
|
|
+ R = 114,
|
|
|
|
+ S = 115,
|
|
|
|
+ T = 116,
|
|
|
|
+ U = 117,
|
|
|
|
+ V = 118,
|
|
|
|
+ W = 119,
|
|
|
|
+ X = 120,
|
|
|
|
+ Y = 121,
|
|
|
|
+ Z = 122,
|
|
|
|
+ WORLD_1 = 161,
|
|
|
|
+ WORLD_2 = 162,
|
|
|
|
+ ESCAPE = 256,
|
|
|
|
+ ENTER = 257,
|
|
|
|
+ TAB = 258,
|
|
|
|
+ BACKSPACE = 259,
|
|
|
|
+ INSERT = 260,
|
|
|
|
+ DELETE = 261,
|
|
|
|
+ RIGHT = 262,
|
|
|
|
+ LEFT = 263,
|
|
|
|
+ DOWN = 264,
|
|
|
|
+ UP = 265,
|
|
|
|
+ PAGE_UP = 266,
|
|
|
|
+ PAGE_DOWN = 267,
|
|
|
|
+ HOME = 268,
|
|
|
|
+ END = 269,
|
|
|
|
+ CAPS_LOCK = 280,
|
|
|
|
+ SCROLL_LOCK = 281,
|
|
|
|
+ NUM_LOCK = 282,
|
|
|
|
+ PRINT_SCREEN = 283,
|
|
|
|
+ PAUSE = 284,
|
|
|
|
+ F1 = 290,
|
|
|
|
+ F2 = 291,
|
|
|
|
+ F3 = 292,
|
|
|
|
+ F4 = 293,
|
|
|
|
+ F5 = 294,
|
|
|
|
+ F6 = 295,
|
|
|
|
+ F7 = 296,
|
|
|
|
+ F8 = 297,
|
|
|
|
+ F9 = 298,
|
|
|
|
+ F10 = 299,
|
|
|
|
+ F11 = 300,
|
|
|
|
+ F12 = 301,
|
|
|
|
+ F13 = 302,
|
|
|
|
+ F14 = 303,
|
|
|
|
+ F15 = 304,
|
|
|
|
+ F16 = 305,
|
|
|
|
+ F17 = 306,
|
|
|
|
+ F18 = 307,
|
|
|
|
+ F19 = 308,
|
|
|
|
+ F20 = 309,
|
|
|
|
+ F21 = 310,
|
|
|
|
+ F22 = 311,
|
|
|
|
+ F23 = 312,
|
|
|
|
+ F24 = 313,
|
|
|
|
+ F25 = 314,
|
|
|
|
+ KP_0 = 320,
|
|
|
|
+ KP_1 = 321,
|
|
|
|
+ KP_2 = 322,
|
|
|
|
+ KP_3 = 323,
|
|
|
|
+ KP_4 = 324,
|
|
|
|
+ KP_5 = 325,
|
|
|
|
+ KP_6 = 326,
|
|
|
|
+ KP_7 = 327,
|
|
|
|
+ KP_8 = 328,
|
|
|
|
+ KP_9 = 329,
|
|
|
|
+ KP_DECIMAL = 330,
|
|
|
|
+ KP_DIVIDE = 331,
|
|
|
|
+ KP_MULTIPLY = 332,
|
|
|
|
+ KP_SUBTRACT = 333,
|
|
|
|
+ KP_ADD = 334,
|
|
|
|
+ KP_ENTER = 335,
|
|
|
|
+ KP_EQUAL = 336,
|
|
|
|
+ LEFT_SHIFT = 340,
|
|
|
|
+ LEFT_CONTROL = 341,
|
|
|
|
+ LEFT_ALT = 342,
|
|
|
|
+ LEFT_SUPER = 343,
|
|
|
|
+ RIGHT_SHIFT = 344,
|
|
|
|
+ RIGHT_CONTROL = 345,
|
|
|
|
+ RIGHT_ALT = 346,
|
|
|
|
+ RIGHT_SUPER = 347,
|
|
|
|
+ MENU = 348,
|
|
|
|
+ COUNT = 349,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+keymod_flag :: enum u32 {
|
|
|
|
+ ALT = 0,
|
|
|
|
+ SHIFT,
|
|
|
|
+ CTRL,
|
|
|
|
+ CMD,
|
|
|
|
+ MAIN_MODIFIER,
|
|
|
|
+}
|
|
|
|
+keymod_flags :: bit_set[keymod_flag; u32]
|
|
|
|
+
|
|
|
|
+// A code identifying a mouse button.
|
|
|
|
+mouse_button :: enum u32 {
|
|
|
|
+ LEFT = 0,
|
|
|
|
+ RIGHT = 1,
|
|
|
|
+ MIDDLE = 2,
|
|
|
|
+ EXT1 = 3,
|
|
|
|
+ EXT2 = 4,
|
|
|
|
+ BUTTON_COUNT = 5,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A structure describing a key event or a mouse button event.
|
|
|
|
+key_event :: struct {
|
|
|
|
+ // The action that was done on the key.
|
|
|
|
+ action: key_action,
|
|
|
|
+ // The scan code of the key. Only valid for key events.
|
|
|
|
+ scanCode: scan_code,
|
|
|
|
+ // The key code of the key. Only valid for key events.
|
|
|
|
+ keyCode: key_code,
|
|
|
|
+ // The button of the mouse. Only valid for mouse button events.
|
|
|
|
+ button: mouse_button,
|
|
|
|
+ // Modifier flags indicating which modifier keys where pressed at the time of the event.
|
|
|
|
+ mods: keymod_flags,
|
|
|
|
+ // The number of clicks that where detected for the button. Only valid for mouse button events.
|
|
|
|
+ clickCount: u8,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A structure describing a character input event.
|
|
|
|
+char_event :: struct {
|
|
|
|
+ // The unicode codepoint of the character.
|
|
|
|
+ codepoint: utf32,
|
|
|
|
+ // The utf8 sequence of the character.
|
|
|
|
+ sequence: [8]char,
|
|
|
|
+ // The utf8 sequence length.
|
|
|
|
+ seqLen: u8,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A structure describing a mouse move or a mouse wheel event. Mouse coordinates have their origin at the top-left corner of the window, with the y axis going down.
|
|
|
|
+mouse_event :: struct {
|
|
|
|
+ // The x coordinate of the mouse.
|
|
|
|
+ x: f32,
|
|
|
|
+ // The y coordinate of the mouse.
|
|
|
|
+ y: f32,
|
|
|
|
+ // The delta from the last x coordinate of the mouse, or the scroll value along the x coordinate.
|
|
|
|
+ deltaX: f32,
|
|
|
|
+ // The delta from the last y coordinate of the mouse, or the scoll value along the y coordinate.
|
|
|
|
+ deltaY: f32,
|
|
|
|
+ // Modifier flags indicating which modifier keys where pressed at the time of the event.
|
|
|
|
+ mods: keymod_flags,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A structure describing a window move or resize event.
|
|
|
|
+move_event :: struct {
|
|
|
|
+ // The position and dimension of the frame rectangle, i.e. including the window title bar and border.
|
|
|
|
+ frame: rect,
|
|
|
|
+ // The position and dimension of the content rectangle, relative to the frame rectangle.
|
|
|
|
+ content: rect,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A structure describing an event sent to the application.
|
|
|
|
+event :: struct {
|
|
|
|
+ // The window in which this event happened.
|
|
|
|
+ window: window,
|
|
|
|
+ // The type of the event. This determines which member of the event union is active.
|
|
|
|
+ type: event_type,
|
|
|
|
+ using _: struct #raw_union {
|
|
|
|
+ key: key_event,
|
|
|
|
+ character: char_event,
|
|
|
|
+ mouse: mouse_event,
|
|
|
|
+ move: move_event,
|
|
|
|
+ paths: str8_list,
|
|
|
|
+ },
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// This enum describes the kinds of possible file dialogs.
|
|
|
|
+file_dialog_kind :: enum u32 {
|
|
|
|
+ // The file dialog is a save dialog.
|
|
|
|
+ SAVE = 0,
|
|
|
|
+ // The file dialog is an open dialog.
|
|
|
|
+ OPEN = 1,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A type for flags describing various file dialog options.
|
|
|
|
+// File dialog flags.
|
|
|
|
+file_dialog_flag :: enum u32 {
|
|
|
|
+ // This dialog allows selecting files.
|
|
|
|
+ FILES = 1,
|
|
|
|
+ // This dialog allows selecting directories.
|
|
|
|
+ DIRECTORIES,
|
|
|
|
+ // This dialog allows selecting multiple items.
|
|
|
|
+ MULTIPLE,
|
|
|
|
+ // This dialog allows creating directories.
|
|
|
|
+ CREATE_DIRECTORIES,
|
|
|
|
+}
|
|
|
|
+file_dialog_flags :: bit_set[file_dialog_flag; u32]
|
|
|
|
+
|
|
|
|
+// A structure describing a file dialog.
|
|
|
|
+file_dialog_desc :: struct {
|
|
|
|
+ // The kind of file dialog, see `oc_file_dialog_kind`.
|
|
|
|
+ kind: file_dialog_kind,
|
|
|
|
+ // A combination of file dialog flags used to enable file dialog options.
|
|
|
|
+ flags: file_dialog_flags,
|
|
|
|
+ // The title of the dialog, displayed in the dialog title bar.
|
|
|
|
+ title: str8,
|
|
|
|
+ // Optional. The label of the OK button, e.g. "Save" or "Open".
|
|
|
|
+ okLabel: str8,
|
|
|
|
+ // Optional. A file handle to the root directory for the dialog. If set to zero, the root directory is the application's default data directory.
|
|
|
|
+ startAt: file,
|
|
|
|
+ // Optional. The path of the starting directory of the dialog, relative to its root directory. If set to nil, the dialog starts at its root directory.
|
|
|
|
+ startPath: str8,
|
|
|
|
+ // A list of file extensions used to restrict which files can be selected in this dialog. An empty list allows all files to be selected. Extensions should be provided without a leading dot.
|
|
|
|
+ filters: str8_list,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// An enum identifying the button clicked by the user when a file dialog returns.
|
|
|
|
+file_dialog_button :: enum u32 {
|
|
|
|
+ // The user clicked the "Cancel" button, or closed the dialog box.
|
|
|
|
+ CANCEL = 0,
|
|
|
|
+ // The user clicked the "OK" button.
|
|
|
|
+ OK = 1,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A structure describing the result of a file dialog.
|
|
|
|
+file_dialog_result :: struct {
|
|
|
|
+ // The button clicked by the user.
|
|
|
|
+ button: file_dialog_button,
|
|
|
|
+ // The path that was selected when the user clicked the OK button. If the dialog box had the `OC_FILE_DIALOG_MULTIPLE` flag set, this is the first file of the list of selected paths.
|
|
|
|
+ path: str8,
|
|
|
|
+ // If the dialog box had the `OC_FILE_DIALOG_MULTIPLE` flag set and the user clicked the OK button, this list contains the selected paths.
|
|
|
|
+ selection: str8_list,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ // Set the title of the application's window.
|
|
|
|
+ window_set_title :: proc(title: str8) ---
|
|
|
|
+ // Set the size of the application's window.
|
|
|
|
+ window_set_size :: proc(size: vec2) ---
|
|
|
|
+ // Request the system to quit the application.
|
|
|
|
+ request_quit :: proc() ---
|
|
|
|
+ // Convert a scancode to a keycode, according to current keyboard layout.
|
|
|
|
+ scancode_to_keycode :: proc(scanCode: scan_code) -> key_code ---
|
|
|
|
+ // Put a string in the clipboard.
|
|
|
|
+ clipboard_set_string :: proc(string: str8) ---
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// File input/output.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// API for opening, reading and writing files.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+// An opaque handle identifying an opened file.
|
|
|
|
+file :: distinct u64
|
|
|
|
+
|
|
|
|
+// The type of file open flags describing file open options.
|
|
|
|
+// Flags for the `oc_file_open()` function.
|
|
|
|
+file_open_flag :: enum u16 {
|
|
|
|
+ // Open the file in 'append' mode. All writes append data at the end of the file.
|
|
|
|
+ APPEND = 1,
|
|
|
|
+ // Truncate the file to 0 bytes when opening.
|
|
|
|
+ TRUNCATE,
|
|
|
|
+ // Create the file if it does not exist.
|
|
|
|
+ CREATE,
|
|
|
|
+ // If the file is a symlink, open the symlink itself instead of following it.
|
|
|
|
+ SYMLINK,
|
|
|
|
+ // If the file is a symlink, the call to open will fail.
|
|
|
|
+ NO_FOLLOW,
|
|
|
|
+ // Reserved.
|
|
|
|
+ RESTRICT,
|
|
|
|
+}
|
|
|
|
+file_open_flags :: bit_set[file_open_flag; u16]
|
|
|
|
+
|
|
|
|
+// This enum describes the access permissions of a file handle.
|
|
|
|
+file_access_flag :: enum u16 {
|
|
|
|
+ // The file handle can be used for reading from the file.
|
|
|
|
+ READ = 1,
|
|
|
|
+ // The file handle can be used for writing to the file.
|
|
|
|
+ WRITE,
|
|
|
|
+}
|
|
|
|
+file_access :: bit_set[file_access_flag; u16]
|
|
|
|
+
|
|
|
|
+// This enum is used in `oc_file_seek()` to specify the starting point of the seek operation.
|
|
|
|
+file_whence :: enum u32 {
|
|
|
|
+ // Set the file position relative to the beginning of the file.
|
|
|
|
+ SET = 0,
|
|
|
|
+ // Set the file position relative to the end of the file.
|
|
|
|
+ END = 1,
|
|
|
|
+ // Set the file position relative to the current position.
|
|
|
|
+ CURRENT = 2,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A type used to identify I/O requests.
|
|
|
|
+io_req_id :: u64
|
|
|
|
+
|
|
|
|
+// A type used to identify I/O operations.
|
|
|
|
+// This enum declares all I/O operations.
|
|
|
|
+io_op :: enum u32 {
|
|
|
|
+ // ['Open a file at a path relative to a given root directory.', '', " - `handle` is the handle to the root directory. If it is nil, the application's default directory is used.", ' - `size` is the size of the path, in bytes.', ' - `buffer` points to an array containing the path of the file to open, relative to the directory identified by `handle`.', ' - `open` contains the permissions and flags for the open operation.']
|
|
|
|
+ OPEN_AT = 0,
|
|
|
|
+ // ['Close a file handle.', '', ' - `handle` is the handle to close.']
|
|
|
|
+ CLOSE = 1,
|
|
|
|
+ // ['Get status information for a file handle.', '', ' - `handle` is the handle to stat.', ' - `size` is the size of the result buffer. It should be at least `sizeof(oc_file_status)`.', ' - `buffer` is the result buffer.']
|
|
|
|
+ FSTAT = 2,
|
|
|
|
+ // ['Move the file position in a file.', '', ' - `handle` is the handle of the file.', ' - `offset` specifies the offset of the new position, relative to the base position specified by `whence`.', ' - `whence` determines the base position for the seek operation.']
|
|
|
|
+ SEEK = 3,
|
|
|
|
+ // ['Read data from a file.', '', ' - `handle` is the handle of the file.', ' - `size` is the number of bytes to read.', ' - `buffer` is the result buffer. It should be big enough to hold `size` bytes.']
|
|
|
|
+ READ = 4,
|
|
|
|
+ // ['Write data to a file.', '', ' - `handle` is the handle of the file.', ' - `size` is the number of bytes to write.', ' - `buffer` contains the data to write to the file.']
|
|
|
|
+ WRITE = 5,
|
|
|
|
+ // ['Get the error attached to a file handle.', '', ' - `handle` is the handle of the file.']
|
|
|
|
+ OC_OC_IO_ERROR = 6,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A structure describing an I/O request.
|
|
|
|
+io_req :: struct {
|
|
|
|
+ // An identifier for the request. You can set this to any value you want. It is passed back in the `oc_io_cmp` completion and can be used to match requests and completions.
|
|
|
|
+ id: io_req_id,
|
|
|
|
+ // The requested operation.
|
|
|
|
+ op: io_op,
|
|
|
|
+ // A file handle used by some operations.
|
|
|
|
+ handle: file,
|
|
|
|
+ // An offset used by some operations.
|
|
|
|
+ offset: i64,
|
|
|
|
+ // A size indicating the capacity of the buffer pointed to by `buffer`, in bytes.
|
|
|
|
+ size: u64,
|
|
|
|
+ using _: struct #raw_union {
|
|
|
|
+ buffer: [^]char,
|
|
|
|
+ unused: u64,
|
|
|
|
+ },
|
|
|
|
+ using _: struct #raw_union {
|
|
|
|
+ open: struct {
|
|
|
|
+ // The access permissions requested on the file to open.
|
|
|
|
+ rights: file_access,
|
|
|
|
+ // The options to use when opening the file.
|
|
|
|
+ flags: file_open_flags,
|
|
|
|
+ },
|
|
|
|
+ whence: file_whence,
|
|
|
|
+ },
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A type identifying an I/O error.
|
|
|
|
+// This enum declares all I/O error values.
|
|
|
|
+io_error :: enum u32 {
|
|
|
|
+ // No error.
|
|
|
|
+ OK = 0,
|
|
|
|
+ // An unexpected error happened.
|
|
|
|
+ UNKNOWN = 1,
|
|
|
|
+ // The request had an invalid operation.
|
|
|
|
+ OP = 2,
|
|
|
|
+ // The request had an invalid handle.
|
|
|
|
+ HANDLE = 3,
|
|
|
|
+ // The operation was not carried out because the file handle has previous errors.
|
|
|
|
+ PREV = 4,
|
|
|
|
+ // The request contained wrong arguments.
|
|
|
|
+ ARG = 5,
|
|
|
|
+ // The operation requires permissions that the file handle doesn't have.
|
|
|
|
+ PERM = 6,
|
|
|
|
+ // The operation couldn't complete due to a lack of space in the result buffer.
|
|
|
|
+ SPACE = 7,
|
|
|
|
+ // One of the directory in the path does not exist or couldn't be traversed.
|
|
|
|
+ NO_ENTRY = 8,
|
|
|
|
+ // The file already exists.
|
|
|
|
+ EXISTS = 9,
|
|
|
|
+ // The file is not a directory.
|
|
|
|
+ NOT_DIR = 10,
|
|
|
|
+ // The file is a directory.
|
|
|
|
+ DIR = 11,
|
|
|
|
+ // There are too many opened files.
|
|
|
|
+ MAX_FILES = 12,
|
|
|
|
+ // The path contains too many symbolic links (this may be indicative of a symlink loop).
|
|
|
|
+ MAX_LINKS = 13,
|
|
|
|
+ // The path is too long.
|
|
|
|
+ PATH_LENGTH = 14,
|
|
|
|
+ // The file is too large.
|
|
|
|
+ FILE_SIZE = 15,
|
|
|
|
+ // The file is too large to be opened.
|
|
|
|
+ OVERFLOW = 16,
|
|
|
|
+ // The file is locked or the device on which it is stored is not ready.
|
|
|
|
+ NOT_READY = 17,
|
|
|
|
+ // The system is out of memory.
|
|
|
|
+ MEM = 18,
|
|
|
|
+ // The operation was interrupted by a signal.
|
|
|
|
+ INTERRUPT = 19,
|
|
|
|
+ // A physical error happened.
|
|
|
|
+ PHYSICAL = 20,
|
|
|
|
+ // The device on which the file is stored was not found.
|
|
|
|
+ NO_DEVICE = 21,
|
|
|
|
+ // One element along the path is outside the root directory subtree.
|
|
|
|
+ WALKOUT = 22,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A structure describing the completion of an I/O operation.
|
|
|
|
+io_cmp :: struct {
|
|
|
|
+ // The request ID as passed in the `oc_io_req` request that generated this completion.
|
|
|
|
+ id: io_req_id,
|
|
|
|
+ // The error value for the operation.
|
|
|
|
+ error: io_error,
|
|
|
|
+ using _: struct #raw_union {
|
|
|
|
+ result: i64,
|
|
|
|
+ size: u64,
|
|
|
|
+ offset: i64,
|
|
|
|
+ handle: file,
|
|
|
|
+ },
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// An enum identifying the type of a file.
|
|
|
|
+file_type :: enum u32 {
|
|
|
|
+ // The file is of unknown type.
|
|
|
|
+ UNKNOWN = 0,
|
|
|
|
+ // The file is a regular file.
|
|
|
|
+ REGULAR = 1,
|
|
|
|
+ // The file is a directory.
|
|
|
|
+ DIRECTORY = 2,
|
|
|
|
+ // The file is a symbolic link.
|
|
|
|
+ SYMLINK = 3,
|
|
|
|
+ // The file is a block device.
|
|
|
|
+ BLOCK = 4,
|
|
|
|
+ // The file is a character device.
|
|
|
|
+ CHARACTER = 5,
|
|
|
|
+ // The file is a FIFO pipe.
|
|
|
|
+ FIFO = 6,
|
|
|
|
+ // The file is a socket.
|
|
|
|
+ SOCKET = 7,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A type describing file permissions.
|
|
|
|
+file_perm_flag :: enum u16 {
|
|
|
|
+ OTHER_EXEC = 1,
|
|
|
|
+ OTHER_WRITE,
|
|
|
|
+ OTHER_READ,
|
|
|
|
+ GROUP_EXEC,
|
|
|
|
+ GROUP_WRITE,
|
|
|
|
+ GROUP_READ,
|
|
|
|
+ OWNER_EXEC,
|
|
|
|
+ OWNER_WRITE,
|
|
|
|
+ OWNER_READ,
|
|
|
|
+ STICKY_BIT,
|
|
|
|
+ SET_GID,
|
|
|
|
+ SET_UID,
|
|
|
|
+}
|
|
|
|
+file_perm :: bit_set[file_perm_flag; u16]
|
|
|
|
+
|
|
|
|
+datestamp :: struct {
|
|
|
|
+ seconds: i64,
|
|
|
|
+ fraction: u64,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+file_status :: struct {
|
|
|
|
+ uid: u64,
|
|
|
|
+ type: file_type,
|
|
|
|
+ perm: file_perm,
|
|
|
|
+ size: u64,
|
|
|
|
+ creationDate: datestamp,
|
|
|
|
+ accessDate: datestamp,
|
|
|
|
+ modificationDate: datestamp,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ // Send a single I/O request and wait for its completion.
|
|
|
|
+ io_wait_single_req :: proc(req: ^io_req) -> io_cmp ---
|
|
|
|
+ // Returns a `nil` file handle
|
|
|
|
+ file_nil :: proc() -> file ---
|
|
|
|
+ // Test if a file handle is `nil`.
|
|
|
|
+ file_is_nil :: proc(handle: file) -> bool ---
|
|
|
|
+ // Open a file in the applications' default directory subtree.
|
|
|
|
+ file_open :: proc(path: str8, rights: file_access, flags: file_open_flags) -> file ---
|
|
|
|
+ // Open a file in a given directory's subtree.
|
|
|
|
+ file_open_at :: proc(dir: file, path: str8, rights: file_access, flags: file_open_flags) -> file ---
|
|
|
|
+ // Close a file.
|
|
|
|
+ file_close :: proc(file: file) ---
|
|
|
|
+ // Get the current position in a file.
|
|
|
|
+ file_pos :: proc(file: file) -> i64 ---
|
|
|
|
+ // Set the current position in a file.
|
|
|
|
+ file_seek :: proc(file: file, offset: i64, whence: file_whence) -> i64 ---
|
|
|
|
+ // Write data to a file.
|
|
|
|
+ file_write :: proc(file: file, size: u64, buffer: [^]char) -> u64 ---
|
|
|
|
+ // Read from a file.
|
|
|
|
+ file_read :: proc(file: file, size: u64, buffer: [^]char) -> u64 ---
|
|
|
|
+ // Get the last error on a file handle.
|
|
|
|
+ file_last_error :: proc(handle: file) -> io_error ---
|
|
|
|
+ file_get_status :: proc(file: file) -> file_status ---
|
|
|
|
+ file_size :: proc(file: file) -> u64 ---
|
|
|
|
+ file_open_with_request :: proc(path: str8, rights: file_access, flags: file_open_flags) -> file ---
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// API for obtaining file capabilities through open/save dialogs.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+// An element of a list of file handles acquired through a file dialog.
|
|
|
|
+file_open_with_dialog_elt :: struct {
|
|
|
|
+ listElt: list_elt,
|
|
|
|
+ file: file,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// A structure describing the result of a call to `oc_file_open_with_dialog()`.
|
|
|
|
+file_open_with_dialog_result :: struct {
|
|
|
|
+ // The button of the file dialog clicked by the user.
|
|
|
|
+ button: file_dialog_button,
|
|
|
|
+ // The file that was opened through the dialog. If the dialog had the `OC_FILE_DIALOG_MULTIPLE` flag set, this is equal to the first handle in the `selection` list.
|
|
|
|
+ file: file,
|
|
|
|
+ // If the dialog had the `OC_FILE_DIALOG_MULTIPLE` flag set, this list of `oc_file_open_with_dialog_elt` contains the handles of the opened files.
|
|
|
|
+ selection: list,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ // Open files through a file dialog. This allows the user to select files outside the root directories currently accessible to the applications, giving them a way to provide new file capabilities to the application.
|
|
|
|
+ file_open_with_dialog :: proc(arena: ^arena, rights: file_access, flags: file_open_flags, desc: ^file_dialog_desc) -> file_open_with_dialog_result ---
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// API for handling filesystem paths.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ // Get a string slice of the directory part of a path.
|
|
|
|
+ path_slice_directory :: proc(path: str8) -> str8 ---
|
|
|
|
+ // Get a string slice of the file name part of a path.
|
|
|
|
+ path_slice_filename :: proc(path: str8) -> str8 ---
|
|
|
|
+ // Split a path into path elements.
|
|
|
|
+ path_split :: proc(arena: ^arena, path: str8) -> str8_list ---
|
|
|
|
+ // Join path elements to form a path.
|
|
|
|
+ path_join :: proc(arena: ^arena, elements: str8_list) -> str8 ---
|
|
|
|
+ // Append a path to another path.
|
|
|
|
+ path_append :: proc(arena: ^arena, parent: str8, relPath: str8) -> str8 ---
|
|
|
|
+ // Test wether a path is an absolute path.
|
|
|
|
+ path_is_absolute :: proc(path: str8) -> bool ---
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// 2D/3D rendering APIs.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// A 2D Vector Graphics API.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+surface :: distinct u64
|
|
|
|
+
|
|
|
|
+canvas_renderer :: distinct u64
|
|
|
|
+
|
|
|
|
+canvas_context :: distinct u64
|
|
|
|
+
|
|
|
|
+font :: distinct u64
|
|
|
|
+
|
|
|
|
+image :: distinct u64
|
|
|
|
+
|
|
|
|
+gradient_blend_space :: enum u32 {
|
|
|
|
+ LINEAR = 0,
|
|
|
|
+ SRGB = 1,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+color_space :: enum u32 {
|
|
|
|
+ RGB = 0,
|
|
|
|
+ SRGB = 1,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+color :: struct { using c: [4]f32, colorSpace: color_space }
|
|
|
|
+
|
|
|
|
+joint_type :: enum u32 {
|
|
|
|
+ MITER = 0,
|
|
|
|
+ BEVEL = 1,
|
|
|
|
+ NONE = 2,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+cap_type :: enum u32 {
|
|
|
|
+ NONE = 0,
|
|
|
|
+ SQUARE = 1,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+font_metrics :: struct {
|
|
|
|
+ ascent: f32,
|
|
|
|
+ descent: f32,
|
|
|
|
+ lineGap: f32,
|
|
|
|
+ xHeight: f32,
|
|
|
|
+ capHeight: f32,
|
|
|
|
+ width: f32,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+glyph_metrics :: struct {
|
|
|
|
+ ink: rect,
|
|
|
|
+ advance: vec2,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+text_metrics :: struct {
|
|
|
|
+ ink: rect,
|
|
|
|
+ logical: rect,
|
|
|
|
+ advance: vec2,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+rect_atlas :: struct {}
|
|
|
|
+
|
|
|
|
+image_region :: struct {
|
|
|
|
+ image: image,
|
|
|
|
+ rect: rect,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ surface_nil :: proc() -> surface ---
|
|
|
|
+ surface_is_nil :: proc(surface: surface) -> bool ---
|
|
|
|
+ surface_destroy :: proc(surface: surface) ---
|
|
|
|
+ surface_get_size :: proc(surface: surface) -> vec2 ---
|
|
|
|
+ surface_contents_scaling :: proc(surface: surface) -> vec2 ---
|
|
|
|
+ surface_bring_to_front :: proc(surface: surface) ---
|
|
|
|
+ surface_send_to_back :: proc(surface: surface) ---
|
|
|
|
+ surface_get_hidden :: proc(surface: surface) -> bool ---
|
|
|
|
+ surface_set_hidden :: proc(surface: surface, hidden: bool) ---
|
|
|
|
+ color_rgba :: proc(r: f32, g: f32, b: f32, a: f32) -> color ---
|
|
|
|
+ color_srgba :: proc(r: f32, g: f32, b: f32, a: f32) -> color ---
|
|
|
|
+ color_convert :: proc(_color: color, colorSpace: color_space) -> color ---
|
|
|
|
+ canvas_renderer_nil :: proc() -> canvas_renderer ---
|
|
|
|
+ canvas_renderer_is_nil :: proc(renderer: canvas_renderer) -> bool ---
|
|
|
|
+ canvas_renderer_create :: proc() -> canvas_renderer ---
|
|
|
|
+ canvas_renderer_destroy :: proc(renderer: canvas_renderer) ---
|
|
|
|
+ canvas_render :: proc(renderer: canvas_renderer, _context: canvas_context, surface: surface) ---
|
|
|
|
+ canvas_present :: proc(renderer: canvas_renderer, surface: surface) ---
|
|
|
|
+ canvas_surface_create :: proc(renderer: canvas_renderer) -> surface ---
|
|
|
|
+ canvas_surface_swap_interval :: proc(surface: surface, swap: i32) ---
|
|
|
|
+ canvas_context_nil :: proc() -> canvas_context ---
|
|
|
|
+ canvas_context_is_nil :: proc(_context: canvas_context) -> bool ---
|
|
|
|
+ canvas_context_create :: proc() -> canvas_context ---
|
|
|
|
+ canvas_context_destroy :: proc(_context: canvas_context) ---
|
|
|
|
+ canvas_context_select :: proc(_context: canvas_context) -> canvas_context ---
|
|
|
|
+ canvas_context_set_msaa_sample_count :: proc(_context: canvas_context, sampleCount: u32) ---
|
|
|
|
+ font_nil :: proc() -> font ---
|
|
|
|
+ font_is_nil :: proc(font: font) -> bool ---
|
|
|
|
+ font_create_from_memory :: proc(mem: str8, rangeCount: u32, ranges: ^unicode_range) -> font ---
|
|
|
|
+ font_create_from_file :: proc(file: file, rangeCount: u32, ranges: ^unicode_range) -> font ---
|
|
|
|
+ font_create_from_path :: proc(path: str8, rangeCount: u32, ranges: ^unicode_range) -> font ---
|
|
|
|
+ font_destroy :: proc(font: font) ---
|
|
|
|
+ font_get_glyph_indices :: proc(font: font, codePoints: str32, backing: str32) -> str32 ---
|
|
|
|
+ font_push_glyph_indices :: proc(arena: ^arena, font: font, codePoints: str32) -> str32 ---
|
|
|
|
+ font_get_glyph_index :: proc(font: font, codePoint: utf32) -> u32 ---
|
|
|
|
+ font_get_metrics :: proc(font: font, emSize: f32) -> font_metrics ---
|
|
|
|
+ font_get_metrics_unscaled :: proc(font: font) -> font_metrics ---
|
|
|
|
+ font_get_scale_for_em_pixels :: proc(font: font, emSize: f32) -> f32 ---
|
|
|
|
+ font_text_metrics_utf32 :: proc(font: font, fontSize: f32, codepoints: str32) -> text_metrics ---
|
|
|
|
+ font_text_metrics :: proc(font: font, fontSize: f32, text: str8) -> text_metrics ---
|
|
|
|
+ image_nil :: proc() -> image ---
|
|
|
|
+ image_is_nil :: proc(a: image) -> bool ---
|
|
|
|
+ image_create :: proc(renderer: canvas_renderer, width: u32, height: u32) -> image ---
|
|
|
|
+ image_create_from_rgba8 :: proc(renderer: canvas_renderer, width: u32, height: u32, pixels: [^]u8) -> image ---
|
|
|
|
+ image_create_from_memory :: proc(renderer: canvas_renderer, mem: str8, flip: bool) -> image ---
|
|
|
|
+ image_create_from_file :: proc(renderer: canvas_renderer, file: file, flip: bool) -> image ---
|
|
|
|
+ image_create_from_path :: proc(renderer: canvas_renderer, path: str8, flip: bool) -> image ---
|
|
|
|
+ image_destroy :: proc(image: image) ---
|
|
|
|
+ image_upload_region_rgba8 :: proc(image: image, region: rect, pixels: [^]u8) ---
|
|
|
|
+ image_size :: proc(image: image) -> vec2 ---
|
|
|
|
+ rect_atlas_create :: proc(arena: ^arena, width: i32, height: i32) -> ^rect_atlas ---
|
|
|
|
+ rect_atlas_alloc :: proc(atlas: ^rect_atlas, width: i32, height: i32) -> rect ---
|
|
|
|
+ rect_atlas_recycle :: proc(atlas: ^rect_atlas, rect: rect) ---
|
|
|
|
+ image_atlas_alloc_from_rgba8 :: proc(atlas: ^rect_atlas, backingImage: image, width: u32, height: u32, pixels: [^]u8) -> image_region ---
|
|
|
|
+ image_atlas_alloc_from_memory :: proc(atlas: ^rect_atlas, backingImage: image, mem: str8, flip: bool) -> image_region ---
|
|
|
|
+ image_atlas_alloc_from_file :: proc(atlas: ^rect_atlas, backingImage: image, file: file, flip: bool) -> image_region ---
|
|
|
|
+ image_atlas_alloc_from_path :: proc(atlas: ^rect_atlas, backingImage: image, path: str8, flip: bool) -> image_region ---
|
|
|
|
+ image_atlas_recycle :: proc(atlas: ^rect_atlas, imageRgn: image_region) ---
|
|
|
|
+ matrix_push :: proc(_matrix: mat2x3) ---
|
|
|
|
+ matrix_multiply_push :: proc(_matrix: mat2x3) ---
|
|
|
|
+ matrix_pop :: proc() ---
|
|
|
|
+ matrix_top :: proc() -> mat2x3 ---
|
|
|
|
+ clip_push :: proc(x: f32, y: f32, w: f32, h: f32) ---
|
|
|
|
+ clip_pop :: proc() ---
|
|
|
|
+ clip_top :: proc() -> rect ---
|
|
|
|
+ set_color :: proc(_color: color) ---
|
|
|
|
+ set_color_rgba :: proc(r: f32, g: f32, b: f32, a: f32) ---
|
|
|
|
+ set_color_srgba :: proc(r: f32, g: f32, b: f32, a: f32) ---
|
|
|
|
+ set_gradient :: proc(blendSpace: gradient_blend_space, bottomLeft: color, bottomRight: color, topRight: color, topLeft: color) ---
|
|
|
|
+ set_width :: proc(width: f32) ---
|
|
|
|
+ set_tolerance :: proc(tolerance: f32) ---
|
|
|
|
+ set_joint :: proc(joint: joint_type) ---
|
|
|
|
+ set_max_joint_excursion :: proc(maxJointExcursion: f32) ---
|
|
|
|
+ set_cap :: proc(cap: cap_type) ---
|
|
|
|
+ set_font :: proc(font: font) ---
|
|
|
|
+ set_font_size :: proc(size: f32) ---
|
|
|
|
+ set_text_flip :: proc(flip: bool) ---
|
|
|
|
+ set_image :: proc(image: image) ---
|
|
|
|
+ set_image_source_region :: proc(region: rect) ---
|
|
|
|
+ get_color :: proc() -> color ---
|
|
|
|
+ get_width :: proc() -> f32 ---
|
|
|
|
+ get_tolerance :: proc() -> f32 ---
|
|
|
|
+ get_joint :: proc() -> joint_type ---
|
|
|
|
+ get_max_joint_excursion :: proc() -> f32 ---
|
|
|
|
+ get_cap :: proc() -> cap_type ---
|
|
|
|
+ get_font :: proc() -> font ---
|
|
|
|
+ get_font_size :: proc() -> f32 ---
|
|
|
|
+ get_text_flip :: proc() -> bool ---
|
|
|
|
+ get_image :: proc() -> image ---
|
|
|
|
+ get_image_source_region :: proc() -> rect ---
|
|
|
|
+ get_position :: proc() -> vec2 ---
|
|
|
|
+ move_to :: proc(x: f32, y: f32) ---
|
|
|
|
+ line_to :: proc(x: f32, y: f32) ---
|
|
|
|
+ quadratic_to :: proc(x1: f32, y1: f32, x2: f32, y2: f32) ---
|
|
|
|
+ cubic_to :: proc(x1: f32, y1: f32, x2: f32, y2: f32, x3: f32, y3: f32) ---
|
|
|
|
+ close_path :: proc() ---
|
|
|
|
+ glyph_outlines :: proc(glyphIndices: str32) -> rect ---
|
|
|
|
+ codepoints_outlines :: proc(string: str32) ---
|
|
|
|
+ text_outlines :: proc(string: str8) ---
|
|
|
|
+ clear :: proc() ---
|
|
|
|
+ fill :: proc() ---
|
|
|
|
+ stroke :: proc() ---
|
|
|
|
+ rectangle_fill :: proc(x: f32, y: f32, w: f32, h: f32) ---
|
|
|
|
+ rectangle_stroke :: proc(x: f32, y: f32, w: f32, h: f32) ---
|
|
|
|
+ rounded_rectangle_fill :: proc(x: f32, y: f32, w: f32, h: f32, r: f32) ---
|
|
|
|
+ rounded_rectangle_stroke :: proc(x: f32, y: f32, w: f32, h: f32, r: f32) ---
|
|
|
|
+ ellipse_fill :: proc(x: f32, y: f32, rx: f32, ry: f32) ---
|
|
|
|
+ ellipse_stroke :: proc(x: f32, y: f32, rx: f32, ry: f32) ---
|
|
|
|
+ circle_fill :: proc(x: f32, y: f32, r: f32) ---
|
|
|
|
+ circle_stroke :: proc(x: f32, y: f32, r: f32) ---
|
|
|
|
+ arc :: proc(x: f32, y: f32, r: f32, arcAngle: f32, startAngle: f32) ---
|
|
|
|
+ text_fill :: proc(x: f32, y: f32, text: str8) ---
|
|
|
|
+ image_draw :: proc(image: image, rect: rect) ---
|
|
|
|
+ image_draw_region :: proc(image: image, srcRegion: rect, dstRegion: rect) ---
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// A surface for rendering using the GLES API.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ gles_surface_create :: proc() -> surface ---
|
|
|
|
+ gles_surface_make_current :: proc(surface: surface) ---
|
|
|
|
+ gles_surface_swap_interval :: proc(surface: surface, interval: i32) ---
|
|
|
|
+ gles_surface_swap_buffers :: proc(surface: surface) ---
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+// Graphical User Interface API.
|
|
|
|
+////////////////////////////////////////////////////////////////////////////////
|
|
|
|
+
|
|
|
|
+key_state :: struct {
|
|
|
|
+ lastUpdate: u64,
|
|
|
|
+ transitionCount: u32,
|
|
|
|
+ repeatCount: u32,
|
|
|
|
+ down: bool,
|
|
|
|
+ sysClicked: bool,
|
|
|
|
+ sysDoubleClicked: bool,
|
|
|
|
+ sysTripleClicked: bool,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+keyboard_state :: struct {
|
|
|
|
+ keys: [349]key_state,
|
|
|
|
+ mods: keymod_flags,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+mouse_state :: struct {
|
|
|
|
+ lastUpdate: u64,
|
|
|
|
+ posValid: bool,
|
|
|
|
+ pos: vec2,
|
|
|
|
+ delta: vec2,
|
|
|
|
+ wheel: vec2,
|
|
|
|
+ using _: struct #raw_union {
|
|
|
|
+ buttons: [5]key_state,
|
|
|
|
+ using _: struct {
|
|
|
|
+ left: key_state,
|
|
|
|
+ right: key_state,
|
|
|
|
+ middle: key_state,
|
|
|
|
+ ext1: key_state,
|
|
|
|
+ ext2: key_state,
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+BACKING_SIZE :: 64
|
|
|
|
+
|
|
|
|
+text_state :: struct {
|
|
|
|
+ lastUpdate: u64,
|
|
|
|
+ backing: [64]utf32,
|
|
|
|
+ codePoints: str32,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+clipboard_state :: struct {
|
|
|
|
+ lastUpdate: u64,
|
|
|
|
+ pastedText: str8,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+input_state :: struct {
|
|
|
|
+ frameCounter: u64,
|
|
|
|
+ keyboard: keyboard_state,
|
|
|
|
+ mouse: mouse_state,
|
|
|
|
+ text: text_state,
|
|
|
|
+ clipboard: clipboard_state,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_key :: struct {
|
|
|
|
+ hash: u64,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_axis :: enum u32 {
|
|
|
|
+ X = 0,
|
|
|
|
+ Y = 1,
|
|
|
|
+ COUNT = 2,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_align :: enum u32 {
|
|
|
|
+ START = 0,
|
|
|
|
+ END = 1,
|
|
|
|
+ CENTER = 2,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_layout_align :: [2]ui_align
|
|
|
|
+
|
|
|
|
+ui_layout :: struct {
|
|
|
|
+ axis: ui_axis,
|
|
|
|
+ spacing: f32,
|
|
|
|
+ margin: [2]f32,
|
|
|
|
+ align: ui_layout_align,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_size_kind :: enum u32 {
|
|
|
|
+ TEXT = 0,
|
|
|
|
+ PIXELS = 1,
|
|
|
|
+ CHILDREN = 2,
|
|
|
|
+ PARENT = 3,
|
|
|
|
+ PARENT_MINUS_PIXELS = 4,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_size :: struct {
|
|
|
|
+ kind: ui_size_kind,
|
|
|
|
+ value: f32,
|
|
|
|
+ relax: f32,
|
|
|
|
+ minSize: f32,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_box_size :: [2]ui_size
|
|
|
|
+
|
|
|
|
+ui_box_floating :: [2]bool
|
|
|
|
+
|
|
|
|
+ui_style :: struct {
|
|
|
|
+ size: ui_box_size,
|
|
|
|
+ layout: ui_layout,
|
|
|
|
+ floating: ui_box_floating,
|
|
|
|
+ floatTarget: vec2,
|
|
|
|
+ _color: color,
|
|
|
|
+ bgColor: color,
|
|
|
|
+ borderColor: color,
|
|
|
|
+ font: font,
|
|
|
|
+ fontSize: f32,
|
|
|
|
+ borderSize: f32,
|
|
|
|
+ roundness: f32,
|
|
|
|
+ animationTime: f32,
|
|
|
|
+ animationMask: ui_style_mask,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_palette :: struct {
|
|
|
|
+ red0: color,
|
|
|
|
+ red1: color,
|
|
|
|
+ red2: color,
|
|
|
|
+ red3: color,
|
|
|
|
+ red4: color,
|
|
|
|
+ red5: color,
|
|
|
|
+ red6: color,
|
|
|
|
+ red7: color,
|
|
|
|
+ red8: color,
|
|
|
|
+ red9: color,
|
|
|
|
+ orange0: color,
|
|
|
|
+ orange1: color,
|
|
|
|
+ orange2: color,
|
|
|
|
+ orange3: color,
|
|
|
|
+ orange4: color,
|
|
|
|
+ orange5: color,
|
|
|
|
+ orange6: color,
|
|
|
|
+ orange7: color,
|
|
|
|
+ orange8: color,
|
|
|
|
+ orange9: color,
|
|
|
|
+ amber0: color,
|
|
|
|
+ amber1: color,
|
|
|
|
+ amber2: color,
|
|
|
|
+ amber3: color,
|
|
|
|
+ amber4: color,
|
|
|
|
+ amber5: color,
|
|
|
|
+ amber6: color,
|
|
|
|
+ amber7: color,
|
|
|
|
+ amber8: color,
|
|
|
|
+ amber9: color,
|
|
|
|
+ yellow0: color,
|
|
|
|
+ yellow1: color,
|
|
|
|
+ yellow2: color,
|
|
|
|
+ yellow3: color,
|
|
|
|
+ yellow4: color,
|
|
|
|
+ yellow5: color,
|
|
|
|
+ yellow6: color,
|
|
|
|
+ yellow7: color,
|
|
|
|
+ yellow8: color,
|
|
|
|
+ yellow9: color,
|
|
|
|
+ lime0: color,
|
|
|
|
+ lime1: color,
|
|
|
|
+ lime2: color,
|
|
|
|
+ lime3: color,
|
|
|
|
+ lime4: color,
|
|
|
|
+ lime5: color,
|
|
|
|
+ lime6: color,
|
|
|
|
+ lime7: color,
|
|
|
|
+ lime8: color,
|
|
|
|
+ lime9: color,
|
|
|
|
+ lightGreen0: color,
|
|
|
|
+ lightGreen1: color,
|
|
|
|
+ lightGreen2: color,
|
|
|
|
+ lightGreen3: color,
|
|
|
|
+ lightGreen4: color,
|
|
|
|
+ lightGreen5: color,
|
|
|
|
+ lightGreen6: color,
|
|
|
|
+ lightGreen7: color,
|
|
|
|
+ lightGreen8: color,
|
|
|
|
+ lightGreen9: color,
|
|
|
|
+ green0: color,
|
|
|
|
+ green1: color,
|
|
|
|
+ green2: color,
|
|
|
|
+ green3: color,
|
|
|
|
+ green4: color,
|
|
|
|
+ green5: color,
|
|
|
|
+ green6: color,
|
|
|
|
+ green7: color,
|
|
|
|
+ green8: color,
|
|
|
|
+ green9: color,
|
|
|
|
+ teal0: color,
|
|
|
|
+ teal1: color,
|
|
|
|
+ teal2: color,
|
|
|
|
+ teal3: color,
|
|
|
|
+ teal4: color,
|
|
|
|
+ teal5: color,
|
|
|
|
+ teal6: color,
|
|
|
|
+ teal7: color,
|
|
|
|
+ teal8: color,
|
|
|
|
+ teal9: color,
|
|
|
|
+ cyan0: color,
|
|
|
|
+ cyan1: color,
|
|
|
|
+ cyan2: color,
|
|
|
|
+ cyan3: color,
|
|
|
|
+ cyan4: color,
|
|
|
|
+ cyan5: color,
|
|
|
|
+ cyan6: color,
|
|
|
|
+ cyan7: color,
|
|
|
|
+ cyan8: color,
|
|
|
|
+ cyan9: color,
|
|
|
|
+ lightBlue0: color,
|
|
|
|
+ lightBlue1: color,
|
|
|
|
+ lightBlue2: color,
|
|
|
|
+ lightBlue3: color,
|
|
|
|
+ lightBlue4: color,
|
|
|
|
+ lightBlue5: color,
|
|
|
|
+ lightBlue6: color,
|
|
|
|
+ lightBlue7: color,
|
|
|
|
+ lightBlue8: color,
|
|
|
|
+ lightBlue9: color,
|
|
|
|
+ blue0: color,
|
|
|
|
+ blue1: color,
|
|
|
|
+ blue2: color,
|
|
|
|
+ blue3: color,
|
|
|
|
+ blue4: color,
|
|
|
|
+ blue5: color,
|
|
|
|
+ blue6: color,
|
|
|
|
+ blue7: color,
|
|
|
|
+ blue8: color,
|
|
|
|
+ blue9: color,
|
|
|
|
+ indigo0: color,
|
|
|
|
+ indigo1: color,
|
|
|
|
+ indigo2: color,
|
|
|
|
+ indigo3: color,
|
|
|
|
+ indigo4: color,
|
|
|
|
+ indigo5: color,
|
|
|
|
+ indigo6: color,
|
|
|
|
+ indigo7: color,
|
|
|
|
+ indigo8: color,
|
|
|
|
+ indigo9: color,
|
|
|
|
+ violet0: color,
|
|
|
|
+ violet1: color,
|
|
|
|
+ violet2: color,
|
|
|
|
+ violet3: color,
|
|
|
|
+ violet4: color,
|
|
|
|
+ violet5: color,
|
|
|
|
+ violet6: color,
|
|
|
|
+ violet7: color,
|
|
|
|
+ violet8: color,
|
|
|
|
+ violet9: color,
|
|
|
|
+ purple0: color,
|
|
|
|
+ purple1: color,
|
|
|
|
+ purple2: color,
|
|
|
|
+ purple3: color,
|
|
|
|
+ purple4: color,
|
|
|
|
+ purple5: color,
|
|
|
|
+ purple6: color,
|
|
|
|
+ purple7: color,
|
|
|
|
+ purple8: color,
|
|
|
|
+ purple9: color,
|
|
|
|
+ pink0: color,
|
|
|
|
+ pink1: color,
|
|
|
|
+ pink2: color,
|
|
|
|
+ pink3: color,
|
|
|
|
+ pink4: color,
|
|
|
|
+ pink5: color,
|
|
|
|
+ pink6: color,
|
|
|
|
+ pink7: color,
|
|
|
|
+ pink8: color,
|
|
|
|
+ pink9: color,
|
|
|
|
+ grey0: color,
|
|
|
|
+ grey1: color,
|
|
|
|
+ grey2: color,
|
|
|
|
+ grey3: color,
|
|
|
|
+ grey4: color,
|
|
|
|
+ grey5: color,
|
|
|
|
+ grey6: color,
|
|
|
|
+ grey7: color,
|
|
|
|
+ grey8: color,
|
|
|
|
+ grey9: color,
|
|
|
|
+ black: color,
|
|
|
|
+ white: color,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_theme :: struct {
|
|
|
|
+ white: color,
|
|
|
|
+ primary: color,
|
|
|
|
+ primaryHover: color,
|
|
|
|
+ primaryActive: color,
|
|
|
|
+ border: color,
|
|
|
|
+ fill0: color,
|
|
|
|
+ fill1: color,
|
|
|
|
+ fill2: color,
|
|
|
|
+ bg0: color,
|
|
|
|
+ bg1: color,
|
|
|
|
+ bg2: color,
|
|
|
|
+ bg3: color,
|
|
|
|
+ bg4: color,
|
|
|
|
+ text0: color,
|
|
|
|
+ text1: color,
|
|
|
|
+ text2: color,
|
|
|
|
+ text3: color,
|
|
|
|
+ sliderThumbBorder: color,
|
|
|
|
+ elevatedBorder: color,
|
|
|
|
+ roundnessSmall: f32,
|
|
|
|
+ roundnessMedium: f32,
|
|
|
|
+ roundnessLarge: f32,
|
|
|
|
+ palette: ^ui_palette,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_tag :: struct {
|
|
|
|
+ hash: u64,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_selector_kind :: enum u32 {
|
|
|
|
+ ANY = 0,
|
|
|
|
+ OWNER = 1,
|
|
|
|
+ TEXT = 2,
|
|
|
|
+ TAG = 3,
|
|
|
|
+ STATUS = 4,
|
|
|
|
+ KEY = 5,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_status_flag :: enum u8 {
|
|
|
|
+ HOVER = 1,
|
|
|
|
+ HOT,
|
|
|
|
+ ACTIVE,
|
|
|
|
+ DRAGGING,
|
|
|
|
+}
|
|
|
|
+ui_status :: bit_set[ui_status_flag; u8]
|
|
|
|
+
|
|
|
|
+ui_selector_op :: enum u32 {
|
|
|
|
+ DESCENDANT = 0,
|
|
|
|
+ AND = 1,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_selector :: struct {
|
|
|
|
+ listElt: list_elt,
|
|
|
|
+ kind: ui_selector_kind,
|
|
|
|
+ op: ui_selector_op,
|
|
|
|
+ using _: struct #raw_union {
|
|
|
|
+ text: str8,
|
|
|
|
+ key: ui_key,
|
|
|
|
+ tag: ui_tag,
|
|
|
|
+ status: ui_status,
|
|
|
|
+ },
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_pattern :: struct {
|
|
|
|
+ l: list,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_box :: struct {
|
|
|
|
+ listElt: list_elt,
|
|
|
|
+ children: list,
|
|
|
|
+ parent: ^ui_box,
|
|
|
|
+ overlayElt: list_elt,
|
|
|
|
+ bucketElt: list_elt,
|
|
|
|
+ key: ui_key,
|
|
|
|
+ frameCounter: u64,
|
|
|
|
+ flags: ui_flags,
|
|
|
|
+ string: str8,
|
|
|
|
+ tags: list,
|
|
|
|
+ drawProc: ui_box_draw_proc,
|
|
|
|
+ drawData: rawptr,
|
|
|
|
+ beforeRules: list,
|
|
|
|
+ afterRules: list,
|
|
|
|
+ targetStyle: ^ui_style,
|
|
|
|
+ style: ui_style,
|
|
|
|
+ z: u32,
|
|
|
|
+ floatPos: vec2,
|
|
|
|
+ childrenSum: [2]f32,
|
|
|
|
+ spacing: [2]f32,
|
|
|
|
+ minSize: [2]f32,
|
|
|
|
+ rect: rect,
|
|
|
|
+ sig: ^ui_sig,
|
|
|
|
+ fresh: bool,
|
|
|
|
+ closed: bool,
|
|
|
|
+ parentClosed: bool,
|
|
|
|
+ dragging: bool,
|
|
|
|
+ hot: bool,
|
|
|
|
+ active: bool,
|
|
|
|
+ scroll: vec2,
|
|
|
|
+ pressedMouse: vec2,
|
|
|
|
+ hotTransition: f32,
|
|
|
|
+ activeTransition: f32,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_style_rule :: struct {
|
|
|
|
+ boxElt: list_elt,
|
|
|
|
+ buildElt: list_elt,
|
|
|
|
+ tmpElt: list_elt,
|
|
|
|
+ owner: ^ui_box,
|
|
|
|
+ pattern: ui_pattern,
|
|
|
|
+ mask: ui_style_mask,
|
|
|
|
+ style: ^ui_style,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_sig :: struct {
|
|
|
|
+ box: ^ui_box,
|
|
|
|
+ mouse: vec2,
|
|
|
|
+ delta: vec2,
|
|
|
|
+ wheel: vec2,
|
|
|
|
+ pressed: bool,
|
|
|
|
+ released: bool,
|
|
|
|
+ clicked: bool,
|
|
|
|
+ doubleClicked: bool,
|
|
|
|
+ tripleClicked: bool,
|
|
|
|
+ rightPressed: bool,
|
|
|
|
+ dragging: bool,
|
|
|
|
+ hovering: bool,
|
|
|
|
+ pasted: bool,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_box_draw_proc :: proc "c" (arg0: ^ui_box, arg1: rawptr)
|
|
|
|
+
|
|
|
|
+ui_flag :: enum u32 {
|
|
|
|
+ CLICKABLE = 0,
|
|
|
|
+ SCROLL_WHEEL_X,
|
|
|
|
+ SCROLL_WHEEL_Y,
|
|
|
|
+ BLOCK_MOUSE,
|
|
|
|
+ HOT_ANIMATION,
|
|
|
|
+ ACTIVE_ANIMATION,
|
|
|
|
+ OVERFLOW_ALLOW_X,
|
|
|
|
+ OVERFLOW_ALLOW_Y,
|
|
|
|
+ CLIP,
|
|
|
|
+ DRAW_BACKGROUND,
|
|
|
|
+ DRAW_FOREGROUND,
|
|
|
|
+ DRAW_BORDER,
|
|
|
|
+ DRAW_TEXT,
|
|
|
|
+ DRAW_PROC,
|
|
|
|
+ OVERLAY,
|
|
|
|
+}
|
|
|
|
+ui_flags :: bit_set[ui_flag; u32]
|
|
|
|
+
|
|
|
|
+MAX_INPUT_CHAR_PER_FRAME :: 64
|
|
|
|
+
|
|
|
|
+ui_input_text :: struct {
|
|
|
|
+ count: u8 `fmt:"-"`,
|
|
|
|
+ codePoints: [64]utf32 `fmt:"s,count"`,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_stack_elt :: struct {
|
|
|
|
+ parent: ^ui_stack_elt,
|
|
|
|
+ using _: struct #raw_union {
|
|
|
|
+ box: ^ui_box,
|
|
|
|
+ size: ui_size,
|
|
|
|
+ clip: rect,
|
|
|
|
+ },
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_tag_elt :: struct {
|
|
|
|
+ listElt: list_elt,
|
|
|
|
+ tag: ui_tag,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+BOX_MAP_BUCKET_COUNT :: 1024
|
|
|
|
+
|
|
|
|
+ui_edit_move :: enum u32 {
|
|
|
|
+ NONE = 0,
|
|
|
|
+ CHAR = 1,
|
|
|
|
+ WORD = 2,
|
|
|
|
+ LINE = 3,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_context :: struct {
|
|
|
|
+ init: bool,
|
|
|
|
+ input: input_state,
|
|
|
|
+ frameCounter: u64,
|
|
|
|
+ frameTime: f64,
|
|
|
|
+ lastFrameDuration: f64,
|
|
|
|
+ frameArena: arena,
|
|
|
|
+ boxPool: pool,
|
|
|
|
+ boxMap: [1024]list,
|
|
|
|
+ root: ^ui_box,
|
|
|
|
+ overlay: ^ui_box,
|
|
|
|
+ overlayList: list,
|
|
|
|
+ boxStack: ^ui_stack_elt,
|
|
|
|
+ clipStack: ^ui_stack_elt,
|
|
|
|
+ nextBoxBeforeRules: list,
|
|
|
|
+ nextBoxAfterRules: list,
|
|
|
|
+ nextBoxTags: list,
|
|
|
|
+ z: u32,
|
|
|
|
+ hovered: ^ui_box,
|
|
|
|
+ focus: ^ui_box,
|
|
|
|
+ editCursor: i32,
|
|
|
|
+ editMark: i32,
|
|
|
|
+ editFirstDisplayedChar: i32,
|
|
|
|
+ editCursorBlinkStart: f64,
|
|
|
|
+ editSelectionMode: ui_edit_move,
|
|
|
|
+ editWordSelectionInitialCursor: i32,
|
|
|
|
+ editWordSelectionInitialMark: i32,
|
|
|
|
+ theme: ^ui_theme,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_text_box_result :: struct {
|
|
|
|
+ changed: bool,
|
|
|
|
+ accepted: bool,
|
|
|
|
+ text: str8,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_select_popup_info :: struct {
|
|
|
|
+ changed: bool,
|
|
|
|
+ selectedIndex: i32,
|
|
|
|
+ optionCount: i32 `fmt:"-"`,
|
|
|
|
+ options: [^]str8 `fmt:"s,optionCount"`,
|
|
|
|
+ placeholder: str8,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ui_radio_group_info :: struct {
|
|
|
|
+ changed: bool,
|
|
|
|
+ selectedIndex: i32,
|
|
|
|
+ optionCount: i32 `fmt:"-"`,
|
|
|
|
+ options: [^]str8 `fmt:"s,optionCount"`,
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+@(default_calling_convention="c", link_prefix="oc_")
|
|
|
|
+foreign {
|
|
|
|
+ input_process_event :: proc(arena: ^arena, state: ^input_state, event: ^event) ---
|
|
|
|
+ input_next_frame :: proc(state: ^input_state) ---
|
|
|
|
+ key_down :: proc(state: ^input_state, key: key_code) -> bool ---
|
|
|
|
+ key_press_count :: proc(state: ^input_state, key: key_code) -> u8 ---
|
|
|
|
+ key_release_count :: proc(state: ^input_state, key: key_code) -> u8 ---
|
|
|
|
+ key_repeat_count :: proc(state: ^input_state, key: key_code) -> u8 ---
|
|
|
|
+ key_down_scancode :: proc(state: ^input_state, key: scan_code) -> bool ---
|
|
|
|
+ key_press_count_scancode :: proc(state: ^input_state, key: scan_code) -> u8 ---
|
|
|
|
+ key_release_count_scancode :: proc(state: ^input_state, key: scan_code) -> u8 ---
|
|
|
|
+ key_repeat_count_scancode :: proc(state: ^input_state, key: scan_code) -> u8 ---
|
|
|
|
+ mouse_down :: proc(state: ^input_state, button: mouse_button) -> bool ---
|
|
|
|
+ mouse_pressed :: proc(state: ^input_state, button: mouse_button) -> u8 ---
|
|
|
|
+ mouse_released :: proc(state: ^input_state, button: mouse_button) -> u8 ---
|
|
|
|
+ mouse_clicked :: proc(state: ^input_state, button: mouse_button) -> bool ---
|
|
|
|
+ mouse_double_clicked :: proc(state: ^input_state, button: mouse_button) -> bool ---
|
|
|
|
+ mouse_position :: proc(state: ^input_state) -> vec2 ---
|
|
|
|
+ mouse_delta :: proc(state: ^input_state) -> vec2 ---
|
|
|
|
+ mouse_wheel :: proc(state: ^input_state) -> vec2 ---
|
|
|
|
+ input_text_utf32 :: proc(arena: ^arena, state: ^input_state) -> str32 ---
|
|
|
|
+ input_text_utf8 :: proc(arena: ^arena, state: ^input_state) -> str8 ---
|
|
|
|
+ clipboard_pasted :: proc(state: ^input_state) -> bool ---
|
|
|
|
+ clipboard_pasted_text :: proc(state: ^input_state) -> str8 ---
|
|
|
|
+ key_mods :: proc(state: ^input_state) -> keymod_flags ---
|
|
|
|
+ ui_init :: proc(_context: ^ui_context) ---
|
|
|
|
+ ui_get_context :: proc() -> ^ui_context ---
|
|
|
|
+ ui_set_context :: proc(_context: ^ui_context) ---
|
|
|
|
+ ui_process_event :: proc(event: ^event) ---
|
|
|
|
+ ui_begin_frame :: proc(size: vec2, #by_ptr defaultStyle: ui_style, mask: ui_style_mask) ---
|
|
|
|
+ ui_end_frame :: proc() ---
|
|
|
|
+ ui_draw :: proc() ---
|
|
|
|
+ ui_set_theme :: proc(theme: ^ui_theme) ---
|
|
|
|
+ ui_key_make_str8 :: proc(string: str8) -> ui_key ---
|
|
|
|
+ ui_key_make_path :: proc(path: str8_list) -> ui_key ---
|
|
|
|
+ ui_box_make_str8 :: proc(string: str8, flags: ui_flags) -> ^ui_box ---
|
|
|
|
+ ui_box_begin_str8 :: proc(string: str8, flags: ui_flags) -> ^ui_box ---
|
|
|
|
+ ui_box_end :: proc() -> ^ui_box ---
|
|
|
|
+ ui_box_push :: proc(box: ^ui_box) ---
|
|
|
|
+ ui_box_pop :: proc() ---
|
|
|
|
+ ui_box_top :: proc() -> ^ui_box ---
|
|
|
|
+ ui_box_lookup_key :: proc(key: ui_key) -> ^ui_box ---
|
|
|
|
+ ui_box_lookup_str8 :: proc(string: str8) -> ^ui_box ---
|
|
|
|
+ ui_box_set_draw_proc :: proc(box: ^ui_box, _proc: ui_box_draw_proc, data: rawptr) ---
|
|
|
|
+ ui_box_closed :: proc(box: ^ui_box) -> bool ---
|
|
|
|
+ ui_box_set_closed :: proc(box: ^ui_box, closed: bool) ---
|
|
|
|
+ ui_box_active :: proc(box: ^ui_box) -> bool ---
|
|
|
|
+ ui_box_activate :: proc(box: ^ui_box) ---
|
|
|
|
+ ui_box_deactivate :: proc(box: ^ui_box) ---
|
|
|
|
+ ui_box_hot :: proc(box: ^ui_box) -> bool ---
|
|
|
|
+ ui_box_set_hot :: proc(box: ^ui_box, hot: bool) ---
|
|
|
|
+ ui_box_sig :: proc(box: ^ui_box) -> ui_sig ---
|
|
|
|
+ ui_tag_make_str8 :: proc(string: str8) -> ui_tag ---
|
|
|
|
+ ui_tag_box_str8 :: proc(box: ^ui_box, string: str8) ---
|
|
|
|
+ ui_tag_next_str8 :: proc(string: str8) ---
|
|
|
|
+ ui_apply_style_with_mask :: proc(dst: ^ui_style, src: ^ui_style, mask: ui_style_mask) ---
|
|
|
|
+ ui_pattern_push :: proc(arena: ^arena, pattern: ^ui_pattern, selector: ui_selector) ---
|
|
|
|
+ ui_pattern_all :: proc() -> ui_pattern ---
|
|
|
|
+ ui_pattern_owner :: proc() -> ui_pattern ---
|
|
|
|
+ ui_style_next :: proc(#by_ptr style: ui_style, mask: ui_style_mask) ---
|
|
|
|
+ ui_style_match_before :: proc(pattern: ui_pattern, #by_ptr style: ui_style, mask: ui_style_mask) ---
|
|
|
|
+ ui_style_match_after :: proc(pattern: ui_pattern, #by_ptr style: ui_style, mask: ui_style_mask) ---
|
|
|
|
+ ui_label :: proc(label: cstring) -> ui_sig ---
|
|
|
|
+ ui_label_str8 :: proc(label: str8) -> ui_sig ---
|
|
|
|
+ ui_button :: proc(label: cstring) -> ui_sig ---
|
|
|
|
+ ui_checkbox :: proc(name: cstring, checked: ^bool) -> ui_sig ---
|
|
|
|
+ ui_slider :: proc(name: cstring, value: ^f32) -> ^ui_box ---
|
|
|
|
+ ui_scrollbar :: proc(name: cstring, thumbRatio: f32, scrollValue: ^f32) -> ^ui_box ---
|
|
|
|
+ ui_tooltip :: proc(label: cstring) ---
|
|
|
|
+ ui_panel_begin :: proc(name: cstring, flags: ui_flags) ---
|
|
|
|
+ ui_panel_end :: proc() ---
|
|
|
|
+ ui_menu_bar_begin :: proc(name: cstring) ---
|
|
|
|
+ ui_menu_bar_end :: proc() ---
|
|
|
|
+ ui_menu_begin :: proc(label: cstring) ---
|
|
|
|
+ ui_menu_end :: proc() ---
|
|
|
|
+ ui_menu_button :: proc(label: cstring) -> ui_sig ---
|
|
|
|
+ ui_text_box :: proc(name: cstring, arena: ^arena, text: str8) -> ui_text_box_result ---
|
|
|
|
+ ui_select_popup :: proc(name: cstring, info: ^ui_select_popup_info) -> ui_select_popup_info ---
|
|
|
|
+ ui_radio_group :: proc(name: cstring, info: ^ui_radio_group_info) -> ui_radio_group_info ---
|
|
|
|
+}
|
|
|
|
+
|