diff --git a/project.4coder b/project.4coder index dc18d243..0be9237b 100644 --- a/project.4coder +++ b/project.4coder @@ -46,7 +46,7 @@ load_paths = commands = { //- rjf: fkey command slots (change locally but do not commit) - .f1 = { .win = "build raddbg telemetry clang", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build raddbg telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, .f2 = { .win = "build rdi_from_pdb", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, .f3 = { .win = "pushd build && raddbg.exe --user:local_dev.raddbg_user --project:local_dev.raddbg_project --xuto_run && popd",.linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, // .f1 = { .win = "build textperf release telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index ae583352..d1b30a00 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -597,7 +597,7 @@ internal RD_Cfg * rd_cfg_from_handle(RD_Handle handle) { RD_Cfg *cfg = (RD_Cfg *)handle.u64[0]; - if(handle.u64[1] != cfg->gen) + if(cfg == 0 || handle.u64[1] != cfg->gen) { cfg = &rd_nil_cfg; } @@ -959,13 +959,14 @@ rd_panel_tree_from_cfg(Arena *arena, RD_Cfg *cfg) } // rjf: extract cfg info + B32 panel_has_tabs = 0; dst->cfg = src; dst->pct_of_parent = (F32)f64_from_str8(src->string); dst->tab_side = (rd_cfg_child_from_string(src, str8_lit("tabs_on_bottom")) != &rd_nil_cfg ? Side_Max : Side_Min); dst->split_axis = active_split_axis; for(RD_Cfg *src_child = src->first; src_child != &rd_nil_cfg; src_child = src_child->next) { - MD_TokenizeResult tokenize = md_tokenize_from_text(scratch.arena, src->string); + MD_TokenizeResult tokenize = md_tokenize_from_text(scratch.arena, src_child->string); if(tokenize.tokens.count == 1 && tokenize.tokens.v[0].flags & MD_TokenFlag_Numeric) { // NOTE(rjf): skip - this is a panel. @@ -976,8 +977,9 @@ rd_panel_tree_from_cfg(Arena *arena, RD_Cfg *cfg) } else if(tokenize.tokens.count == 1 && tokenize.tokens.v[0].flags & MD_TokenFlag_Identifier) { + panel_has_tabs = 1; rd_cfg_list_push(arena, &dst->tabs, src_child); - if(rd_cfg_child_from_string(src_child, str8_lit("selected"))) + if(rd_cfg_child_from_string(src_child, str8_lit("selected")) != &rd_nil_cfg) { dst->selected_tab = src_child; } @@ -986,6 +988,19 @@ rd_panel_tree_from_cfg(Arena *arena, RD_Cfg *cfg) // rjf: recurse rec = rd_cfg_rec__depth_first(src_root, src); + if(panel_has_tabs) + { + MemoryZeroStruct(&rec); + rec.next = &rd_nil_cfg; + for(RD_Cfg *p = src; p != src_root && p != &rd_nil_cfg; p = p->parent, rec.pop_count += 1) + { + if(p->next != &rd_nil_cfg) + { + rec.next = p->next; + break; + } + } + } if(rec.push_count > 0) { dst_active_parent = dst; @@ -1018,9 +1033,9 @@ rd_panel_node_rec__depth_first(RD_PanelNode *root, RD_PanelNode *panel, U64 sib_ } else for(RD_PanelNode *p = panel; p != &rd_nil_panel_node && p != root; p = p->parent, rec.pop_count += 1) { - if(*MemberFromOffset(RD_PanelNode **, panel, sib_off) != &rd_nil_panel_node) + if(*MemberFromOffset(RD_PanelNode **, p, sib_off) != &rd_nil_panel_node) { - rec.next = *MemberFromOffset(RD_PanelNode **, panel, sib_off); + rec.next = *MemberFromOffset(RD_PanelNode **, p, sib_off); break; } } @@ -2668,7 +2683,7 @@ rd_view_state_from_cfg(RD_Cfg *cfg) U64 slot_idx = hash%rd_state->view_state_slots_count; RD_ViewStateSlot *slot = &rd_state->view_state_slots[slot_idx]; RD_ViewState *view_state = &rd_nil_view_state; - for(RD_ViewState *v = slot->first; v != &rd_nil_view_state; v = v->hash_next) + for(RD_ViewState *v = slot->first; v != 0; v = v->hash_next) { if(rd_handle_match(v->cfg_handle, cfg_handle)) { @@ -2679,7 +2694,7 @@ rd_view_state_from_cfg(RD_Cfg *cfg) if(view_state == &rd_nil_view_state) { view_state = rd_state->free_view_state; - if(view_state != &rd_nil_view_state) + if(view_state) { SLLStackPop_N(rd_state->free_view_state, hash_next); } @@ -2688,7 +2703,7 @@ rd_view_state_from_cfg(RD_Cfg *cfg) view_state = push_array(rd_state->arena, RD_ViewState, 1); } MemoryCopyStruct(view_state, &rd_nil_view_state); - DLLPushBack_NPZ(&rd_nil_view_state, slot->first, slot->last, view_state, hash_next, hash_prev); + DLLPushBack_NP(slot->first, slot->last, view_state, hash_next, hash_prev); view_state->cfg_handle = cfg_handle; view_state->arena = arena_alloc(); } @@ -3005,7 +3020,7 @@ rd_window_state_from_cfg(RD_Cfg *cfg) //- rjf: scan for existing window RD_WindowState *ws = &rd_nil_window_state; - for(RD_WindowState *w = slot->first; w != &rd_nil_window_state; w = w->hash_next) + for(RD_WindowState *w = slot->first; w != 0; w = w->hash_next) { if(rd_handle_match(w->cfg_handle, handle)) { @@ -3052,6 +3067,7 @@ rd_window_state_from_cfg(RD_Cfg *cfg) MemoryZeroStruct(ws); // rjf: fill out window + ws->cfg_handle = handle; ws->arena = arena_alloc(); { String8 title = str8_lit_comp(BUILD_TITLE_STRING_LITERAL); @@ -3094,53 +3110,9 @@ rd_window_state_from_cfg(RD_Cfg *cfg) os_window_set_maximized(ws->os, 1); } - // rjf: pre-emptively rasterize common glyphs - if(rd_state->first_window_state == &rd_nil_window_state) RD_RegsScope(.window = handle) - { - RD_FontSlot english_font_slots[] = {RD_FontSlot_Main, RD_FontSlot_Code}; - RD_FontSlot icon_font_slot = RD_FontSlot_Icons; - for(U64 idx = 0; idx < ArrayCount(english_font_slots); idx += 1) - { - Temp scratch = scratch_begin(0, 0); - RD_FontSlot slot = english_font_slots[idx]; - String8 sample_text = str8_lit("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$%^&*()-_+=[{]}\\|;:'\",<.>/?"); - fnt_push_run_from_string(scratch.arena, - rd_font_from_slot(slot), - rd_font_size_from_slot(RD_FontSlot_Code), - 0, 0, 0, - sample_text); - fnt_push_run_from_string(scratch.arena, - rd_font_from_slot(slot), - rd_font_size_from_slot(RD_FontSlot_Main), - 0, 0, 0, - sample_text); - scratch_end(scratch); - } - for(RD_IconKind icon_kind = RD_IconKind_Null; icon_kind < RD_IconKind_COUNT; icon_kind = (RD_IconKind)(icon_kind+1)) - { - Temp scratch = scratch_begin(0, 0); - fnt_push_run_from_string(scratch.arena, - rd_font_from_slot(icon_font_slot), - rd_font_size_from_slot(icon_font_slot), - 0, 0, FNT_RasterFlag_Smooth, - rd_icon_kind_text_table[icon_kind]); - fnt_push_run_from_string(scratch.arena, - rd_font_from_slot(icon_font_slot), - rd_font_size_from_slot(RD_FontSlot_Main), - 0, 0, FNT_RasterFlag_Smooth, - rd_icon_kind_text_table[icon_kind]); - fnt_push_run_from_string(scratch.arena, - rd_font_from_slot(icon_font_slot), - rd_font_size_from_slot(RD_FontSlot_Code), - 0, 0, FNT_RasterFlag_Smooth, - rd_icon_kind_text_table[icon_kind]); - scratch_end(scratch); - } - } - // rjf: hook up window links DLLPushBack_NPZ(&rd_nil_window_state, rd_state->first_window_state, rd_state->last_window_state, ws, order_next, order_prev); - DLLPushBack_NPZ(&rd_nil_window_state, slot->first, slot->last, ws, hash_next, hash_prev); + DLLPushBack_NP(slot->first, slot->last, ws, hash_next, hash_prev); scratch_end(scratch); } @@ -3158,9 +3130,8 @@ internal RD_WindowState * rd_window_state_from_os_handle(OS_Handle os) { RD_WindowState *ws = &rd_nil_window_state; - for EachIndex(slot_idx, rd_state->window_state_slots_count) { - for(RD_WindowState *w = rd_state->window_state_slots[slot_idx].first; + for(RD_WindowState *w = rd_state->first_window_state; w != &rd_nil_window_state; w = w->order_next) { @@ -3204,6 +3175,52 @@ rd_window_frame(void) ws->window_temporarily_focused_ipc = 0; ui_select_state(ws->ui); + ////////////////////////////// + //- rjf: pre-emptively rasterize common glyphs on the first frame + // + if(rd_state->first_window_state == ws && rd_state->last_window_state == ws && ws->frames_alive == 0) + { + RD_FontSlot english_font_slots[] = {RD_FontSlot_Main, RD_FontSlot_Code}; + RD_FontSlot icon_font_slot = RD_FontSlot_Icons; + for(U64 idx = 0; idx < ArrayCount(english_font_slots); idx += 1) + { + Temp scratch = scratch_begin(0, 0); + RD_FontSlot slot = english_font_slots[idx]; + String8 sample_text = str8_lit("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$%^&*()-_+=[{]}\\|;:'\",<.>/?"); + fnt_push_run_from_string(scratch.arena, + rd_font_from_slot(slot), + rd_font_size_from_slot(RD_FontSlot_Code), + 0, 0, 0, + sample_text); + fnt_push_run_from_string(scratch.arena, + rd_font_from_slot(slot), + rd_font_size_from_slot(RD_FontSlot_Main), + 0, 0, 0, + sample_text); + scratch_end(scratch); + } + for(RD_IconKind icon_kind = RD_IconKind_Null; icon_kind < RD_IconKind_COUNT; icon_kind = (RD_IconKind)(icon_kind+1)) + { + Temp scratch = scratch_begin(0, 0); + fnt_push_run_from_string(scratch.arena, + rd_font_from_slot(icon_font_slot), + rd_font_size_from_slot(icon_font_slot), + 0, 0, FNT_RasterFlag_Smooth, + rd_icon_kind_text_table[icon_kind]); + fnt_push_run_from_string(scratch.arena, + rd_font_from_slot(icon_font_slot), + rd_font_size_from_slot(RD_FontSlot_Main), + 0, 0, FNT_RasterFlag_Smooth, + rd_icon_kind_text_table[icon_kind]); + fnt_push_run_from_string(scratch.arena, + rd_font_from_slot(icon_font_slot), + rd_font_size_from_slot(RD_FontSlot_Code), + 0, 0, FNT_RasterFlag_Smooth, + rd_icon_kind_text_table[icon_kind]); + scratch_end(scratch); + } + } + ////////////////////////////// //- rjf: fill panel/view interaction registers // @@ -5791,7 +5808,7 @@ rd_window_frame(void) // rjf: close dropdown UI_Key close_ctx_menu_key = ui_key_from_stringf(ui_key_zero(), "###close_ctx_menu"); - UI_CtxMenu(close_ctx_menu_key) + UI_CtxMenu(close_ctx_menu_key) RD_Palette(RD_PaletteCode_ImplicitButton) { if(ui_clicked(rd_icon_buttonf(RD_IconKind_Window, 0, "Close Window"))) { @@ -7472,116 +7489,116 @@ rd_window_frame(void) drop_sites[view_idx].prev_view = prev_tab; drop_site_max_p = Max(tab_column_box->rect.x1, drop_site_max_p); } - - // rjf: build add-new-tab button - UI_TextAlignment(UI_TextAlign_Center) - UI_PrefWidth(ui_px(tab_bar_vheight, 1.f)) - UI_PrefHeight(ui_px(tab_bar_vheight, 1.f)) - UI_Column + } + + // rjf: build add-new-tab button + UI_TextAlignment(UI_TextAlign_Center) + UI_PrefWidth(ui_px(tab_bar_vheight, 1.f)) + UI_PrefHeight(ui_px(tab_bar_vheight, 1.f)) + UI_Column + { + if(panel->tab_side == Side_Max) { - if(panel->tab_side == Side_Max) + ui_spacer(ui_px(tab_bar_rv_diff-1.f, 1.f)); + } + else + { + ui_spacer(ui_px(1.f, 1.f)); + } + UI_CornerRadius00(panel->tab_side == Side_Min ? corner_radius : 0) + UI_CornerRadius10(panel->tab_side == Side_Min ? corner_radius : 0) + UI_CornerRadius01(panel->tab_side == Side_Max ? corner_radius : 0) + UI_CornerRadius11(panel->tab_side == Side_Max ? corner_radius : 0) + RD_Font(RD_FontSlot_Icons) + UI_FontSize(ui_top_font_size()) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + UI_HoverCursor(OS_Cursor_HandPoint) + RD_Palette(RD_PaletteCode_ImplicitButton) + { + UI_Box *add_new_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawText| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects| + UI_BoxFlag_Clickable| + UI_BoxFlag_DisableTextTrunc, + "%S##add_new_tab_button_%p", + rd_icon_kind_text_table[RD_IconKind_Add], + panel); + UI_Signal sig = ui_signal_from_box(add_new_box); + if(ui_clicked(sig)) { - ui_spacer(ui_px(tab_bar_rv_diff-1.f, 1.f)); + rd_cmd(RD_CmdKind_FocusPanel); + UI_Key view_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_view_menu_key_")); + ui_ctx_menu_open(view_menu_key, add_new_box->key, v2f32(0, tab_bar_vheight)); } - else + } + } + + scratch_end(scratch); + } + + // rjf: interact with tab bar + ui_signal_from_box(tab_bar_box); + + // rjf: fill out last drop site + { + drop_sites[drop_site_count-1].p = drop_site_max_p; + drop_sites[drop_site_count-1].prev_view = rd_cfg_list_last(&panel->tabs); + } + + // rjf: more precise drop-sites on tab bar + { + Vec2F32 mouse = ui_mouse(); + RD_Cfg *drag_tab = rd_cfg_from_handle(rd_state->drag_drop_regs->view); + if(rd_drag_is_active() && rd_state->drag_drop_regs_slot == RD_RegSlot_View && window_is_focused && contains_2f32(panel_rect, mouse) && drag_tab != &rd_nil_cfg) + { + // rjf: mouse => hovered drop site + F32 min_distance = 0; + DropSite *active_drop_site = 0; + if(catchall_drop_site_hovered) + { + for(U64 drop_site_idx = 0; drop_site_idx < drop_site_count; drop_site_idx += 1) { - ui_spacer(ui_px(1.f, 1.f)); - } - UI_CornerRadius00(panel->tab_side == Side_Min ? corner_radius : 0) - UI_CornerRadius10(panel->tab_side == Side_Min ? corner_radius : 0) - UI_CornerRadius01(panel->tab_side == Side_Max ? corner_radius : 0) - UI_CornerRadius11(panel->tab_side == Side_Max ? corner_radius : 0) - RD_Font(RD_FontSlot_Icons) - UI_FontSize(ui_top_font_size()) - UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - UI_HoverCursor(OS_Cursor_HandPoint) - RD_Palette(RD_PaletteCode_ImplicitButton) - { - UI_Box *add_new_box = ui_build_box_from_stringf(UI_BoxFlag_DrawBackground| - UI_BoxFlag_DrawText| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawHotEffects| - UI_BoxFlag_DrawActiveEffects| - UI_BoxFlag_Clickable| - UI_BoxFlag_DisableTextTrunc, - "%S##add_new_tab_button_%p", - rd_icon_kind_text_table[RD_IconKind_Add], - panel); - UI_Signal sig = ui_signal_from_box(add_new_box); - if(ui_clicked(sig)) + F32 distance = abs_f32(drop_sites[drop_site_idx].p - mouse.x); + if(drop_site_idx == 0 || distance < min_distance) { - rd_cmd(RD_CmdKind_FocusPanel); - UI_Key view_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_view_menu_key_")); - ui_ctx_menu_open(view_menu_key, add_new_box->key, v2f32(0, tab_bar_vheight)); + active_drop_site = &drop_sites[drop_site_idx]; + min_distance = distance; } } } - scratch_end(scratch); - } - - // rjf: interact with tab bar - ui_signal_from_box(tab_bar_box); - - // rjf: fill out last drop site - { - drop_sites[drop_site_count-1].p = drop_site_max_p; - drop_sites[drop_site_count-1].prev_view = rd_cfg_list_last(&panel->tabs); - } - - // rjf: more precise drop-sites on tab bar - { - Vec2F32 mouse = ui_mouse(); - RD_Cfg *drag_tab = rd_cfg_from_handle(rd_state->drag_drop_regs->view); - if(rd_drag_is_active() && rd_state->drag_drop_regs_slot == RD_RegSlot_View && window_is_focused && contains_2f32(panel_rect, mouse) && drag_tab != &rd_nil_cfg) + // rjf: store closest prev-view + if(active_drop_site != 0) { - // rjf: mouse => hovered drop site - F32 min_distance = 0; - DropSite *active_drop_site = 0; - if(catchall_drop_site_hovered) + rd_last_drag_drop_prev_tab = rd_handle_from_cfg(active_drop_site->prev_view); + } + else + { + rd_last_drag_drop_prev_tab = rd_handle_zero(); + } + + // rjf: vis + if(drag_tab != &rd_nil_cfg && active_drop_site != 0) + { + RD_Palette(RD_PaletteCode_DropSiteOverlay) UI_Rect(tab_bar_rect) + ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); + } + + // rjf: drop + if(catchall_drop_site_hovered && (active_drop_site != 0 && rd_drag_drop())) + { + RD_Cfg *drag_view = rd_cfg_from_handle(rd_state->drag_drop_regs->view); + RD_Cfg *src_panel = rd_cfg_from_handle(rd_state->drag_drop_regs->panel); + RD_Cfg *dst_panel = panel->cfg; + if(dst_panel != &rd_nil_cfg && drag_view != &rd_nil_cfg) { - for(U64 drop_site_idx = 0; drop_site_idx < drop_site_count; drop_site_idx += 1) - { - F32 distance = abs_f32(drop_sites[drop_site_idx].p - mouse.x); - if(drop_site_idx == 0 || distance < min_distance) - { - active_drop_site = &drop_sites[drop_site_idx]; - min_distance = distance; - } - } - } - - // rjf: store closest prev-view - if(active_drop_site != 0) - { - rd_last_drag_drop_prev_tab = rd_handle_from_cfg(active_drop_site->prev_view); - } - else - { - rd_last_drag_drop_prev_tab = rd_handle_zero(); - } - - // rjf: vis - if(drag_tab != &rd_nil_cfg && active_drop_site != 0) - { - RD_Palette(RD_PaletteCode_DropSiteOverlay) UI_Rect(tab_bar_rect) - ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero()); - } - - // rjf: drop - if(catchall_drop_site_hovered && (active_drop_site != 0 && rd_drag_drop())) - { - RD_Cfg *drag_view = rd_cfg_from_handle(rd_state->drag_drop_regs->view); - RD_Cfg *src_panel = rd_cfg_from_handle(rd_state->drag_drop_regs->panel); - RD_Cfg *dst_panel = panel->cfg; - if(dst_panel != &rd_nil_cfg && drag_view != &rd_nil_cfg) - { - rd_cmd(RD_CmdKind_MoveTab, - .panel = rd_handle_from_cfg(src_panel), - .dst_panel = rd_handle_from_cfg(dst_panel), - .view = rd_handle_from_cfg(drag_view), - .prev_view = rd_handle_from_cfg(active_drop_site->prev_view)); - } + rd_cmd(RD_CmdKind_MoveTab, + .panel = rd_handle_from_cfg(src_panel), + .dst_panel = rd_handle_from_cfg(dst_panel), + .view = rd_handle_from_cfg(drag_view), + .prev_view = rd_handle_from_cfg(active_drop_site->prev_view)); } } } @@ -10111,6 +10128,48 @@ rd_font_from_slot(RD_FontSlot slot) internal F32 rd_font_size_from_slot(RD_FontSlot slot) { + B32 explicit_config_found = 0; + F32 result = 11.f; + + // rjf: determine config key based on slot + String8 key = {0}; + switch(slot) + { + default:{}break; + case RD_FontSlot_Icons: + case RD_FontSlot_Main:{key = str8_lit("main_font_size");}break; + case RD_FontSlot_Code:{key = str8_lit("code_font_size");}break; + } + + // rjf: find most-granular config scope to begin looking for the setting + RD_Cfg *start_cfg = rd_cfg_from_handle(rd_regs()->view); + if(start_cfg == &rd_nil_cfg) { start_cfg = rd_cfg_from_handle(rd_regs()->panel); } + if(start_cfg == &rd_nil_cfg) { start_cfg = rd_cfg_from_handle(rd_regs()->window); } + + // rjf: scan upwards the config tree until we find the setting + for(RD_Cfg *parent = start_cfg; parent != &rd_nil_cfg; parent = parent->parent) + { + RD_Cfg *child = rd_cfg_child_from_string(parent, key); + if(child != &rd_nil_cfg) + { + result = (F32)f64_from_str8(child->first->string); + explicit_config_found = 1; + break; + } + } + + // rjf: if we haven't found any explicit config, then use the window's monitor's DPI + // based on some default size. + if(explicit_config_found == 0) + { + RD_Cfg *window_cfg = rd_cfg_from_handle(rd_regs()->window); + RD_WindowState *ws = rd_window_state_from_cfg(window_cfg); + F32 dpi = os_dpi_from_window(ws->os); + result *= (dpi / 96.f); + } + return result; + +#if 0 // TODO(rjf): @cfg F32 result = 0; RD_Cfg *wcfg = rd_cfg_from_handle(rd_regs()->window); RD_WindowState *ws = rd_window_state_from_cfg(wcfg); @@ -10146,6 +10205,7 @@ rd_font_size_from_slot(RD_FontSlot slot) }break; } return result; +#endif } internal FNT_RasterFlags @@ -11247,6 +11307,19 @@ rd_init(CmdLine *cmdln) RD_Cfg *transient = rd_cfg_new(rd_state->root_cfg, str8_lit("transient")); } + // rjf: set up window cache + { + rd_state->window_state_slots_count = 64; + rd_state->window_state_slots = push_array(arena, RD_WindowStateSlot, rd_state->window_state_slots_count); + rd_state->first_window_state = rd_state->last_window_state = &rd_nil_window_state; + } + + // rjf: set up view cache + { + rd_state->view_state_slots_count = 4096; + rd_state->view_state_slots = push_array(arena, RD_ViewStateSlot, rd_state->view_state_slots_count); + } + // rjf: set up user / project paths { Temp scratch = scratch_begin(0, 0); @@ -11452,7 +11525,7 @@ rd_frame(void) for(RD_WindowState *ws = rd_state->window_state_slots[slot_idx].first, *next; ws != 0; ws = next) { next = ws->hash_next; - if(ws->last_frame_index_touched+1 < rd_state->frame_index) + if(ws->last_frame_index_touched+2 < rd_state->frame_index) { ui_state_release(ws->ui); r_window_unequip(ws->os, ws->r); @@ -11463,7 +11536,7 @@ rd_frame(void) arena_release(ws->hover_eval_arena); arena_release(ws->autocomp_lister_params_arena); arena_release(ws->arena); - DLLRemove_NP(rd_state->first_window_state, rd_state->last_window_state, ws, order_next, order_prev); + DLLRemove_NPZ(&rd_nil_window_state, rd_state->first_window_state, rd_state->last_window_state, ws, order_next, order_prev); DLLRemove_NP(rd_state->window_state_slots[slot_idx].first, rd_state->window_state_slots[slot_idx].last, ws, hash_next, hash_prev); SLLStackPush_N(rd_state->free_window_state, ws, order_next); } @@ -11481,13 +11554,14 @@ rd_frame(void) for(RD_ViewState *vs = rd_state->view_state_slots[slot_idx].first, *next; vs != 0; vs = next) { next = vs->hash_next; - if(vs->last_frame_index_touched+1 < rd_state->frame_index) + if(vs->last_frame_index_touched+2 < rd_state->frame_index) { for(RD_ArenaExt *ext = vs->first_arena_ext; ext != 0; ext = ext->next) { arena_release(ext->arena); } arena_release(vs->arena); + SLLStackPush_N(rd_state->free_view_state, vs, hash_next); } } } @@ -12068,7 +12142,6 @@ rd_frame(void) //////////////////////////// //- rjf: process top-level graphical commands // - B32 panel_reset_done = 0; if(depth == 0) { for(;rd_next_cmd(&cmd);) RD_RegsScope() @@ -14064,7 +14137,200 @@ rd_frame(void) case RD_CmdKind_ResetToDefaultPanels: case RD_CmdKind_ResetToCompactPanels: { - panel_reset_done = 1; + RD_Cfg *window = rd_cfg_from_handle(rd_regs()->window); + RD_Cfg *panels = rd_cfg_child_from_string(window, str8_lit("panels")); + RD_PanelTree panel_tree = rd_panel_tree_from_cfg(scratch.arena, window); + + //- rjf: define all of the "fixed" tabs we care about +#define FixedTab_XList \ +X(watch)\ +X(locals)\ +X(regs)\ +X(globals)\ +X(tlocals)\ +X(types)\ +X(procs)\ +X(call_stack)\ +X(breakpoints)\ +X(watch_pins)\ +X(output)\ +X(targets)\ +X(scheduler)\ +X(modules)\ +X(disasm)\ +X(memory)\ +X(getting_started) +#define X(name) RD_Cfg *name = &rd_nil_cfg; + FixedTab_XList +#undef X + + //- rjf: find all the fixed tabs, and all text viewers + RD_CfgList texts = {0}; + for(RD_PanelNode *panel = panel_tree.root; + panel != &rd_nil_panel_node; + panel = rd_panel_node_rec__depth_first_pre(panel_tree.root, panel).next) + { + for(RD_CfgNode *n = panel->tabs.first; n != 0; n = n->next) + { + RD_Cfg *tab = n->v; + B32 need_unhook = 1; + if(0){} +#define X(name) else if(str8_match(tab->string, str8_lit(#name), 0)) {name = tab;} + FixedTab_XList +#undef X + else if(str8_match(tab->string, str8_lit("text"), 0)) {rd_cfg_list_push(scratch.arena, &texts, tab);} + else + { + need_unhook = 0; + } + if(need_unhook) + { + rd_cfg_unhook(panel->cfg, tab); + } + } + } + + //- rjf: release the old panel tree + rd_cfg_release(panels); + + //- rjf: allocate any missing tabs +#define X(name) if(name == &rd_nil_cfg) {name = rd_cfg_alloc(); rd_cfg_equip_string(name, str8_lit(#name));} + FixedTab_XList +#undef X + + //- rjf: eliminate all tab selections +#define X(name) if(name != &rd_nil_cfg) {rd_cfg_release(rd_cfg_child_from_string(name, str8_lit("selected")));} + FixedTab_XList +#undef X + for(RD_CfgNode *n = texts.first; n != 0; n = n->next) + { + rd_cfg_release(rd_cfg_child_from_string(n->v, str8_lit("selected"))); + } + + //- rjf: create the panel root + panels = rd_cfg_new(window, str8_lit("panels")); + + //- rjf: rebuild the new panel tree + switch(kind) + { + default:{}break; + + //- rjf: (default layout) + case RD_CmdKind_ResetToDefaultPanels: + { + // rjf: root split + rd_cfg_child_from_string_or_alloc(window, str8_lit("split_x")); + RD_Cfg *root_0 = rd_cfg_new(panels, str8_lit("0.85")); + RD_Cfg *root_1 = rd_cfg_new(panels, str8_lit("0.15")); + + // rjf: root_0 split + RD_Cfg *root_0_0 = rd_cfg_new(root_0, str8_lit("0.80")); + RD_Cfg *root_0_1 = rd_cfg_new(root_0, str8_lit("0.20")); + + // rjf: root_1 split + RD_Cfg *root_1_0 = rd_cfg_new(root_1, str8_lit("0.50")); + RD_Cfg *root_1_1 = rd_cfg_new(root_1, str8_lit("0.50")); + rd_cfg_insert_child(root_1_0, root_1_0->last, targets); + rd_cfg_insert_child(root_1_1, root_1_1->last, scheduler); + rd_cfg_new(targets, str8_lit("selected")); + rd_cfg_new(scheduler, str8_lit("selected")); + + // rjf: root 0_0 split + RD_Cfg *root_0_0_0 = rd_cfg_new(root_0_0, str8_lit("0.25")); + RD_Cfg *root_0_0_1 = rd_cfg_new(root_0_0, str8_lit("0.75")); + + // rjf: root_0_0_0 split + RD_Cfg *root_0_0_0_0 = rd_cfg_new(root_0_0_0, str8_lit("0.50")); + RD_Cfg *root_0_0_0_1 = rd_cfg_new(root_0_0_0, str8_lit("0.50")); + rd_cfg_insert_child(root_0_0_0_0, root_0_0_0_0->last, disasm); + rd_cfg_new(disasm, str8_lit("selected")); + + // rjf: root_0_1 split + RD_Cfg *root_0_1_0 = rd_cfg_new(root_0_1, str8_lit("0.60")); + RD_Cfg *root_0_1_1 = rd_cfg_new(root_0_1, str8_lit("0.40")); + rd_cfg_insert_child(root_0_1_0, root_0_1_0->last, watch); + rd_cfg_insert_child(root_0_1_0, root_0_1_0->last, locals); + rd_cfg_insert_child(root_0_1_0, root_0_1_0->last, regs); + rd_cfg_insert_child(root_0_1_0, root_0_1_0->last, globals); + rd_cfg_insert_child(root_0_1_0, root_0_1_0->last, tlocals); + rd_cfg_insert_child(root_0_1_0, root_0_1_0->last, types); + rd_cfg_insert_child(root_0_1_0, root_0_1_0->last, procs); + rd_cfg_new(watch, str8_lit("selected")); + rd_cfg_new(root_0_1_0, str8_lit("tabs_on_bottom")); + rd_cfg_insert_child(root_0_1_1, root_0_1_1->last, call_stack); + rd_cfg_insert_child(root_0_1_1, root_0_1_1->last, modules); + rd_cfg_new(call_stack, str8_lit("selected")); + rd_cfg_new(root_0_1_1, str8_lit("tabs_on_bottom")); + + // rjf: fill main panel with getting started, OR all collected code views + RD_Cfg *main_panel = root_0_0_1; + if(getting_started != &rd_nil_cfg) + { + rd_cfg_insert_child(main_panel, main_panel->last, getting_started); + rd_cfg_new(getting_started, str8_lit("selected")); + } + else if(texts.first) + { + rd_cfg_new(texts.first->v, str8_lit("selected")); + } + for(RD_CfgNode *n = texts.first; n != 0; n = n->next) + { + rd_cfg_insert_child(main_panel, main_panel->last, n->v); + } + + // rjf: set main panel as selected + rd_cfg_new(main_panel, str8_lit("selected")); + }break; + + //- rjf: (compact layout) + case RD_CmdKind_ResetToCompactPanels: + { + // rjf: root split + rd_cfg_child_from_string_or_alloc(window, str8_lit("split_x")); + RD_Cfg *root_0 = rd_cfg_new(panels, str8_lit("0.25")); + RD_Cfg *root_1 = rd_cfg_new(panels, str8_lit("0.75")); + + // rjf: root_0 split + RD_Cfg *root_0_0 = rd_cfg_new(root_0, str8_lit("0.25")); + RD_Cfg *root_0_1 = rd_cfg_new(root_0, str8_lit("0.25")); + RD_Cfg *root_0_2 = rd_cfg_new(root_0, str8_lit("0.25")); + RD_Cfg *root_0_3 = rd_cfg_new(root_0, str8_lit("0.25")); + rd_cfg_insert_child(root_0_0, root_0_0->last, watch); + rd_cfg_insert_child(root_0_0, root_0_0->last, types); + rd_cfg_new(watch, str8_lit("selected")); + rd_cfg_insert_child(root_0_1, root_0_1->last, scheduler); + rd_cfg_insert_child(root_0_1, root_0_1->last, targets); + rd_cfg_insert_child(root_0_1, root_0_1->last, breakpoints); + rd_cfg_insert_child(root_0_1, root_0_1->last, watch_pins); + rd_cfg_new(scheduler, str8_lit("selected")); + rd_cfg_insert_child(root_0_2, root_0_2->last, disasm); + rd_cfg_insert_child(root_0_2, root_0_2->last, output); + rd_cfg_new(disasm, str8_lit("selected")); + rd_cfg_insert_child(root_0_3, root_0_3->last, call_stack); + rd_cfg_insert_child(root_0_3, root_0_3->last, modules); + rd_cfg_new(call_stack, str8_lit("selected")); + + // rjf: fill main panel with getting started, OR all collected code views + RD_Cfg *main_panel = root_1; + if(getting_started != &rd_nil_cfg) + { + rd_cfg_insert_child(main_panel, main_panel->last, getting_started); + rd_cfg_new(getting_started, str8_lit("selected")); + } + else if(texts.first) + { + rd_cfg_new(texts.first->v, str8_lit("selected")); + } + for(RD_CfgNode *n = texts.first; n != 0; n = n->next) + { + rd_cfg_insert_child(main_panel, main_panel->last, n->v); + } + + // rjf: set main panel as selected + rd_cfg_new(main_panel, str8_lit("selected")); + }break; + } + #if 0 // TODO(rjf): @cfg RD_Window *ws = rd_window_from_handle(rd_regs()->window); @@ -16639,26 +16905,24 @@ rd_frame(void) // { dr_begin_frame(); - for EachIndex(slot_idx, rd_state->window_state_slots_count) + RD_CfgList windows = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("window")); + for(RD_CfgNode *n = windows.first; n != 0; n = n->next) { - for(RD_WindowState *w = rd_state->first_window_state; - w != &rd_nil_window_state; - w = w->order_next) + RD_Cfg *window = n->v; + RD_WindowState *w = rd_window_state_from_cfg(window); + B32 window_is_focused = os_window_is_focused(w->os); + if(window_is_focused) { - B32 window_is_focused = os_window_is_focused(w->os); - if(window_is_focused) - { - rd_state->last_focused_window = w->cfg_handle; - } - rd_push_regs(); - rd_regs()->window = w->cfg_handle; - rd_window_frame(); - MemoryZeroStruct(&w->ui_events); - RD_Regs *window_regs = rd_pop_regs(); - if(rd_handle_match(rd_state->last_focused_window, w->cfg_handle)) - { - MemoryCopyStruct(rd_regs(), window_regs); - } + rd_state->last_focused_window = w->cfg_handle; + } + rd_push_regs(); + rd_regs()->window = w->cfg_handle; + rd_window_frame(); + MemoryZeroStruct(&w->ui_events); + RD_Regs *window_regs = rd_pop_regs(); + if(rd_handle_match(rd_state->last_focused_window, w->cfg_handle)) + { + MemoryCopyStruct(rd_regs(), window_regs); } } } diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index e5b1b96e..8817e572 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -933,6 +933,7 @@ read_only global RD_PanelNode rd_nil_panel_node = &rd_nil_panel_node, 0, &rd_nil_cfg, + .selected_tab = &rd_nil_cfg, }; read_only global RD_Entity rd_nil_entity = diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index f0f97e8a..52e6df14 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -750,29 +750,32 @@ entry_point(CmdLine *cmd_line) if(msg.size != 0) { log_infof("ipc_msg: \"%S\"", msg); - RD_Window *dst_window = rd_state->first_window; - for(RD_Window *window = dst_window; window != 0; window = window->next) + RD_WindowState *dst_ws = rd_state->first_window_state; + for(RD_WindowState *ws = dst_ws; ws != &rd_nil_window_state; ws = ws->order_next) { - if(os_window_is_focused(window->os)) + if(os_window_is_focused(ws->os)) { - dst_window = window; + dst_ws = ws; break; } } - if(dst_window != 0) + if(dst_ws != &rd_nil_window_state) { - dst_window->window_temporarily_focused_ipc = 1; + dst_ws->window_temporarily_focused_ipc = 1; U64 first_space_pos = str8_find_needle(msg, 0, str8_lit(" "), 0); String8 cmd_kind_name_string = str8_prefix(msg, first_space_pos); String8 cmd_args_string = str8_skip_chop_whitespace(str8_skip(msg, first_space_pos)); RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_kind_name_string); if(cmd_kind_info != &rd_nil_cmd_kind_info) RD_RegsScope() { - if(dst_window != rd_window_from_handle(rd_regs()->window)) + if(!rd_handle_match(dst_ws->cfg_handle, rd_regs()->window)) { - rd_regs()->window = rd_handle_from_window(dst_window); - rd_regs()->panel = rd_handle_from_panel(dst_window->focused_panel); - rd_regs()->view = dst_window->focused_panel->selected_tab_view; + Temp scratch = scratch_begin(0, 0); + RD_PanelTree panel_tree = rd_panel_tree_from_cfg(scratch.arena, rd_cfg_from_handle(dst_ws->cfg_handle)); + rd_regs()->window = dst_ws->cfg_handle; + rd_regs()->panel = rd_handle_from_cfg(panel_tree.focused->cfg); + rd_regs()->view = rd_handle_from_cfg(panel_tree.focused->selected_tab); + scratch_end(scratch); } rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, cmd_args_string); rd_push_cmd(cmd_kind_name_string, rd_regs()); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 0f5d5cd6..d73009e8 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -5106,9 +5106,11 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(ctrl_entity_lister) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); +#if 0 // TODO(rjf): @cfg RD_Window *window = rd_window_from_handle(rd_regs()->window); RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(window->query_cmd_name); - CTRL_EntityKind entity_kind = cmd_kind_info->query.ctrl_entity_kind; +#endif + CTRL_EntityKind entity_kind = CTRL_EntityKind_Null; // cmd_kind_info->query.ctrl_entity_kind; F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); F32 scroll_bar_dim = floor_f32(ui_top_font_size()*1.5f); @@ -5779,6 +5781,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(pending_file) } //- rjf: if file is ready, move params tree to scratch for new command +#if 0 // TODO(rjf): @cfg MD_Node *params_copy = &md_nil_node; if(file_is_ready) { @@ -5793,6 +5796,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(pending_file) RD_View *view = rd_view_from_handle(rd_regs()->view); rd_view_equip_spec(view, view_rule_info, query, params_copy); } +#endif //- rjf: if entity is ready, but we have no viewer for it, then just close this tab if(file_is_ready && viewer_kind == RD_ViewRuleKind_Null) @@ -5870,18 +5874,20 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(text) rd_regs()->file_path = path; rd_regs()->vaddr = 0; rd_regs()->prefer_disasm = 0; +#if 0 // TODO(rjf): @cfg rd_regs()->cursor.line = rd_value_from_params_key(params, str8_lit("cursor_line")).s64; rd_regs()->cursor.column = rd_value_from_params_key(params, str8_lit("cursor_column")).s64; rd_regs()->mark.line = rd_value_from_params_key(params, str8_lit("mark_line")).s64; rd_regs()->mark.column = rd_value_from_params_key(params, str8_lit("mark_column")).s64; +#endif if(rd_regs()->cursor.line == 0) { rd_regs()->cursor.line = 1; } if(rd_regs()->cursor.column == 0) { rd_regs()->cursor.column = 1; } if(rd_regs()->mark.line == 0) { rd_regs()->mark.line = 1; } if(rd_regs()->mark.column == 0) { rd_regs()->mark.column = 1; } E_Eval eval = e_eval_from_string(scratch.arena, string); - Rng1U64 range = rd_range_from_eval_params(eval, params); + Rng1U64 range = {0}; // TODO(rjf): @cfg rd_range_from_eval_params(eval, params); rd_regs()->text_key = rd_key_from_eval_space_range(eval.space, range, 1); - rd_regs()->lang_kind = rd_lang_kind_from_eval_params(eval, params); + rd_regs()->lang_kind = TXT_LangKind_Null; // TODO(rjf): @cfg rd_lang_kind_from_eval_params(eval, params); U128 hash = {0}; TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, rd_regs()->text_key, rd_regs()->lang_kind, &hash); String8 data = hs_data_from_hash(hs_scope, hash); @@ -6151,8 +6157,8 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(disasm) { space = auto_space; } - Rng1U64 range = rd_range_from_eval_params(eval, params); - Arch arch = rd_arch_from_eval_params(eval, params); + Rng1U64 range = {0}; // TODO(rjf): @cfg rd_range_from_eval_params(eval, params); + Arch arch = Arch_Null; // TODO(rjf): @cfg rd_arch_from_eval_params(eval, params); CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(space); CTRL_Entity *dasm_module = &ctrl_entity_nil; DI_Key dbgi_key = {0}; @@ -6301,10 +6307,12 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(output) // rd_regs()->file_path = str8_zero(); rd_regs()->vaddr = 0; +#if 0 // TODO(rjf): @cfg rd_regs()->cursor.line = rd_value_from_params_key(params, str8_lit("cursor_line")).s64; rd_regs()->cursor.column = rd_value_from_params_key(params, str8_lit("cursor_column")).s64; rd_regs()->mark.line = rd_value_from_params_key(params, str8_lit("mark_line")).s64; rd_regs()->mark.column = rd_value_from_params_key(params, str8_lit("mark_column")).s64; +#endif ////////////////////////////// //- rjf: unpack text info @@ -6400,7 +6408,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(memory) //- rjf: unpack parameterization info // E_Eval eval = e_eval_from_string(scratch.arena, string); - Rng1U64 space_range = rd_range_from_eval_params(eval, params); + Rng1U64 space_range = {0}; // TODO(rjf): @cfg rd_range_from_eval_params(eval, params); if(eval.space.kind == 0) { eval.space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->process), RD_EvalSpaceKind_CtrlEntity); @@ -6410,10 +6418,10 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(memory) space_range = r1u64(0, 0x7FFFFFFFFFFFull); } } - U64 cursor = rd_value_from_params_key(params, str8_lit("cursor_vaddr")).u64; - U64 mark = rd_value_from_params_key(params, str8_lit("mark_vaddr")).u64; - U64 bytes_per_cell = rd_value_from_params_key(params, str8_lit("bytes_per_cell")).u64; - U64 num_columns = rd_value_from_params_key(params, str8_lit("num_columns")).u64; + U64 cursor = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("cursor_vaddr")).u64; + U64 mark = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("mark_vaddr")).u64; + U64 bytes_per_cell = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("bytes_per_cell")).u64; + U64 num_columns = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("num_columns")).u64; if(num_columns == 0) { num_columns = 16; @@ -7326,8 +7334,8 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(bitmap) //- rjf: evaluate expression // E_Eval eval = e_eval_from_string(scratch.arena, string); - Vec2S32 dim = rd_dim2s32_from_eval_params(eval, params); - R_Tex2DFormat fmt = rd_tex2dformat_from_eval_params(eval, params); + Vec2S32 dim = {0}; // TODO(rjf): @cfg rd_dim2s32_from_eval_params(eval, params); + R_Tex2DFormat fmt = R_Tex2DFormat_RGBA8; // TODO(rjf): @cfg rd_tex2dformat_from_eval_params(eval, params); U64 base_offset = rd_base_offset_from_eval(eval); U64 expected_size = dim.x*dim.y*r_tex2d_format_bytes_per_pixel_table[fmt]; Rng1U64 offset_range = r1u64(base_offset, base_offset + expected_size); @@ -7335,11 +7343,11 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(bitmap) ////////////////////////////// //- rjf: unpack params // - F32 zoom = rd_value_from_params_key(params, str8_lit("zoom")).f32; + F32 zoom = 1.f; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("zoom")).f32; Vec2F32 view_center_pos = { - rd_value_from_params_key(params, str8_lit("x")).f32, - rd_value_from_params_key(params, str8_lit("y")).f32, + 0.f, // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("x")).f32, + 0.f, // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("y")).f32, }; if(zoom == 0) { @@ -7570,7 +7578,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(color_rgba) Vec2F32 dim = dim_2f32(rect); F32 padding = ui_top_font_size()*3.f; E_Eval eval = e_eval_from_string(scratch.arena, string); - Vec4F32 rgba = rd_rgba_from_eval_params(eval, params); + Vec4F32 rgba = {0}; // TODO(rjf): @cfg rd_rgba_from_eval_params(eval, params); Vec4F32 hsva = hsva_from_rgba(rgba); //- rjf: too small -> just show components @@ -7734,12 +7742,12 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(geo3d) ////////////////////////////// //- rjf: unpack parameters // - U64 count = rd_value_from_params_key(params, str8_lit("count")).u64; - U64 vtx_base_off = rd_value_from_params_key(params, str8_lit("vtx")).u64; - U64 vtx_size = rd_value_from_params_key(params, str8_lit("vtx_size")).u64; - F32 yaw_target = rd_value_from_params_key(params, str8_lit("yaw")).f32; - F32 pitch_target = rd_value_from_params_key(params, str8_lit("pitch")).f32; - F32 zoom_target = rd_value_from_params_key(params, str8_lit("zoom")).f32; + U64 count = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("count")).u64; + U64 vtx_base_off = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("vtx")).u64; + U64 vtx_size = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("vtx_size")).u64; + F32 yaw_target = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("yaw")).f32; + F32 pitch_target = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("pitch")).f32; + F32 zoom_target = 0; // TODO(rjf): @cfg rd_value_from_params_key(params, str8_lit("zoom")).f32; ////////////////////////////// //- rjf: evaluate & unpack expression @@ -8056,7 +8064,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(settings) Temp scratch = scratch_begin(0, 0); F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); String8 query = string; - RD_Window *window = rd_window_from_handle(rd_regs()->window); + RD_Cfg *window = rd_cfg_from_handle(rd_regs()->window); UI_ScrollPt2 scroll_pos = rd_view_scroll_pos(); ////////////////////////////// @@ -8520,7 +8528,10 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(settings) { rgba = rd_rgba_from_theme_color(item->color); }break; - case RD_SettingsItemKind_WindowSetting: {val_table = &window->setting_vals[0];}goto setting; + case RD_SettingsItemKind_WindowSetting: + { + // TODO(rjf): @cfg val_table = &window->setting_vals[0]; + }goto setting; case RD_SettingsItemKind_GlobalSetting:{}goto setting; setting:; {