diff --git a/.build/.added_strings_w3.jai b/.build/.added_strings_w3.jai index 538abf7..bc14fd4 100644 --- a/.build/.added_strings_w3.jai +++ b/.build/.added_strings_w3.jai @@ -6,7 +6,7 @@ NAME :: "mexplore"; VERSION :: "0.1"; JAI_VERSION :: "beta 0.2.014, built on 24 May 2025"; - RELEASE_DATE :: "10 July 2025, 18:49:46"; + RELEASE_DATE :: "13 July 2025, 19:51:19"; GIT_BRANCH :: "main"; - GIT_REVISION :: "af1f9cfbeb018704986b1d45d62c802538a29ef2"; + GIT_REVISION :: "ad439a550931e9088715ccfbe161757bcead4a9a"; DEBUG :: true; diff --git a/.build/mexplore-debug.lib b/.build/mexplore-debug.lib index 958e306..954e25b 100644 Binary files a/.build/mexplore-debug.lib and b/.build/mexplore-debug.lib differ diff --git a/.build/mexplore-debug_0_w3.obj b/.build/mexplore-debug_0_w3.obj index bb6149d..997b6a1 100644 Binary files a/.build/mexplore-debug_0_w3.obj and b/.build/mexplore-debug_0_w3.obj differ diff --git a/.build/mexplore-debug_1_w3.obj b/.build/mexplore-debug_1_w3.obj index 4a4ca8c..990b2ef 100644 Binary files a/.build/mexplore-debug_1_w3.obj and b/.build/mexplore-debug_1_w3.obj differ diff --git a/.build/mexplore-debug_2_w3.obj b/.build/mexplore-debug_2_w3.obj index c3c6e64..57da458 100644 Binary files a/.build/mexplore-debug_2_w3.obj and b/.build/mexplore-debug_2_w3.obj differ diff --git a/.build/mexplore-debug_3_w3.obj b/.build/mexplore-debug_3_w3.obj index 4757fdd..8f20830 100644 Binary files a/.build/mexplore-debug_3_w3.obj and b/.build/mexplore-debug_3_w3.obj differ diff --git a/bin/mexplore-debug.exe b/bin/mexplore-debug.exe index 11222d8..ce854f1 100644 Binary files a/bin/mexplore-debug.exe and b/bin/mexplore-debug.exe differ diff --git a/bin/mexplore-debug.pdb b/bin/mexplore-debug.pdb index 20dfd1a..269ea9d 100644 Binary files a/bin/mexplore-debug.pdb and b/bin/mexplore-debug.pdb differ diff --git a/bin/mexplore-debug.rdi b/bin/mexplore-debug.rdi index 032814b..b410df5 100644 Binary files a/bin/mexplore-debug.rdi and b/bin/mexplore-debug.rdi differ diff --git a/modules/SDL3/module.jai b/modules/SDL3/module.jai index 14e7164..858a8d5 100644 --- a/modules/SDL3/module.jai +++ b/modules/SDL3/module.jai @@ -32,6 +32,8 @@ SDL_WINDOW_NOT_FOCUSABLE :: 0x0000000080000000; /**< window should not #if OS == .WINDOWS { #load "windows.jai"; + #import "Windows"; + } else #if OS == .MACOS { #load "macos.jai"; diff --git a/modules/SDL3/windows.jai b/modules/SDL3/windows.jai index 0e7e877..f5ee641 100644 --- a/modules/SDL3/windows.jai +++ b/modules/SDL3/windows.jai @@ -33563,7 +33563,7 @@ SDL_GetStorageSpaceRemaining :: (storage: *SDL_Storage) -> Uint64 #foreign sdl3; SDL_GlobStorageDirectory :: (storage: *SDL_Storage, path: *u8, pattern: *u8, flags: SDL_GlobFlags, count: *s32) -> **u8 #foreign sdl3; tagMSG :: struct {} -MSG :: tagMSG; +//MSG :: tagMSG; /** * A callback to be used with SDL_SetWindowsMessageHook. diff --git a/src/main.jai b/src/main.jai index 0baaaa8..c09caa4 100644 --- a/src/main.jai +++ b/src/main.jai @@ -6,10 +6,12 @@ #import "File"; #import "String"; #import "stb_image"; -#import "stb_rect_pack"; +#import "Windows_Utf8"; +#import "Windows"; using SDL3 :: #import "SDL3"; #import "kb_text_shape"; +#import "stb_rect_pack"; #load "text.jai"; #load "ui.jai"; @@ -41,6 +43,9 @@ icon_font_big : Font; main :: () { log("Hello, Sailor!"); + #if OS == .WINDOWS + SetConsoleOutputCP(65001); // CP_UTF8 + SDL_Init(SDL_INIT_VIDEO); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); @@ -60,28 +65,65 @@ main :: () { SDL_StartTextInput(window); while (running) { + input_state.last_char = 0; + event : SDL_Event; while SDL_PollEvent(*event) { + transition : InputTransition; + if event.type == { case SDL_EVENT_QUIT; running = false; + + case SDL_EVENT_KEY_DOWN; + if event.key.key == SDLK_ESCAPE + running = false; + + case SDL_EVENT_MOUSE_MOTION; + transition.motion_delta = .{event.motion.xrel, event.motion.yrel}; + + case SDL_EVENT_MOUSE_WHEEL; + transition.mouse_wheel = xx event.wheel.y; + + case SDL_EVENT_MOUSE_BUTTON_DOWN; + if event.button.button == SDL_BUTTON_LEFT { + transition.left_down = true; + input_state.left_mouse = true; + } + + if event.button.button == SDL_BUTTON_RIGHT { + transition.right_down = true; + input_state.right_mouse = true; + } + + case SDL_EVENT_MOUSE_BUTTON_UP; + if event.button.button == SDL_BUTTON_LEFT { + transition.left_up = true; + input_state.left_mouse = false; + } + + if event.button.button == SDL_BUTTON_RIGHT { + transition.right_up = true; + input_state.right_mouse = false; + } case SDL_EVENT_TEXT_INPUT; //input_state.last_char = xx it.utf32; text : string = to_string(event.text.text); - text_utf32 : [..]u32; - defer array_free(text_utf32); + log("%", text); StringAt : u64; while StringAt < xx text.count { Decode : kbts_decode = kbts_DecodeUtf8(text.data + StringAt, xx text.count - StringAt); StringAt += Decode.SourceCharactersConsumed; if Decode.Valid { - array_add(*text_utf32, Decode.Codepoint); + input_state.last_char = xx Decode.Codepoint; } } } + + array_add(*input_transitions, transition); } glClearColor(0.5, 0.1, 0.5, 0.0); @@ -96,7 +138,7 @@ main :: () { ui_context.sizing_y = .GROW; ui_context.colours.normal = Vector4.{0.13, 0.16, 0.22, 1}; - ui_context.colours.hover = Vector4.{0.13, 0.16, 0.22, 1}; + ui_context.colours.hover = Vector4.{0.23, 0.26, 0.32, 1}; ui_context.colours.active = Vector4.{0.13, 0.16, 0.22, 1}; ui_context.colours.background = Vector4.{0.07, 0.09, 0.16, 1}; @@ -106,9 +148,12 @@ main :: () { { ui_context.layout = .LTR; ui_context.colours.background = .{0.07, 0.09, 0.16, 1}; + ui_context.colours.background = .{0.11, 0.25, 0.26, 1}; ui_context.sizing_x = .FIT; ui_context.sizing_y = .FIT; - ui_label("Hello, World"); + //ui_label("Hello, World! How's it going?"); + ui_label("Hello, World!"); + ui_text_input("Name"); // ui_begin_container("Picture-Name-Settings"); // { // ui_icon("Icon", *dog, v2(128)); diff --git a/src/platform/input.jai b/src/platform/input.jai index 2a5cf86..ed48acc 100644 --- a/src/platform/input.jai +++ b/src/platform/input.jai @@ -13,7 +13,7 @@ InputState :: struct { left_mouse : bool; right_mouse : bool; - last_char : u8; + last_char : s32; } input_state : InputState; diff --git a/src/stb_textedit.jai b/src/stb_textedit.jai index 2c7108c..fe3c8a2 100644 --- a/src/stb_textedit.jai +++ b/src/stb_textedit.jai @@ -306,16 +306,16 @@ STB_TEXTEDIT_INSERTCHARS :: (obj: *STB_TEXTEDIT_STRING, i: s32, c: *STB_TEXTEDIT len := obj.text.count; if n + len > obj.text.allocated { - array_reserve(*obj.text, n + len); + array_resize(*obj.text, n + len); } // Shift the tail of the string right by n characters - memcpy(obj.text.data + i + n, obj.text.data + i, obj.text.count - i); + if i != len + memcpy(obj.text.data + ((i + n) * size_of(STB_TEXTEDIT_CHARTYPE)), obj.text.data + (i * size_of(STB_TEXTEDIT_CHARTYPE)), (len - i) * size_of(STB_TEXTEDIT_CHARTYPE)); - memcpy(obj.text.data + i, xx c, n); - - obj.text.count += n; + //memcpy(obj.text.data + (i * size_of(STB_TEXTEDIT_CHARTYPE)), c, n * size_of(STB_TEXTEDIT_CHARTYPE)); + memcpy(obj.text.data + (i), c, n * size_of(STB_TEXTEDIT_CHARTYPE)); return true; } @@ -339,8 +339,8 @@ STB_TEXTEDIT_LAYOUTROW :: (row: *StbTexteditRow, obj: *STB_TEXTEDIT_STRING, n: s //size, max_descent, read := SegmentText(obj.font, text_utf32.data, xx text_utf32.count); idx : s32; - while row.x1 < obj.max_size.x { - size, max_descent, read := next_word_size(obj.font, string.{obj.text.count, obj.text.data}, n + idx, obj.max_size.x); + while idx < obj.text.count && row.x1 < obj.max_size.x { + size, max_descent, read := next_word_size(obj.font, .{obj.text.count, obj.text.data}, n + idx, obj.max_size.x); if row.x1 + size.x > obj.max_size.x { break; diff --git a/src/text.jai b/src/text.jai index 89f3400..c510a1f 100644 --- a/src/text.jai +++ b/src/text.jai @@ -213,7 +213,7 @@ init_font :: (using font: *Font, filename: string, size: s32) { } } -render_text :: (font: *Font, text: string, pos: Vector2, size: Vector2, window_space: bool = true, colour: Vector4 = .{1.0, 1.0, 1.0, 1.0}, +render_text :: (font: *Font, text: []u32, pos: Vector2, size: Vector2, window_space: bool = true, colour: Vector4 = .{1.0, 1.0, 1.0, 1.0}, background: Vector4 = .{0.0, 0.0, 0.0, 0.0}, nice_background := false, count_descent: bool = false) { if !text @@ -235,27 +235,15 @@ render_text :: (font: *Font, text: string, pos: Vector2, size: Vector2, window_s render_pos := pos; - text_utf32 : [..]u32; - defer array_free(text_utf32); - - StringAt : u64; - while StringAt < xx text.count { - Decode : kbts_decode = kbts_DecodeUtf8(text.data + StringAt, xx text.count - StringAt); - StringAt += Decode.SourceCharactersConsumed; - if Decode.Valid { - array_add(*text_utf32, Decode.Codepoint); - } - } - Cursor : kbts_cursor; Direction : kbts_direction = .KBTS_DIRECTION_NONE; Script : kbts_script = .KBTS_SCRIPT_DONT_KNOW; - Glyphs : *kbts_glyph = cast(*kbts_glyph, alloc(size_of(kbts_glyph) * text_utf32.count)); + Glyphs : *kbts_glyph = cast(*kbts_glyph, alloc(size_of(kbts_glyph) * text.count)); CodepointIndex : s32; while CodepointIndex < xx text.count { - Glyphs[CodepointIndex] = kbts_CodepointToGlyph(*font.kb, text_utf32.data[CodepointIndex]); + Glyphs[CodepointIndex] = kbts_CodepointToGlyph(*font.kb, text.data[CodepointIndex]); CodepointIndex += 1; } @@ -263,7 +251,7 @@ render_text :: (font: *Font, text: string, pos: Vector2, size: Vector2, window_s State : *kbts_shape_state = kbts_CreateShapeState(*font.kb); Config : kbts_shape_config = kbts_ShapeConfig(*font.kb, Script, .DONT_KNOW); - GlyphCount : u32 = xx text_utf32.count; + GlyphCount : u32 = xx text.count; GlyphCapacity : u32 = GlyphCount; while kbts_Shape(State, *Config, Direction, Direction, Glyphs, *GlyphCount, GlyphCapacity) { Glyphs = cast(*kbts_glyph, realloc(Glyphs, size_of(kbts_glyph) * State.RequiredGlyphCapacity, size_of(kbts_glyph) * GlyphCapacity)); @@ -282,8 +270,8 @@ render_text :: (font: *Font, text: string, pos: Vector2, size: Vector2, window_s // x_advance : hb_position_t = glyph_pos[i].x_advance; // y_advance : hb_position_t = glyph_pos[i].y_advance; - x_offset : float = xx FT_MulFix(Cursor.X, font.face.size.metrics.x_scale) >> 6; - y_offset : float = xx FT_MulFix(Cursor.Y, font.face.size.metrics.y_scale) >> 6; + x_offset : float = xx FT_MulFix(X, font.face.size.metrics.x_scale) >> 6; + y_offset : float = xx FT_MulFix(Y, font.face.size.metrics.y_scale) >> 6; glyph : *Glyph = table_find_pointer(*font.glyphs, kglyph.Id); @@ -487,7 +475,7 @@ ShapeText :: (font: *Font, Cursor: *kbts_cursor, Codepoints: *u32, CodepointCoun glyph : *Glyph = table_find_pointer(*font.glyphs, kglyph.Id); if glyph { size.y = max(size.y, xx glyph.height); - size.x += xx FT_MulFix(Cursor.X, font.face.size.metrics.x_scale) >> 6; + size.x += xx FT_MulFix(Cursor.X - X, font.face.size.metrics.x_scale) >> 6; max_descent = max(max_descent, xx glyph.descent); //line.max_descent = max(line.max_descent, cast(float) glyph.descent); //line.max_ascent = max(line.max_ascent, cast(float) glyph.ascent); @@ -645,25 +633,25 @@ SegmentText :: (font: *Font, Codepoints: *u32, CodepointCount: u64) -> Vector2, // return 0; // } -next_word_size :: (font: *Font, text: string, n: s32, max_width: float = 0.0) -> Vector2, float, s32 { +next_word_size :: (font: *Font, text: []u32, n: s32, max_width: float = 0.0) -> Vector2, float, s32 { - textp : *u8 = text.data; - line_start : *u8 = textp + n; - len := text.count - (line_start - textp); + textp : *u32 = text.data; + line_start : *u32 = textp + n; + len : u64 = xx (text.count - (line_start - textp)); - text_utf32 : [..]u32; - defer array_free(text_utf32); + // text_utf32 : [..]u32; + // defer array_free(text_utf32); - StringAt : u64; - while StringAt < xx len { - Decode : kbts_decode = kbts_DecodeUtf8(line_start + StringAt, xx len - StringAt); - StringAt += Decode.SourceCharactersConsumed; - if Decode.Valid { - array_add(*text_utf32, Decode.Codepoint); - } - } + // StringAt : u64; + // while StringAt < xx len { + // Decode : kbts_decode = kbts_DecodeUtf8(line_start + StringAt, xx len - StringAt); + // StringAt += Decode.SourceCharactersConsumed; + // if Decode.Valid { + // array_add(*text_utf32, Decode.Codepoint); + // } + // } - size, max_descent, read := SegmentText(font, text_utf32.data, xx text_utf32.count); + size, max_descent, read := SegmentText(font, line_start, len); return size, max_descent, read; @@ -677,7 +665,7 @@ next_word_size :: (font: *Font, text: string, n: s32, max_width: float = 0.0) -> // } // } - total_size : Vector2; + //total_size : Vector2; // lines : [..]Line; // if !text { @@ -820,7 +808,7 @@ next_word_size :: (font: *Font, text: string, n: s32, max_width: float = 0.0) -> // } - return total_size, 0, 0; + //return total_size, 0, 0; } make_texture_from_data :: (data: *u8, width: s32, height: s32) -> Texture { diff --git a/src/ui.jai b/src/ui.jai index b8b15c1..a672f27 100644 --- a/src/ui.jai +++ b/src/ui.jai @@ -158,6 +158,7 @@ Label :: struct { font_colour : Vector4; text : string; text_size : Vector2; + max_descent : float; //lines : [..]Line; } @@ -198,8 +199,9 @@ TextInput :: struct { frame : *Texture; font : *Font; font_colour : Vector4; - text : [..]u8; + text : [..]u32; max_width : float; + max_descent : float; textedit_state : STB_TexteditState; } @@ -410,10 +412,23 @@ ui_label :: (s: string = "", colour := Vector4.{1.0, 1.0, 1.0, 1.0}) { } ui_size_label :: (label: *Label, max_width: float) { + text_utf32 : [..]u32; + defer array_free(text_utf32); + + StringAt : u64; + while StringAt < xx label.text.count { + Decode : kbts_decode = kbts_DecodeUtf8(label.text.data + StringAt, xx label.text.count - StringAt); + StringAt += Decode.SourceCharactersConsumed; + if Decode.Valid { + array_add(*text_utf32, Decode.Codepoint); + } + } + label_size : Vector2; + max_descent : float; idx : s32; while idx < label.text.count { - word_size, word_ascent, read := next_word_size(label.font, label.text, idx, max_width); + word_size, word_descent, read := next_word_size(label.font, text_utf32, idx, max_width); if max_width > 0.0 && label_size.x + word_size.x > max_width { break; @@ -421,14 +436,16 @@ ui_size_label :: (label: *Label, max_width: float) { label_size.x += word_size.x; label_size.y = max(label_size.y, word_size.y); + max_descent = max(max_descent, word_descent); idx += read; } //label_size := Vector2.{xx Simp.prepare_text(label.font, label.text), xx label.font.character_height}; - label.min_size = v2(2 * label.margin + 2 * label.padding) + label_size; + label.min_size = v2(2 * label.margin + 2 * label.padding) + Vector2.{label_size.x, label_size.y + max_descent}; label.size = label.min_size; label.max_size = label.size; + label.max_descent = max_descent; //label.lines = lines; label.text_size = label_size; } @@ -458,18 +475,32 @@ ui_draw_label :: (using label: *Label) { // restore_opengl_state(*opengl_state); //n : s32 = xx label.text.count; + line_height := font.face.size.metrics.height >> 6; - midline : Vector2 = pos + Vector2.{cast(float, margin + padding), xx (size.y / 2.0)}; + midline : Vector2 = pos + Vector2.{cast(float, margin + padding), cast(float, margin + padding) + max_descent}; + //0.0/*xx -(font.face.size.metrics.height >> 6 / 2.0)*/}; + + text_utf32 : [..]u32; + defer array_free(text_utf32); + + StringAt : u64; + while StringAt < xx text.count { + Decode : kbts_decode = kbts_DecodeUtf8(text.data + StringAt, xx text.count - StringAt); + StringAt += Decode.SourceCharactersConsumed; + if Decode.Valid { + array_add(*text_utf32, Decode.Codepoint); + } + } this_size : Vector2; idx : s32; row_start : s32; row_end : s32; while idx < label.text.count { - word_size, word_max_descent, read := next_word_size(label.font, string.{label.text.count, label.text.data}, idx, label.max_size.x); + word_size, word_max_descent, read := next_word_size(label.font, text_utf32, idx, label.max_size.x); if this_size.x + word_size.x > label.max_size.x { - render_text(font, .{row_end - row_start, label.text.data + row_start}, this_size, + render_text(font, .{row_end - row_start, text_utf32.data + row_start}, this_size, midline, colour = font_colour); row_start = row_end; midline.y += label.font.face.size.metrics.height >> 6; @@ -482,7 +513,7 @@ ui_draw_label :: (using label: *Label) { } if row_start < row_end { - render_text(font, .{row_end - row_start, label.text.data + row_start}, + render_text(font, .{row_end - row_start, text_utf32.data + row_start}, midline, this_size, colour = font_colour); } @@ -633,10 +664,21 @@ ui_button :: (s: string = "", icon_texture: *Texture = null, font_colour := Vect button.min_size = v2(2 * button.margin + 2 * button.border_size + 2 * button.padding); - idx : s32; + text_utf32 : [..]u32; + defer array_free(text_utf32); + StringAt : u64; + while StringAt < xx text.count { + Decode : kbts_decode = kbts_DecodeUtf8(text.data + StringAt, xx text.count - StringAt); + StringAt += Decode.SourceCharactersConsumed; + if Decode.Valid { + array_add(*text_utf32, Decode.Codepoint); + } + } + + idx : s32; while idx < text.count { - label_size, max_descent, read := next_word_size(button.font, button.text, idx, button.max_size.x); + label_size, max_descent, read := next_word_size(button.font, text_utf32, idx, button.max_size.x); idx += read; } @@ -862,23 +904,29 @@ ui_text_input :: (s: string, font_colour := Vector4.{1, 1, 1, 1}) { ui_append_to_parent(text_input); + if text_input.active && input_state.last_char > 0 { + stb_textedit_key(text_input, *text_input.textedit_state, input_state.last_char); + // log("Adding % to builder.", to_string(*input_state.last_char, 1)); + // append(*text_input.input_buffer, input_state.last_char); + } + text_size : Vector2; + text_size.y = xx text_input.font.face.size.metrics.height >> 6; //str := builder_to_string(*text_input.input_buffer, 0, false); // if str.count > 0 { // defer free(str); // textsize = Vector2.{xx Simp.prepare_text(text_input.font, str), xx text_input.font.character_height}; // } + max_descent : float; + idx : s32; + while idx < text_input.text.count { + word_size, word_descent, read := next_word_size(text_input.font, text_input.text, idx, 0.0); - row : StbTexteditRow; - i : s32; + text_size.x += word_size.x; + text_size.y = max(text_size.y, word_size.y); + max_descent = max(max_descent, word_descent); - while i < text_input.text.count { - STB_TEXTEDIT_LAYOUTROW(*row, text_input, i); - - text_size.x += row.x1; - text_size.y = max(text_size.y, row.baseline_y_delta); - - i += row.num_chars; + idx += read; } text_input.min_size = v2(2 * text_input.margin + 2 * text_input.border_size + 2 * text_input.padding) + text_size; @@ -909,12 +957,6 @@ ui_text_input :: (s: string, font_colour := Vector4.{1, 1, 1, 1}) { } else { text_input.hot = false; } - - if text_input.active && input_state.last_char > 0 { - stb_textedit_key(text_input, *text_input.textedit_state, input_state.last_char); - // log("Adding % to builder.", to_string(*input_state.last_char, 1)); - // append(*text_input.input_buffer, input_state.last_char); - } } ui_draw_text_input :: (using text_input: *TextInput) { @@ -1277,7 +1319,7 @@ ui_content_size :: (rect: *Rect) -> Vector2 { while next { if next.type != .SCROLLBAR { - size_to_add := ifx next.type == .LABEL then next.last_frame_size else next.size; + size_to_add := /*ifx next.type == .LABEL then next.last_frame_size else */next.size; if rect.layout == { case .TTB; size.x = max(size.x, /*rect.min_size.x + */ size_to_add.x); @@ -1314,7 +1356,7 @@ ui_grow_roots :: () { bottom_left = it; } - if bottom_left && top_left { + if bottom_left { bottom_left.max_size = bottom_left.size; top_left.max_size = Vector2.{xx window_width, xx window_height - bottom_left.max_size.y}; @@ -1322,12 +1364,15 @@ ui_grow_roots :: () { if bottom_left.sizing_x == .GROW { bottom_left.size.x = xx window_width; } + } - if top_left.sizing_y == .GROW { - if bottom_left.sizing_y != .GROW { - //top_left.size.y = window_height - bottom_left.size.y; - } - } + if top_left { + + // if top_left.sizing_y == .GROW { + // if bottom_left.sizing_y != .GROW { + // //top_left.size.y = window_height - bottom_left.size.y; + // } + // } if top_left.sizing_x == .GROW { top_left.size.x = xx window_width; diff --git a/ui.rad b/ui.rad index c6d1ae8..6e678d3 100644 --- a/ui.rad +++ b/ui.rad @@ -1,12 +1,14 @@ // raddbg 0.9.20 project file -recent_file: path: "src/text.jai" -recent_file: path: "src/ui.jai" recent_file: path: "src/main.jai" +recent_file: path: "src/ui.jai" +recent_file: path: "../../../../jai/modules/math/module.jai" recent_file: path: "../../../../jai/modules/basic/array.jai" +recent_file: path: "src/stb_textedit.jai" +recent_file: path: "src/text.jai" +recent_file: path: "modules/kb_text_shape/kb_text_shape.h" recent_file: path: "../../../../jai/modules/basic/module.jai" recent_file: path: "../../../../jai/modules/default_allocator/module.jai" -recent_file: path: "modules/kb_text_shape/kb_text_shape.h" recent_file: path: "../../../../jai/modules/runtime_support.jai" target: { @@ -16,6 +18,7 @@ target: } breakpoint: { - source_location: "src/main.jai:72:1" + source_location: "src/stb_textedit.jai:990:1" hit_count: 0 + enabled: 0 }