diff --git a/src/mdesk/mdesk.c b/src/mdesk/mdesk.c index a1888673..1b6e2f51 100644 --- a/src/mdesk/mdesk.c +++ b/src/mdesk/mdesk.c @@ -1204,3 +1204,25 @@ md_debug_string_list_from_tree(Arena *arena, MD_Node *root) } return strings; } + +//////////////////////////////// +//~ rjf: Node Pointer List Functions + +internal void +md_node_ptr_list_push(Arena *arena, MD_NodePtrList *list, MD_Node *node) +{ + MD_NodePtrNode *n = push_array(arena, MD_NodePtrNode, 1); + n->v = node; + SLLQueuePush(list->first, list->last, n); + list->count += 1; +} + +internal void +md_node_ptr_list_push_front(Arena *arena, MD_NodePtrList *list, MD_Node *node) +{ + MD_NodePtrNode *n = push_array(arena, MD_NodePtrNode, 1); + n->v = node; + SLLQueuePushFront(list->first, list->last, n); + list->count += 1; +} + diff --git a/src/mdesk/mdesk.h b/src/mdesk/mdesk.h index afe6fc32..455cb268 100644 --- a/src/mdesk/mdesk.h +++ b/src/mdesk/mdesk.h @@ -202,6 +202,21 @@ struct MD_NodeRec S32 pop_count; }; +typedef struct MD_NodePtrNode MD_NodePtrNode; +struct MD_NodePtrNode +{ + MD_NodePtrNode *next; + MD_Node *v; +}; + +typedef struct MD_NodePtrList MD_NodePtrList; +struct MD_NodePtrList +{ + MD_NodePtrNode *first; + MD_NodePtrNode *last; + U64 count; +}; + //////////////////////////////// //~ rjf: Text -> Tokens Types @@ -322,4 +337,10 @@ internal MD_ParseResult md_parse_from_text(Arena *arena, String8 filename, Strin internal String8List md_debug_string_list_from_tree(Arena *arena, MD_Node *root); +//////////////////////////////// +//~ rjf: Node Pointer List Functions + +internal void md_node_ptr_list_push(Arena *arena, MD_NodePtrList *list, MD_Node *node); +internal void md_node_ptr_list_push_front(Arena *arena, MD_NodePtrList *list, MD_Node *node); + #endif // MDESK_H diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 45e11be1..a8c5cbb4 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -606,7 +606,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[213] = { str8_lit_comp("log_marker"), str8_lit_comp("Logs a marker in the application log, to denote specific points in time within the log."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, }; -struct {String8 string; RD_Binding binding;} rd_default_binding_table[109] = +struct {String8 string; RD_Binding binding;} rd_default_binding_table[107] = { {str8_lit_comp("kill_all"), {OS_Key_F5, 0 |OS_Modifier_Shift }}, {str8_lit_comp("step_into_inst"), {OS_Key_F11, 0 |OS_Modifier_Alt}}, @@ -620,10 +620,8 @@ struct {String8 string; RD_Binding binding;} rd_default_binding_table[109] = {str8_lit_comp("step_over"), {OS_Key_F10, 0 }}, {str8_lit_comp("run_to_line"), {OS_Key_F10, 0 |OS_Modifier_Ctrl }}, {str8_lit_comp("set_next_statement"), {OS_Key_F10, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, -{str8_lit_comp("inc_ui_font_scale"), {OS_Key_Equal, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("dec_ui_font_scale"), {OS_Key_Minus, 0 |OS_Modifier_Alt}}, -{str8_lit_comp("inc_code_font_scale"), {OS_Key_Equal, 0 |OS_Modifier_Shift |OS_Modifier_Alt}}, -{str8_lit_comp("dec_code_font_scale"), {OS_Key_Minus, 0 |OS_Modifier_Shift |OS_Modifier_Alt}}, +{str8_lit_comp("inc_font_size"), {OS_Key_Equal, 0 |OS_Modifier_Alt}}, +{str8_lit_comp("dec_font_size"), {OS_Key_Minus, 0 |OS_Modifier_Alt}}, {str8_lit_comp("window"), {OS_Key_N, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }}, {str8_lit_comp("toggle_fullscreen"), {OS_Key_Return, 0 |OS_Modifier_Ctrl }}, {str8_lit_comp("new_panel_right"), {OS_Key_P, 0 |OS_Modifier_Ctrl }}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 65c0bb90..f88de859 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -788,10 +788,8 @@ RD_DefaultBindingTable: { "set_next_statement" F10 ctrl shift 0 } //- rjf: font sizes - { "inc_ui_font_scale" Equal 0 0 alt } - { "dec_ui_font_scale" Minus 0 0 alt } - { "inc_code_font_scale" Equal 0 shift alt } - { "dec_code_font_scale" Minus 0 shift alt } + { "inc_font_size" Equal 0 0 alt } + { "dec_font_size" Minus 0 0 alt } //- rjf: windows { "window" N ctrl shift 0 } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 6c4b8952..44fa5e79 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1065,15 +1065,19 @@ rd_color_from_cfg(RD_Cfg *cfg) internal B32 rd_disabled_from_cfg(RD_Cfg *cfg) { - MD_Node *schema = rd_schema_from_name(cfg->string); - MD_Node *enabled_schema = md_child_from_string(schema, str8_lit("enabled"), 0); - MD_Node *default_tag = md_tag_from_string(enabled_schema, str8_lit("default"), 0); + MD_Node *child_schema = &md_nil_node; + MD_NodePtrList schemas = rd_schemas_from_name(cfg->string); + for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next) + { + child_schema = md_child_from_string(n->v, str8_lit("enabled"), 0); + } + MD_Node *default_tag = md_tag_from_string(child_schema, str8_lit("default"), 0); String8 value_string = rd_cfg_child_from_string(cfg, str8_lit("enabled"))->first->string; if(value_string.size == 0) { value_string = default_tag->first->string; } - B32 is_enabled = (str8_match(value_string, str8_lit("1"), 0)); + B32 is_enabled = !!e_value_from_string(value_string).u64; B32 is_disabled = !is_enabled; if(value_string.size == 0) { @@ -1152,19 +1156,19 @@ rd_target_from_cfg(Arena *arena, RD_Cfg *cfg) return target; } -internal MD_Node * -rd_schema_from_name(String8 name) +internal MD_NodePtrList +rd_schemas_from_name(String8 name) { - MD_Node *schema = &md_nil_node; + MD_NodePtrList schemas = {0}; for EachElement(idx, rd_name_schema_info_table) { if(str8_match(name, rd_name_schema_info_table[idx].name, 0)) { - schema = rd_state->schemas[idx]; + schemas = rd_state->schemas[idx]; break; } } - return schema; + return schemas; } internal String8 @@ -1207,15 +1211,20 @@ rd_setting_from_name(String8 name) }; for EachElement(idx, schema_names) { - MD_Node *schema = rd_schema_from_name(schema_names[idx]); - MD_Node *setting = md_child_from_string(schema, name, 0); - MD_Node *default_tag = md_tag_from_string(setting, str8_lit("default"), 0); - if(default_tag != &md_nil_node) + MD_NodePtrList schemas = rd_schemas_from_name(schema_names[idx]); + for(MD_NodePtrNode *n = schemas.first; n != 0; n = n->next) { - result = default_tag->first->string; - break; + MD_Node *schema = n->v; + MD_Node *setting = md_child_from_string(schema, name, 0); + MD_Node *default_tag = md_tag_from_string(setting, str8_lit("default"), 0); + if(default_tag != &md_nil_node) + { + result = default_tag->first->string; + goto end_default_search; + } } } + end_default_search:; scratch_end(scratch); } } @@ -1605,8 +1614,12 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range) String8 read_data = {0}; if(child_key.size != 0) { - MD_Node *root_schema = rd_schema_from_name(root_cfg->string); - MD_Node *child_schema = md_child_from_string(root_schema, child_key, 0); + MD_NodePtrList schemas = rd_schemas_from_name(root_cfg->string); + MD_Node *child_schema = &md_nil_node; + for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next) + { + child_schema = md_child_from_string(n->v, child_key, 0); + } String8 child_type_name = child_schema->first->string; if(str8_match(child_type_name, str8_lit("path_pt"), 0)) { @@ -1674,8 +1687,12 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range) String8 read_data = {0}; if(child_key.size != 0) { - MD_Node *root_schema = rd_schema_from_name(ctrl_entity_kind_code_name_table[entity->kind]); - MD_Node *child_schema = md_child_from_string(root_schema, child_key, 0); + MD_NodePtrList schemas = rd_schemas_from_name(ctrl_entity_kind_code_name_table[entity->kind]); + MD_Node *child_schema = &md_nil_node; + for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next) + { + child_schema = md_child_from_string(n->v, child_key, 0); + } if(str8_match(child_schema->string, str8_lit("exe"), 0) || str8_match(child_schema->string, str8_lit("label"), 0)) { @@ -1790,8 +1807,12 @@ rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range) // rjf: perform write, based on child name in schema if(child_key.size != 0) { - MD_Node *root_schema = rd_schema_from_name(ctrl_entity_kind_code_name_table[entity->kind]); - MD_Node *child_schema = md_child_from_string(root_schema, child_key, 0); + MD_NodePtrList schemas = rd_schemas_from_name(ctrl_entity_kind_code_name_table[entity->kind]); + MD_Node *child_schema = &md_nil_node; + for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next) + { + child_schema = md_child_from_string(n->v, child_key, 0); + } if(str8_match(child_schema->string, str8_lit("label"), 0)) { result = 1; @@ -2119,7 +2140,7 @@ rd_view_from_eval(RD_Cfg *parent, E_Eval eval) RD_Cfg *view = rd_cfg_child_from_string_or_alloc(parent, schema_name); rd_cfg_child_from_string_or_alloc(view, str8_lit("selected")); { - MD_Node *schema = rd_schema_from_name(schema_name); + MD_NodePtrList schemas = rd_schemas_from_name(schema_name); E_Expr *primary_expr = eval.expr; E_Expr **args = 0; U64 args_count = 0; @@ -2146,9 +2167,9 @@ rd_view_from_eval(RD_Cfg *parent, E_Eval eval) param_name = arg->first->string; arg_expr = arg->first->next; } - else + else if(schemas.last != 0) { - for MD_EachNode(schema_child, schema->first) + for MD_EachNode(schema_child, schemas.last->v->first) { MD_Node *order_tag = md_tag_from_string(schema_child, str8_lit("order"), 0); if(order_tag != &md_nil_node) @@ -8679,11 +8700,11 @@ rd_window_frame(void) ui_eat_event(evt); if(evt->delta_2f32.y < 0) { - rd_cmd(RD_CmdKind_IncFontSize); + rd_cmd(RD_CmdKind_IncFontSize, .view = 0); } else if(evt->delta_2f32.y > 0) { - rd_cmd(RD_CmdKind_DecFontSize); + rd_cmd(RD_CmdKind_DecFontSize, .view = 0); } } } @@ -10903,10 +10924,41 @@ rd_init(CmdLine *cmdln) // rjf: set up schemas { U64 schemas_count = ArrayCount(rd_name_schema_info_table); - rd_state->schemas = push_array(rd_state->arena, MD_Node *, schemas_count); + rd_state->schemas = push_array(rd_state->arena, MD_NodePtrList, schemas_count); for EachIndex(idx, schemas_count) { - rd_state->schemas[idx] = md_tree_from_string(rd_state->arena, rd_name_schema_info_table[idx].schema)->first; + Temp scratch = scratch_begin(0, 0); + typedef struct SchemaParseTask SchemaParseTask; + struct SchemaParseTask + { + SchemaParseTask *next; + String8 schema_text; + }; + SchemaParseTask start_task = {0, rd_name_schema_info_table[idx].schema}; + SchemaParseTask *first_task = &start_task; + SchemaParseTask *last_task = first_task; + for(SchemaParseTask *t = first_task; t != 0; t = t->next) + { + MD_Node *schema = md_tree_from_string(rd_state->arena, t->schema_text)->first; + md_node_ptr_list_push_front(rd_state->arena, &rd_state->schemas[idx], schema); + for MD_EachNode(tag, schema->first_tag) + { + if(str8_match(tag->string, str8_lit("inherit"), 0)) + { + for EachIndex(idx2, schemas_count) + { + if(str8_match(rd_name_schema_info_table[idx2].name, tag->first->string, 0)) + { + SchemaParseTask *new_task = push_array(scratch.arena, SchemaParseTask, 1); + SLLQueuePush(first_task, last_task, new_task); + new_task->schema_text = rd_name_schema_info_table[idx2].schema; + break; + } + } + } + } + } + scratch_end(scratch); } } diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index f8efc425..67506ca0 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -598,7 +598,7 @@ struct RD_State String8 project_path; // rjf: schema table - MD_Node **schemas; + MD_NodePtrList *schemas; // rjf: default theme table MD_Node *theme_preset_trees[RD_ThemePreset_COUNT]; @@ -863,7 +863,7 @@ internal String8 rd_expr_from_cfg(RD_Cfg *cfg); internal String8 rd_path_from_cfg(RD_Cfg *cfg); internal D_Target rd_target_from_cfg(Arena *arena, RD_Cfg *cfg); -internal MD_Node *rd_schema_from_name(String8 name); +internal MD_NodePtrList rd_schemas_from_name(String8 name); internal String8 rd_setting_from_name(String8 name); #define rd_setting_b32_from_name(name) (str8_match(rd_setting_from_name(name), str8_lit("1"), 0)) diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index e43baa2c..7611a0a2 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -277,20 +277,12 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(registers) //////////////////////////////// //~ rjf: Schema Type Hooks -typedef struct RD_SchemaNode RD_SchemaNode; -struct RD_SchemaNode -{ - RD_SchemaNode *next; - MD_Node *schema; -}; - typedef struct RD_SchemaIRExt RD_SchemaIRExt; struct RD_SchemaIRExt { RD_Cfg *cfg; CTRL_Entity *entity; - RD_SchemaNode *first_schema; - RD_SchemaNode *last_schema; + MD_NodePtrList schemas; }; E_TYPE_IREXT_FUNCTION_DEF(schema) @@ -303,21 +295,9 @@ E_TYPE_IREXT_FUNCTION_DEF(schema) E_Interpretation interpret = e_interpret(bytecode); E_TypeKey type_key = irtree->type_key; E_Type *type = e_type_from_key__cached(type_key); - MD_Node *schema = rd_schema_from_name(type->name); ext->cfg = rd_cfg_from_eval_space(interpret.space); ext->entity = rd_ctrl_entity_from_eval_space(interpret.space); - for MD_EachNode(tag, schema->first_tag) - { - if(str8_match(tag->string, str8_lit("inherit"), 0)) - { - RD_SchemaNode *n = push_array(arena, RD_SchemaNode, 1); - n->schema = rd_schema_from_name(tag->first->string); - SLLQueuePush(ext->first_schema, ext->last_schema, n); - } - } - RD_SchemaNode *n = push_array(arena, RD_SchemaNode, 1); - n->schema = schema; - SLLQueuePush(ext->first_schema, ext->last_schema, n); + ext->schemas = rd_schemas_from_name(type->name); scratch_end(scratch); } E_IRExt result = {ext}; @@ -331,9 +311,9 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) if(expr->kind == E_ExprKind_MemberAccess) { MD_Node *child_schema = &md_nil_node; - for(RD_SchemaNode *n = ext->first_schema; n != 0; n = n->next) + for(MD_NodePtrNode *n = ext->schemas.first; n != 0; n = n->next) { - for MD_EachNode(child, n->schema->first) + for MD_EachNode(child, n->v->first) { if(str8_match(child->string, expr->first->next->string, 0)) { @@ -512,9 +492,9 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(schema) ExpandChildNode *first_child_node = 0; ExpandChildNode *last_child_node = 0; U64 child_count = 0; - for(RD_SchemaNode *n = ext->first_schema; n != 0; n = n->next) + for(MD_NodePtrNode *n = ext->schemas.first; n != 0; n = n->next) { - MD_Node *schema = n->schema; + MD_Node *schema = n->v; for MD_EachNode(child, schema->first) { if(!md_node_has_tag(child, str8_lit("no_expand"), 0)) @@ -599,11 +579,15 @@ E_TYPE_IREXT_FUNCTION_DEF(cfgs) //- rjf: gather commands String8List cmds_list = {0}; { - MD_Node *schema = rd_schema_from_name(cfg_name); - MD_Node *collection_cmds_root = md_tag_from_string(schema, str8_lit("collection_commands"), 0); - for MD_EachNode(cmd, collection_cmds_root->first) + MD_NodePtrList schemas = rd_schemas_from_name(cfg_name); + for(MD_NodePtrNode *n = schemas.first; n != 0; n = n->next) { - str8_list_push(arena, &cmds_list, cmd->string); + MD_Node *schema = n->v; + MD_Node *collection_cmds_root = md_tag_from_string(schema, str8_lit("collection_commands"), 0); + for MD_EachNode(cmd, collection_cmds_root->first) + { + str8_list_push(arena, &cmds_list, cmd->string); + } } } diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 8daf5b21..01f9afe0 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1169,58 +1169,62 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) { RD_Cfg *cfg = evalled_cfg; rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = RD_WatchCellFlag_Button, .pct = 1.f, .fstrs = rd_title_fstrs_from_cfg(arena, cfg)); - MD_Node *schema = rd_schema_from_name(cfg->string); - MD_Node *cmds_root = md_tag_from_string(schema, str8_lit("commands"), 0); - for MD_EachNode(cmd, cmds_root->first) + MD_NodePtrList schemas = rd_schemas_from_name(cfg->string); + for(MD_NodePtrNode *n = schemas.first; n != 0; n = n->next) { - String8 cmd_name = cmd->string; - RD_CmdKind cmd_kind = rd_cmd_kind_from_string(cmd_name); - switch(cmd_kind) + MD_Node *schema = n->v; + MD_Node *cmds_root = md_tag_from_string(schema, str8_lit("commands"), 0); + for MD_EachNode(cmd, cmds_root->first) { - default:{}break; - case RD_CmdKind_EnableCfg: + String8 cmd_name = cmd->string; + RD_CmdKind cmd_kind = rd_cmd_kind_from_string(cmd_name); + switch(cmd_kind) { - B32 is_disabled = rd_disabled_from_cfg(cfg); - if(!is_disabled) + default:{}break; + case RD_CmdKind_EnableCfg: { - cmd_kind = RD_CmdKind_DisableCfg; - } - }break; - case RD_CmdKind_DisableCfg: + B32 is_disabled = rd_disabled_from_cfg(cfg); + if(!is_disabled) + { + cmd_kind = RD_CmdKind_DisableCfg; + } + }break; + case RD_CmdKind_DisableCfg: + { + B32 is_disabled = rd_disabled_from_cfg(cfg); + if(is_disabled) + { + cmd_kind = RD_CmdKind_EnableCfg; + } + }break; + case RD_CmdKind_SelectCfg: + { + B32 is_disabled = rd_disabled_from_cfg(cfg); + if(!is_disabled) + { + cmd_kind = RD_CmdKind_DeselectCfg; + } + }break; + case RD_CmdKind_DeselectCfg: + { + B32 is_disabled = rd_disabled_from_cfg(cfg); + if(is_disabled) + { + cmd_kind = RD_CmdKind_SelectCfg; + } + }break; + } + if(cmd_kind == RD_CmdKind_EnableCfg || cmd_kind == RD_CmdKind_DisableCfg) { - B32 is_disabled = rd_disabled_from_cfg(cfg); - if(is_disabled) - { - cmd_kind = RD_CmdKind_EnableCfg; - } - }break; - case RD_CmdKind_SelectCfg: + rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .flags = RD_WatchCellFlag_Background, + .px = floor_f32(ui_top_font_size()*6.f), + .string = str8_lit("($expr).enabled")); + } + else if(cmd_kind != RD_CmdKind_Null) { - B32 is_disabled = rd_disabled_from_cfg(cfg); - if(!is_disabled) - { - cmd_kind = RD_CmdKind_DeselectCfg; - } - }break; - case RD_CmdKind_DeselectCfg: - { - B32 is_disabled = rd_disabled_from_cfg(cfg); - if(is_disabled) - { - cmd_kind = RD_CmdKind_SelectCfg; - } - }break; - } - if(cmd_kind == RD_CmdKind_EnableCfg || cmd_kind == RD_CmdKind_DisableCfg) - { - rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .flags = RD_WatchCellFlag_Background, - .px = floor_f32(ui_top_font_size()*6.f), - .string = str8_lit("($expr).enabled")); - } - else if(cmd_kind != RD_CmdKind_Null) - { - String8 cmd_name = rd_cmd_kind_info_table[cmd_kind].string; - rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .flags = RD_WatchCellFlag_ActivateWithSingleClick|RD_WatchCellFlag_Button, .px = floor_f32(ui_top_font_size()*4.f), .string = push_str8f(arena, "query:commands.%S", cmd_name)); + String8 cmd_name = rd_cmd_kind_info_table[cmd_kind].string; + rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .flags = RD_WatchCellFlag_ActivateWithSingleClick|RD_WatchCellFlag_Button, .px = floor_f32(ui_top_font_size()*4.f), .string = push_str8f(arena, "query:commands.%S", cmd_name)); + } } } } diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index faf68764..eaa812da 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -1777,7 +1777,7 @@ ui_layout_enforce_constraints__in_place_rec(UI_Box *root, Axis2 axis) // rjf: if we have a violation, we need to subtract some amount from all children F32 violation = total_size - total_allowed_size; - if(violation > 0) + if(violation > 0 && total_weighted_size > 0) { // rjf: figure out how much we can take in totality F32 child_fixup_sum = 0;