From 3631de648b01e738e65041cc3bdd2cf8e086d81e Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Sat, 7 Sep 2024 13:37:35 -0700 Subject: [PATCH] checkpoint --- project.4coder | 2 +- src/dbg_engine/dbg_engine_core.c | 42 +- src/dbg_engine/dbg_engine_core.h | 12 + src/dbg_frontend/dbg_frontend.mdesk | 13 +- src/dbg_frontend/dbg_frontend_core.c | 1035 +++++++++++------ src/dbg_frontend/dbg_frontend_core.h | 115 +- src/dbg_frontend/dbg_frontend_views.c | 415 ++++--- src/dbg_frontend/dbg_frontend_views.h | 24 + src/dbg_frontend/dbg_frontend_widgets.c | 225 +++- src/dbg_frontend/dbg_frontend_widgets.h | 8 +- .../generated/dbg_frontend.meta.c | 5 +- .../generated/dbg_frontend.meta.h | 5 +- src/eval/eval_bundles.c | 21 + src/eval/eval_bundles.h | 1 + src/mdesk/mdesk.c | 31 +- src/mdesk/mdesk.h | 26 +- src/raddbg/raddbg_main.c | 53 +- 17 files changed, 1362 insertions(+), 671 deletions(-) diff --git a/project.4coder b/project.4coder index b93c01d4..7ad1d001 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 --auto_run && popd", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index 5d4de4ad..20013d90 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -1660,6 +1660,8 @@ d_entity_equip_param(D_Entity *entity, String8 key, String8 value) //- rjf: opening folders/files & maintaining the entity model of the filesystem +#if 0 // TODO(rjf): @msgs + internal D_Entity * d_entity_from_path(String8 path, D_EntityFromPathFlags flags) { @@ -1789,11 +1791,14 @@ d_entity_from_path(String8 path, D_EntityFromPathFlags flags) return result; } +#endif + //- rjf: file path map override lookups internal String8List d_possible_overrides_from_file_path(Arena *arena, String8 file_path) { +#if 0 // TODO(rjf): @msgs // NOTE(rjf): This path, given some target file path, scans all file path map // overrides, and collects the set of file paths which could've redirected // to the target file path given the set of file path maps. @@ -1862,10 +1867,15 @@ d_possible_overrides_from_file_path(Arena *arena, String8 file_path) } scratch_end(scratch); return result; +#endif + String8List result = {0}; + return result; } //- rjf: top-level state queries +#if 0 // TODO(rjf): @msgs + internal D_Entity * d_entity_root(void) { @@ -2007,6 +2017,8 @@ d_entity_from_u64_and_kind(U64 u64, D_EntityKind kind) return result; } +#endif + //- rjf: entity freezing state internal void @@ -2631,6 +2643,7 @@ d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread) //////////////////////////////// //~ rjf: Modules & Debug Info Mappings +#if 0 // TODO(rjf): @msgs //- rjf: module <=> debug info keys internal DI_Key @@ -2702,6 +2715,7 @@ d_vaddr_range_from_voff_range(D_Entity *module, Rng1U64 voff_rng) vaddr_rng.max = vaddr_rng.min + rng_size; return vaddr_rng; } +#endif //////////////////////////////// //~ rjf: Debug Info Lookups @@ -3339,6 +3353,7 @@ internal U128 d_hash_from_ctrl_param_state(void) { U128 result = {0}; +#if 0 // TODO(rjf): @msgs Temp scratch = scratch_begin(0, 0); { // rjf: build data strings of all param data @@ -3367,6 +3382,7 @@ d_hash_from_ctrl_param_state(void) blake2b((U8 *)&result.u64[0], sizeof(result), string.str, string.size, 0, 0); } scratch_end(scratch); +#endif return result; } @@ -3390,6 +3406,7 @@ internal void d_ctrl_run(D_RunKind run, CTRL_Entity *run_thread, CTRL_RunFlags flags, CTRL_TrapList *run_traps) { Temp scratch = scratch_begin(0, 0); +#if 0 // TODO(rjf): @msgs // rjf: compute hash of all run-parameterization entities, store { @@ -3491,6 +3508,7 @@ d_ctrl_run(D_RunKind run, CTRL_Entity *run_thread, CTRL_RunFlags flags, CTRL_Tra d_state->base_regs.v.unwind_count = 0; d_state->base_regs.v.inline_depth = 0; +#endif scratch_end(scratch); } @@ -5881,16 +5899,17 @@ internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena) { DI_KeyList dbgis = {0}; - D_EntityList modules = d_query_cached_entity_list_with_kind(D_EntityKind_Module); - for(D_EntityNode *n = modules.first; n != 0; n = n->next) + CTRL_EntityList modules = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module); + for(CTRL_EntityNode *n = modules.first; n != 0; n = n->next) { - D_Entity *module = n->entity; - DI_Key key = d_dbgi_key_from_module(module); + CTRL_Entity *module = n->v; + DI_Key key = ctrl_dbgi_key_from_module(module); di_key_list_push(arena, &dbgis, &key); } return dbgis; } +#if 0 // TODO(rjf): @msgs internal D_EntityList d_push_active_target_list(Arena *arena) { @@ -5905,9 +5924,11 @@ d_push_active_target_list(Arena *arena) } return active_targets; } +#endif //- rjf: expand key based entity queries +#if 0 // TODO(rjf): @msgs internal D_Entity * d_entity_from_expand_key_and_kind(D_ExpandKey key, D_EntityKind kind) { @@ -5924,6 +5945,7 @@ d_entity_from_expand_key_and_kind(D_ExpandKey key, D_EntityKind kind) } return result; } +#endif //- rjf: per-run caches @@ -6577,6 +6599,7 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) } // rjf: kill all entities which are marked to die on stop +#if 0 // TODO(rjf): @msgs { D_Entity *request = d_entity_from_id(event->msg_id); if(d_entity_is_nil(request)) @@ -6592,6 +6615,7 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) } } } +#endif }break; //- rjf: entity creation/deletion @@ -6749,6 +6773,7 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) } }break; +#if 0 // TODO(rjf): @msgs case CTRL_EventKind_EndProc: { U32 pid = event->entity_id; @@ -6768,9 +6793,11 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) D_Entity *module = d_entity_from_ctrl_handle(event->machine_id, event->entity); d_entity_mark_for_deletion(module); }break; +#endif //- rjf: debug info changes +#if 0 // TODO(rjf): @msgs case CTRL_EventKind_ModuleDebugInfoPathChange: { D_Entity *module = d_entity_from_ctrl_handle(event->machine_id, event->entity); @@ -6782,6 +6809,7 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) d_entity_equip_name(debug_info, event->string); d_entity_equip_timestamp(debug_info, event->timestamp); }break; +#endif //- rjf: debug strings @@ -6791,6 +6819,7 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) mtx_push_op(d_state->output_log_key, op); }break; +#if 0 // TODO(rjf): @msgs case CTRL_EventKind_ThreadName: { String8 string = event->string; @@ -6815,6 +6844,7 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) d_entity_equip_name(entity, string); } }break; +#endif //- rjf: memory @@ -6919,6 +6949,7 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) ProfScope("sync with di parsers") { Temp scratch = scratch_begin(&arena, 1); +#if 0 // TODO(rjf): @msgs DI_EventList events = di_p2u_pop_events(scratch.arena, 0); for(DI_EventNode *n = events.first; n != 0; n = n->next) { @@ -6941,6 +6972,7 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) }break; } } +#endif scratch_end(scratch); } @@ -9252,6 +9284,7 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) #endif //- rjf: add macros for all watches which define identifiers +#if 0 // TODO(rjf): @msgs D_EntityList watches = d_query_cached_entity_list_with_kind(D_EntityKind_Watch); for(D_EntityNode *n = watches.first; n != 0; n = n->next) { @@ -9264,6 +9297,7 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) e_push_leaf_ident_exprs_from_expr__in_place(arena, ctx->macro_map, parse.expr); } } +#endif } e_select_ir_ctx(ir_ctx); diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index 7f8ed2ed..8b103fda 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -1293,12 +1293,15 @@ internal void d_entity_equip_params(D_Entity *entity, MD_Node *params); internal void d_entity_equip_param(D_Entity *entity, String8 key, String8 value); //- rjf: opening folders/files & maintaining the entity model of the filesystem +#if 0 // TODO(rjf): @msgs internal D_Entity *d_entity_from_path(String8 path, D_EntityFromPathFlags flags); +#endif //- rjf: file path map override lookups internal String8List d_possible_overrides_from_file_path(Arena *arena, String8 file_path); //- rjf: top-level state queries +#if 0 // TODO(rjf): @msgs internal D_Entity *d_entity_root(void); internal D_EntityList d_push_entity_list_with_kind(Arena *arena, D_EntityKind kind); internal D_Entity *d_entity_from_id(D_EntityID id); @@ -1307,6 +1310,7 @@ internal D_Entity *d_entity_from_ctrl_handle(CTRL_MachineID machine_id, DMN_Hand internal D_Entity *d_entity_from_ctrl_id(CTRL_MachineID machine_id, U32 id); internal D_Entity *d_entity_from_name_and_kind(String8 string, D_EntityKind kind); internal D_Entity *d_entity_from_u64_and_kind(U64 u64, D_EntityKind kind); +#endif //- rjf: entity freezing state internal void d_set_thread_freeze_state(D_Entity *thread, B32 frozen); @@ -1337,6 +1341,7 @@ internal CTRL_TrapList d_trap_net_from_thread__step_into_line(Arena *arena, CTRL //////////////////////////////// //~ rjf: Modules & Debug Info Mappings +#if 0 // TODO(rjf): @msgs //- rjf: module <=> debug info keys internal DI_Key d_dbgi_key_from_module(D_Entity *module); internal D_EntityList d_modules_from_dbgi_key(Arena *arena, DI_Key *dbgi_key); @@ -1347,6 +1352,7 @@ internal U64 d_voff_from_vaddr(D_Entity *module, U64 vaddr); internal U64 d_vaddr_from_voff(D_Entity *module, U64 voff); internal Rng1U64 d_voff_range_from_vaddr_range(D_Entity *module, Rng1U64 vaddr_rng); internal Rng1U64 d_vaddr_range_from_voff_range(D_Entity *module, Rng1U64 voff_rng); +#endif //////////////////////////////// //~ rjf: Debug Info Lookups @@ -1551,14 +1557,20 @@ internal void d_cfg_push_write_string(D_CfgSrc src, String8 string); internal String8 d_current_path(void); //- rjf: entity kind cache +#if 0 // TODO(rjf): @msgs internal D_EntityList d_query_cached_entity_list_with_kind(D_EntityKind kind); +#endif //- rjf: active entity based queries internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena); +#if 0 // TODO(rjf): @msgs internal D_EntityList d_push_active_target_list(Arena *arena); +#endif //- rjf: expand key based entity queries +#if 0 // TODO(rjf): @msgs internal D_Entity *d_entity_from_expand_key_and_kind(D_ExpandKey key, D_EntityKind kind); +#endif //- rjf: per-run caches internal CTRL_Unwind d_query_cached_unwind_from_thread(CTRL_Entity *thread); diff --git a/src/dbg_frontend/dbg_frontend.mdesk b/src/dbg_frontend/dbg_frontend.mdesk index 22f574f9..bb023b68 100644 --- a/src/dbg_frontend/dbg_frontend.mdesk +++ b/src/dbg_frontend/dbg_frontend.mdesk @@ -78,10 +78,11 @@ DF_MsgKindTable: //- rjf: meta {Exit "" exit 0 0 Null Nil 0 0 0 0 0 0 Null ""} {RunCommand "" run_command 0 0 Null Nil 0 0 0 0 0 0 Null ""} + {SetCurrentPath "" run_command 0 0 Null Nil 0 0 0 0 0 0 Null ""} {ToggleDevMenu "" toggle_dev_menu 0 0 Null Nil 0 0 0 0 0 0 Null ""} {RegisterAsJITDebugger "Register As JIT Debugger" register_as_jit_debugger 0 0 Null Nil 0 0 0 0 0 0 Null ""} - {LogMarker "Log Marker" log_marker 0 0 Null Nil 0 0 0 0 0 0 Null ""} - + {LogMarker "Log Marker" log_marker 0 0 Null Nil 0 0 0 0 0 0 Null ""} + //- rjf: config reading/writing {LoadUser "" load_user 0 0 Null Nil 0 0 0 0 0 0 Null ""} {LoadProject "" load_project 0 0 Null Nil 0 0 0 0 0 0 Null ""} @@ -124,7 +125,10 @@ DF_MsgKindTable: {ToggleBreakpointAtCursor "Toggle Breakpoint At Cursor" toggle_breakpoint_at_cursor 0 0 Null Nil 0 0 0 0 0 0 Null ""} {ToggleWatchPinAtCursor "Toggle Watch Pin At Cursor" toggle_watch_pin_at_cursor 0 0 Null Nil 0 0 0 0 0 0 Null ""} {ToggleWatchExpressionAtCursor "Toggle Watch Expression At Cursor" toggle_watch_expression_at_cursor 0 0 Null Nil 0 0 0 0 0 0 Null ""} - + + //- rjf: at-mouse operations + {ToggleWatchExpressionAtMouse "Toggle Watch Expression At Mouse" toggle_watch_expression_at_mouse 0 0 Null Nil 0 0 0 0 0 0 Null ""} + //- rjf: windows {OpenWindow "" open_window 0 0 Null Nil 0 0 0 0 0 0 Null ""} {CloseWindow "" close_window 0 0 Null Nil 0 0 0 0 0 0 Null ""} @@ -193,7 +197,8 @@ DF_MsgKindTable: {TabBarBottom "" tab_bar_bottom 0 0 Null Nil 0 0 0 0 0 0 Null ""} //- rjf: tab filters - {Filter "" filter 0 0 Null Nil 0 0 0 0 0 0 Null ""} + {Filter "" filter 0 0 Null Nil 0 0 0 0 0 0 Null ""} + {SetFilter "" set_filter 0 0 Null Nil 0 0 0 0 0 0 Null ""} {ClearFilter "" clear_filter 0 0 Null Nil 0 0 0 0 0 0 Null ""} {ApplyFilter "" apply_filter 0 0 Null Nil 0 0 0 0 0 0 Null ""} diff --git a/src/dbg_frontend/dbg_frontend_core.c b/src/dbg_frontend/dbg_frontend_core.c index d222c5bb..a64476d3 100644 --- a/src/dbg_frontend/dbg_frontend_core.c +++ b/src/dbg_frontend/dbg_frontend_core.c @@ -524,7 +524,7 @@ df_prefer_dasm_from_window(DF_Window *window) return result; } -#if 0 // TODO(rjf): @msgs +#if 0 // NOTE(rjf): @msgs internal D_CmdParams df_cmd_params_from_window(DF_Window *window) { @@ -625,7 +625,6 @@ internal void df_drag_kill(void) { df_state->drag_drop_state = DF_DragDropState_Null; - MemoryZeroStruct(&df_drag_drop_payload); } internal void @@ -649,6 +648,19 @@ df_get_rich_hover_info(void) return info; } +//////////////////////////////// +//~ rjf: Context Menu Opening + +internal void +df_ctx_menu_open_(UI_Box *box, DF_Regs *regs) +{ + MD_Node *window_cfg = df_cfg_tree_from_handle(regs->window); + DF_Window *window = df_window_from_cfg_tree(window_cfg); + arena_clear(window->ctx_menu_arena); + ui_ctx_menu_open(df_state->ctx_menu_key, box->key, v2f32(0, box->rect.y1 - box->rect.y0)); + window->ctx_menu_regs = df_regs_copy(window->ctx_menu_arena, regs); +} + //////////////////////////////// //~ rjf: View Spec State Functions @@ -888,7 +900,7 @@ df_view_equip_spec(DF_View *view, DF_ViewSpec *spec, String8 query, MD_Node *par df_view_equip_query(view, query); // rjf: initialize state for new view spec - // TODO(rjf): @msgs DF_ViewSetupFunctionType *view_setup = spec->info.setup_hook; + // NOTE(rjf): @msgs DF_ViewSetupFunctionType *view_setup = spec->info.setup_hook; { for(DF_ArenaExt *ext = view->first_arena_ext; ext != 0; ext = ext->next) { @@ -919,7 +931,7 @@ df_view_equip_spec(DF_View *view, DF_ViewSpec *spec, String8 query, MD_Node *par } view->is_filtering = 0; view->is_filtering_t = 0; - // TODO(rjf): @msgs view_setup(view, view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size)); + // NOTE(rjf): @msgs view_setup(view, view->params_roots[view->params_read_gen%ArrayCount(view->params_roots)], str8(view->query_buffer, view->query_string_size)); } internal void @@ -1404,7 +1416,7 @@ df_window_frame(MD_Node *window_cfg) ProfScope("gather all panel cfg trees") { Axis2 root_split_axis = md_node_is_nil(md_child_from_string(window_cfg, str8_lit("split_x"), 0)) ? Axis2_Y : Axis2_X; - MD_Node *panels_cfg = md_child_from_string(window_cfg, str8_lit("panels"), 0); + MD_Node *panels_cfg = df_panel_tree_from_window_cfg(window_cfg); if(!md_node_is_nil(panels_cfg)) { PanelTask *start_task = push_array(scratch.arena, PanelTask, 1); @@ -1413,7 +1425,7 @@ df_window_frame(MD_Node *window_cfg) start_task->split_axis = root_split_axis; for(PanelTask *t = first_panel_task; t != 0; t = t->next) { - if(!md_node_is_nil(md_child_from_string(t->root, str8_lit("selected"), 0))) + if(!md_node_is_nil(md_tag_from_string(t->root, str8_lit("selected"), 0))) { focused_panel_cfg = t->root; } @@ -2150,14 +2162,12 @@ df_window_frame(MD_Node *window_cfg) if(drag_active && window_is_focused) { Temp scratch = scratch_begin(0, 0); - DF_DragDropPayload *payload = &df_drag_drop_payload; - MD_Node *drag_cfg = df_cfg_tree_from_handle(payload->cfg_tree); { //- rjf: tab dragging - if(str8_match(drag_cfg->string, str8_lit("tab"), 0)) DF_RegsScope + MD_Node *tab_cfg = df_cfg_tree_from_handle(df_state->drag_drop_regs->tab); + if(!md_node_is_nil(tab_cfg)) DF_RegsScope(.tab = df_state->drag_drop_regs->tab) { - df_regs_set_view(drag_cfg); - MD_Node *expr_cfg = drag_cfg->first; + MD_Node *expr_cfg = tab_cfg->first; MD_Node *spec_cfg = expr_cfg->first; DF_ViewSpec *spec = df_view_spec_from_string(spec_cfg->string); UI_Size main_width = ui_top_pref_width(); @@ -2312,6 +2322,7 @@ df_window_frame(MD_Node *window_cfg) ui_divider(ui_em(1.f, 1.f)); //- rjf: draw entity tree +#if 0 // TODO(rjf): @msgs D_EntityRec rec = {0}; S32 indent = 0; UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf("Entity Tree:"); @@ -2336,6 +2347,7 @@ df_window_frame(MD_Node *window_cfg) indent += rec.push_count; indent -= rec.pop_count; } +#endif } } @@ -2930,10 +2942,9 @@ df_window_frame(MD_Node *window_cfg) UI_CtxMenu(df_state->tab_ctx_menu_key) UI_PrefWidth(ui_em(40.f, 1.f)) UI_CornerRadius(0) DF_Palette(DF_PaletteCode_ImplicitButton) { - MD_Node *tab_cfg = df_cfg_tree_from_handle(ws->tab_ctx_menu_view); - DF_RegsScope + DF_RegsScope(.tab = ws->tab_ctx_menu_view) { - df_regs_set_view(tab_cfg); + MD_Node *tab_cfg = df_cfg_tree_from_handle(df_regs()->tab); String8 query = tab_cfg->string; DF_ViewSpec *view_spec = df_view_spec_from_string(tab_cfg->first->string); DF_IconKind view_icon = view_spec->info.icon_kind; @@ -3652,9 +3663,9 @@ df_window_frame(MD_Node *window_cfg) Assert(ArrayCount(codepoints) == ArrayCount(cmds)); df_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints); DF_Palette(DF_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); - for(MD_EachNode(root_ref, df_state->cfg_root->first)) + for(EachEnumVal(DF_CfgSlot, slot)) { - for(MD_EachNode(tln, root_ref->first->first)) + for(MD_EachNode(tln, df_state->cfg_slot_roots[slot]->first)) { if(!str8_match(tln->string, str8_lit("target"), 0)) { @@ -3866,6 +3877,7 @@ df_window_frame(MD_Node *window_cfg) ui_spacer(ui_em(0.75f, 1)); // rjf: conversion task visualization +#if 0 // TODO(rjf): @msgs UI_PrefWidth(ui_text_dim(10, 1)) UI_HeightFill DF_Palette(DF_PaletteCode_NeutralPopButton) { @@ -3892,6 +3904,7 @@ df_window_frame(MD_Node *window_cfg) } scratch_end(scratch); } +#endif } //- rjf: center column @@ -3902,7 +3915,7 @@ df_window_frame(MD_Node *window_cfg) { Temp scratch = scratch_begin(0, 0); D_EntityList targets = d_push_active_target_list(scratch.arena); - D_EntityList processes = d_query_cached_entity_list_with_kind(D_EntityKind_Process); + CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); B32 have_targets = targets.count != 0; B32 can_send_signal = !d_ctrl_targets_running(); B32 can_play = (have_targets && (can_send_signal || d_ctrl_last_run_frame_idx()+4 > d_frame_index())); @@ -4257,6 +4270,7 @@ df_window_frame(MD_Node *window_cfg) ProfScope("build bottom bar") { B32 is_running = d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < d_frame_index(); + F32 error_t = ClampBot(0, 1.f - (df_state->error_num_seconds_shown/df_state->error_num_seconds_to_show)); CTRL_Event stop_event = d_ctrl_last_stop_event(); UI_Palette *positive_scheme = df_palette_from_code(DF_PaletteCode_PositivePopButton); UI_Palette *running_scheme = df_palette_from_code(DF_PaletteCode_NeutralPopButton); @@ -4280,7 +4294,7 @@ df_window_frame(MD_Node *window_cfg) }break; } } - if(ws->error_t > 0.01f) + if(error_t > 0.01f) { UI_Palette *blended_scheme = push_array(ui_build_arena(), UI_Palette, 1); MemoryCopyStruct(blended_scheme, palette); @@ -4288,7 +4302,7 @@ df_window_frame(MD_Node *window_cfg) { for(U64 idx = 0; idx < 4; idx += 1) { - blended_scheme->colors[code].v[idx] += (negative_scheme->colors[code].v[idx] - blended_scheme->colors[code].v[idx]) * ws->error_t; + blended_scheme->colors[code].v[idx] += (negative_scheme->colors[code].v[idx] - blended_scheme->colors[code].v[idx]) * error_t; } } palette = blended_scheme; @@ -4343,20 +4357,22 @@ df_window_frame(MD_Node *window_cfg) // rjf: bind change visualization if(df_state->bind_change_active) { + MD_Node *bind_cfg = df_cfg_tree_from_handle(df_state->bind_change_bind_handle); + DF_MsgKind msg_kind = df_msg_kind_from_string(bind_cfg->first->string); UI_PrefWidth(ui_text_dim(10, 1)) UI_Flags(UI_BoxFlag_DrawBackground) UI_TextAlignment(UI_TextAlign_Center) UI_CornerRadius(4) DF_Palette(DF_PaletteCode_NeutralPopButton) - ui_labelf("Currently rebinding \"%S\" hotkey", df_state->bind_change_cmd_spec->info.display_name); + ui_labelf("Currently rebinding \"%S\" hotkey", df_msg_kind_info_table[msg_kind].display_name); } // rjf: error visualization - else if(ws->error_t >= 0.01f) + else if(df_state->error_num_seconds_shown < df_state->error_num_seconds_to_show) { - ws->error_t -= d_dt()/8.f; + df_state->error_num_seconds_shown += df_state->dt; df_request_frame(); - String8 error_string = str8(ws->error_buffer, ws->error_string_size); + String8 error_string = df_state->error_string; if(error_string.size != 0) { ui_set_next_pref_width(ui_children_sum(1)); @@ -4596,7 +4612,7 @@ df_window_frame(MD_Node *window_cfg) df_regs_set_from_query_slot_string(ws->query_msg_query.slot, str8(view->query_buffer, view->query_string_size)); df_msg(ws->query_msg_kind); } -#if 0 // TODO(rjf): @msgs +#if 0 // NOTE(rjf): @msgs D_CmdParams params = df_cmd_params_from_window(ws); String8 error = d_cmd_params_apply_spec_query(scratch.arena, ¶ms, ws->query_cmd_spec, str8(view->query_buffer, view->query_string_size)); d_push_cmd(d_cmd_spec_from_kind(D_CmdKind_CompleteQuery), ¶ms); @@ -5335,9 +5351,9 @@ df_window_frame(MD_Node *window_cfg) } if(!md_node_is_nil(selected_tab_cfg)) { - selected_tab_spec = df_view_spec_from_string(selected_tab_cfg->first->string); + selected_tab_spec = df_view_spec_from_string(selected_tab_cfg->first->first->string); tab_filter_string = raw_from_escaped_string(scratch.arena, md_tag_from_string(selected_tab_cfg, str8_lit("filter"), 0)->first->string); - tab_expr_string = raw_from_escaped_string(scratch.arena, selected_tab_cfg->string); + tab_expr_string = raw_from_escaped_string(scratch.arena, selected_tab_cfg->first->string); tab_filter_open = !md_node_is_nil(md_tag_from_string(selected_tab_cfg, str8_lit("filter_open"), 0)); tab_filtering_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "tab_%p_filter_t", selected_tab_cfg), (F32)!!tab_filter_open); @@ -5352,12 +5368,9 @@ df_window_frame(MD_Node *window_cfg) ////////////////////////// //- rjf: push registers for this panel // - df_push_regs(); - { - df_regs()->panel = df_handle_from_cfg_tree(panel_cfg); - df_regs()->tab = df_handle_from_cfg_tree(selected_tab_cfg); - df_regs()->file_path = d_file_path_from_eval_string(scratch.arena, tab_expr_string); - } + df_push_regs(.panel = df_handle_from_cfg_tree(panel_cfg), + .tab = df_handle_from_cfg_tree(selected_tab_cfg), + .file_path = d_file_path_from_eval_string(scratch.arena, tab_expr_string)); ////////////////////////// //- rjf: calculate UI rectangles @@ -5407,8 +5420,9 @@ df_window_frame(MD_Node *window_cfg) //- rjf: build combined split+movetab drag/drop sites // { - MD_Node *view_cfg = df_cfg_tree_from_handle(df_drag_drop_payload.cfg_tree); - if(df_drag_is_active() && !md_node_is_nil(view_cfg) && contains_2f32(panel_rect, ui_mouse())) + if(df_drag_is_active() && + !md_node_is_nil(df_cfg_tree_from_handle(df_state->drag_drop_regs->tab)) && + contains_2f32(panel_rect, ui_mouse())) { F32 drop_site_dim_px = ceil_f32(ui_top_font_size()*7.f); Vec2F32 drop_site_half_dim = v2f32(drop_site_dim_px/2, drop_site_dim_px/2); @@ -6770,10 +6784,11 @@ df_window_frame(MD_Node *window_cfg) } //- rjf: draw border/overlay color to signify error - if(ws->error_t > 0.01f) + F32 error_t = ClampBot(0, 1.f - (df_state->error_num_seconds_shown/df_state->error_num_seconds_to_show)); + if(error_t > 0.01f) { Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_NegativePopButtonBackground); - color.w *= ws->error_t; + color.w *= error_t; Rng2F32 rect = os_client_rect_from_window(ws->os); dr_rect(pad_2f32(rect, 24.f), color, 0, 16.f, 12.f); dr_rect(rect, v4f32(color.x, color.y, color.z, color.w*0.05f), 0, 0, 0); @@ -7496,29 +7511,368 @@ df_frame_arena(void) internal DF_Handle df_handle_from_cfg_tree(MD_Node *cfg) { - DF_CfgSlot slot = df_cfg_slot_from_tree(cfg); DF_Handle handle = {0}; - handle.u64[0] = (U64)slot; - handle.u64[1] = df_state->cfg_slot_gens[slot]; - handle.u64[2] = (U64)cfg; - handle.u64[3] = cfg->user_gen; + handle.u64[0] = (U64)cfg; + handle.u64[1] = cfg->user_gen; return handle; } internal MD_Node * df_cfg_tree_from_handle(DF_Handle handle) { - DF_CfgSlot slot = (DF_CfgSlot)handle.u64[0]; - MD_Node *cfg_tree = (MD_Node *)handle.u64[2]; - if(df_state->cfg_slot_gens[slot] != handle.u64[1] || - cfg_tree->user_gen != handle.u64[3]) + MD_Node *cfg_tree = (MD_Node *)handle.u64[0]; + if(cfg_tree->user_gen != handle.u64[1]) { cfg_tree = &md_nil_node; } return cfg_tree; } -//- rjf: string <-> cfg tree +//- rjf: cfg tree -> slot + +internal DF_CfgSlot +df_cfg_slot_from_tree(MD_Node *node) +{ + DF_CfgSlot slot = DF_CfgSlot_User; + for(MD_Node *n = node; !md_node_is_nil(n); n = n->parent) + { + for(EachEnumVal(DF_CfgSlot, s)) + { + if(n == df_state->cfg_slot_roots[s]) + { + slot = s; + goto end; + } + } + } + end:; + return slot; +} + +//- rjf: cfg slot allocations + +internal MD_Node * +df_cfg_node_alloc(void) +{ + MD_Node *node = df_state->cfg_free; + if(!md_node_is_nil(node)) + { + SLLStackPop(df_state->cfg_free); + U64 gen = node->user_gen; + MemoryZeroStruct(node); + node->user_gen = gen+1; + } + else + { + node = push_array(df_state->cfg_arena, MD_Node, 1); + } + node->first = node->last = node->parent = node->next = node->prev = node->first_tag = node->last_tag = &md_nil_node; + node->user_gen += 1; + return node; +} + +internal void +df_cfg_node_release(MD_Node *node) +{ + Temp scratch = scratch_begin(0, 0); + typedef struct Task Task; + struct Task + { + Task *next; + MD_Node *node; + }; + Task start_task = {0, node}; + Task *first_task = &start_task; + Task *last_task = first_task; + for(Task *t = first_task; t != 0; t = t->next) + { + for(MD_EachNode(child, t->node->first)) + { + Task *task = push_array(scratch.arena, Task, 1); + task->node = child; + SLLQueuePush(first_task, last_task, task); + } + for(MD_EachNode(child, t->node->first_tag)) + { + Task *task = push_array(scratch.arena, Task, 1); + task->node = child; + SLLQueuePush(first_task, last_task, task); + } + SLLStackPush(df_state->cfg_free, t->node); + if(t->node->string.size != 0) + { + df_cfg_string_release(t->node->string); + } + if(t->node->raw_string.size != 0) + { + df_cfg_string_release(t->node->raw_string); + } + t->node->user_gen += 1; + } + scratch_end(scratch); +} + +internal U64 +df_cfg_string_bucket_idx_from_string_size(U64 size) +{ + U64 size_rounded = u64_up_to_pow2(size+1); + size_rounded = ClampBot((1<<4), size_rounded); + U64 bucket_idx = 0; + switch(size_rounded) + { + case 1<<4: {bucket_idx = 0;}break; + case 1<<5: {bucket_idx = 1;}break; + case 1<<6: {bucket_idx = 2;}break; + case 1<<7: {bucket_idx = 3;}break; + case 1<<8: {bucket_idx = 4;}break; + case 1<<9: {bucket_idx = 5;}break; + case 1<<10:{bucket_idx = 6;}break; + default:{bucket_idx = ArrayCount(df_state->cfg_free_string_chunks)-1;}break; + } + return bucket_idx; +} + +internal String8 +df_cfg_string_alloc(String8 string) +{ + if(string.size == 0) {return str8_zero();} + U64 bucket_idx = df_cfg_string_bucket_idx_from_string_size(string.size); + + // rjf: loop -> find node, allocate if not there + // + // (we do a loop here so that all allocation logic goes through + // the same path, such that we *always* pull off a free list, + // rather than just using what was pushed onto an arena directly, + // which is not undoable; the free lists we control, and are thus + // trivially undoable) + // + DF_StringChunkNode *node = 0; + for(;node == 0;) + { + node = df_state->cfg_free_string_chunks[bucket_idx]; + + // rjf: pull from bucket free list + if(node != 0) + { + if(bucket_idx == ArrayCount(df_state->cfg_free_string_chunks)-1) + { + node = 0; + DF_StringChunkNode *prev = 0; + for(DF_StringChunkNode *n = df_state->cfg_free_string_chunks[bucket_idx]; + n != 0; + prev = n, n = n->next) + { + if(n->size >= string.size+1) + { + if(prev == 0) + { + df_state->cfg_free_string_chunks[bucket_idx] = n->next; + } + else + { + prev->next = n->next; + } + node = n; + break; + } + } + } + else + { + SLLStackPop(df_state->cfg_free_string_chunks[bucket_idx]); + } + } + + // rjf: no found node -> allocate new, push onto associated free list + if(node == 0) + { + U64 chunk_size = 0; + if(bucket_idx < ArrayCount(df_state->cfg_free_string_chunks)-1) + { + chunk_size = 1<<(bucket_idx+4); + } + else + { + chunk_size = u64_up_to_pow2(string.size); + } + U8 *chunk_memory = push_array(df_state->cfg_arena, U8, chunk_size); + DF_StringChunkNode *chunk = (DF_StringChunkNode *)chunk_memory; + SLLStackPush(df_state->cfg_free_string_chunks[bucket_idx], chunk); + } + } + + // rjf: fill string & return + String8 allocated_string = str8((U8 *)node, string.size); + MemoryCopy((U8 *)node, string.str, string.size); + return allocated_string; +} + +internal void +df_cfg_string_release(String8 string) +{ + if(string.size == 0) {return;} + U64 bucket_idx = df_cfg_string_bucket_idx_from_string_size(string.size); + DF_StringChunkNode *node = (DF_StringChunkNode *)string.str; + node->size = u64_up_to_pow2(string.size); + SLLStackPush(df_state->cfg_free_string_chunks[bucket_idx], node); +} + +//- rjf: tree -> cfg slot copying + +internal MD_Node * +df_cfg_tree_copy(MD_Node *src) +{ + Temp scratch = scratch_begin(0, 0); + typedef struct Task Task; + struct Task + { + Task *next; + MD_Node *dst_parent; + MD_Node *first; + }; + Task start_task = {0, &md_nil_node, src}; + Task *first_task = &start_task; + Task *last_task = first_task; + MD_Node *dst_root = &md_nil_node; + for(Task *t = first_task; t != 0; t = t->next) + { + for(MD_EachNode(src, t->first)) + { + MD_Node *dst = df_cfg_node_alloc(); + dst->kind = src->kind; + dst->flags = src->flags; + dst->string = df_cfg_string_alloc(src->string); + dst->raw_string = df_cfg_string_alloc(src->raw_string); + dst->src_offset = src->src_offset; + dst->user_gen = src->user_gen; + if(!md_node_is_nil(t->dst_parent)) + { + if(dst->kind == MD_NodeKind_Tag) + { + md_node_push_tag(t->dst_parent, dst); + } + else + { + md_node_push_child(t->dst_parent, dst); + } + } + else + { + dst_root = dst; + } + if(!md_node_is_nil(src->first_tag)) + { + Task *task = push_array(scratch.arena, Task, 1); + task->first = src->first_tag; + task->dst_parent = dst; + SLLQueuePush(first_task, last_task, task); + } + if(!md_node_is_nil(src->first)) + { + Task *task = push_array(scratch.arena, Task, 1); + task->first = src->first; + task->dst_parent = dst; + SLLQueuePush(first_task, last_task, task); + } + } + } + scratch_end(scratch); + return dst_root; +} + +//- rjf: string -> cfg tree helper + +internal MD_Node * +df_file_cfg_tree_from_string(String8 string) +{ + Temp scratch = scratch_begin(0, 0); + MD_Node *root = md_tree_from_string(scratch.arena, string); + MD_Node *result = df_cfg_tree_copy(root); + scratch_end(scratch); + return result; +} + +internal MD_Node * +df_single_cfg_tree_from_string(String8 string) +{ + Temp scratch = scratch_begin(0, 0); + MD_Node *root = md_tree_from_string(scratch.arena, string)->first; + MD_Node *result = df_cfg_tree_copy(root); + scratch_end(scratch); + return result; +} + +internal MD_Node * +df_single_cfg_tree_from_stringf(char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + MD_Node *result = df_single_cfg_tree_from_string(string); + va_end(args); + scratch_end(scratch); + return result; +} + +//- rjf: cfg node string replacing helper + +internal void +df_cfg_tree_set_string(MD_Node *node, String8 new_string) +{ + df_cfg_string_release(node->string); + node->string = df_cfg_string_alloc(new_string); +} + +internal void +df_cfg_tree_set_stringf(MD_Node *node, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 string = push_str8fv(scratch.arena, fmt, args); + df_cfg_tree_set_string(node, string); + va_end(args); + scratch_end(scratch); +} + +//- rjf: cfg subtree replacing helper + +internal MD_Node * +df_cfg_tree_set_key(MD_Node *root, String8 key, String8 value) +{ + MD_Node *existing_node = md_child_from_string(root, key, 0); + MD_Node *new_node = &md_nil_node; + if(value.size != 0) + { + new_node = df_single_cfg_tree_from_string(value); + } + MD_Node *prev_node = existing_node->prev; + if(!md_node_is_nil(existing_node)) + { + md_unhook_child(existing_node); + } + if(!md_node_is_nil(new_node)) + { + md_node_insert_child(root, prev_node, new_node); + } + return new_node; +} + +internal MD_Node * +df_cfg_tree_set_keyf(MD_Node *root, String8 key, char *fmt, ...) +{ + Temp scratch = scratch_begin(0, 0); + va_list args; + va_start(args, fmt); + String8 value = push_str8fv(scratch.arena, fmt, args); + MD_Node *result = df_cfg_tree_set_key(root, key, value); + va_end(args); + scratch_end(scratch); + return result; +} + +//- rjf: key string <-> cfg tree internal MD_Node * df_cfg_tree_from_key(String8 string) @@ -7627,98 +7981,63 @@ df_key_from_cfg_tree(Arena *arena, MD_Node *node) return result; } -//- rjf: config tree mutations - -internal DF_CfgSlot -df_cfg_slot_from_tree(MD_Node *node) -{ - DF_CfgSlot slot = DF_CfgSlot_User; - for(MD_Node *n = node; !md_node_is_nil(n); n = n->parent) - { - for(EachEnumVal(DF_CfgSlot, s)) - { - if(n == df_state->cfg_slot_roots[s]) - { - slot = s; - goto end; - } - } - } - end:; - return slot; -} - -internal MD_Node * -df_cfg_tree_store(MD_Node *parent, MD_Node *prev_child, String8 string) -{ - if(md_node_is_nil(parent)) - { - return &md_nil_node; - } - DF_CfgSlot slot = df_cfg_slot_from_tree(parent); - Arena *arena = df_state->cfg_slot_arenas[slot]; - String8 string_copy = push_str8_copy(arena, string); - MD_Node *new_root = md_tree_from_string(arena, string_copy); - MD_Node *result = &md_nil_node; - if(!md_node_is_nil(new_root)) - { - result = new_root->first; - for(MD_EachNode(child, new_root->first)) - { - md_node_insert_child(parent, prev_child, child); - prev_child = child; - } - } - return result; -} - -internal MD_Node * -df_cfg_tree_storef(MD_Node *parent, MD_Node *prev_child, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - MD_Node *result = df_cfg_tree_store(parent, prev_child, string); - va_end(args); - scratch_end(scratch); - return result; -} - -internal void -df_cfg_tree_set_string(MD_Node *node, String8 string) -{ - DF_CfgSlot slot = df_cfg_slot_from_tree(node); - Arena *arena = df_state->cfg_slot_arenas[slot]; - node->string = push_str8_copy(arena, string); -} - -internal void -df_cfg_tree_set_stringf(MD_Node *node, char *fmt, ...) -{ - Temp scratch = scratch_begin(0, 0); - va_list args; - va_start(args, fmt); - String8 string = push_str8fv(scratch.arena, fmt, args); - df_cfg_tree_set_string(node, string); - va_end(args); - scratch_end(scratch); -} - -internal void -df_cfg_tree_insert_child(MD_Node *parent, MD_Node *prev_child, MD_Node *node) -{ - md_node_insert_child(parent, prev_child, node); -} - -internal void -df_cfg_tree_release(MD_Node *node) -{ - // TODO(rjf): @msgs -} - //- rjf: config tree lookups +internal MD_Node * +df_cfg_tree_last_from_key(MD_Node *root, String8 key) +{ + MD_Node *result = &md_nil_node; + for(MD_Node *tln = root->last; !md_node_is_nil(tln); tln = tln->prev) + { + if(str8_match(tln->string, key, 0)) + { + result = tln; + break; + } + } + return result; +} + +internal Vec4F32 +df_rgba_from_cfg_tree(MD_Node *cfg) +{ + Vec4F32 result = {0}; + MD_Node *child = md_child_from_string(cfg, str8_lit("color"), 0); + if(!md_node_is_nil(child)) + { + // rjf: hex-specified colors + U64 hex_val = 0; + if(child->first == child->last && + child->flags & MD_NodeFlag_Numeric && + try_u64_from_str8_c_rules(child->first->string, &hex_val)) + { + result = rgba_from_u32((U32)hex_val); + } + + // rjf: per-channel expressions + else + { + Temp scratch = scratch_begin(0, 0); + for(MD_EachNode(channel_cfg, child->first)) + { + temp_end(scratch); + U32 slot = 0; + if(0){} + else if(str8_match(channel_cfg->string, str8_lit("r"), StringMatchFlag_CaseInsensitive)) { slot = 0; } + else if(str8_match(channel_cfg->string, str8_lit("g"), StringMatchFlag_CaseInsensitive)) { slot = 1; } + else if(str8_match(channel_cfg->string, str8_lit("b"), StringMatchFlag_CaseInsensitive)) { slot = 2; } + else if(str8_match(channel_cfg->string, str8_lit("a"), StringMatchFlag_CaseInsensitive)) { slot = 3; } + String8 expr_string = md_string_from_children(scratch.arena, channel_cfg); + E_Eval eval = e_eval_from_string(scratch.arena, expr_string); + E_Eval value_eval = e_value_eval_from_eval(eval); + result.v[slot] = e_f32_from_eval(value_eval); + } + scratch_end(scratch); + } + } + return result; +} + internal Axis2 df_split_axis_from_panel_cfg(MD_Node *panel) { @@ -8604,11 +8923,10 @@ df_base_regs(void) } internal DF_Regs * -df_push_regs(void) +df_push_regs_(DF_Regs *regs) { - DF_Regs *top = df_regs(); DF_RegsNode *n = push_array(df_frame_arena(), DF_RegsNode, 1); - MemoryCopyStruct(&n->v, top); + MemoryCopyStruct(&n->v, regs); SLLStackPush(df_state->top_regs, n); return &n->v; } @@ -8768,12 +9086,12 @@ df_init(CmdLine *cmdln) Arena *arena = arena_alloc(); df_state = push_array(arena, DF_State, 1); df_state->arena = arena; + df_state->log = log_alloc(); df_state->num_frames_requested = 2; - df_state->cfg_root_arena = arena_alloc(); - df_state->cfg_root = &md_nil_node; + df_state->cfg_arena = arena_alloc(); + df_state->cfg_free = &md_nil_node; for(EachEnumVal(DF_CfgSlot, slot)) { - df_state->cfg_slot_arenas[slot] = arena_alloc(); df_state->cfg_slot_roots[slot] = &md_nil_node; } df_state->msgs_arena = arena_alloc(); @@ -8788,6 +9106,7 @@ df_init(CmdLine *cmdln) df_state->code_ctx_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_code_ctx_menu_")); df_state->entity_ctx_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_entity_ctx_menu_")); df_state->tab_ctx_menu_key = ui_key_from_string(ui_key_zero(), str8_lit("_tab_ctx_menu_")); + df_state->error_arena = arena_alloc(); df_state->string_search_arena = arena_alloc(); df_state->cfg_main_font_path_arena = arena_alloc(); df_state->cfg_code_font_path_arena = arena_alloc(); @@ -8822,6 +9141,17 @@ df_init(CmdLine *cmdln) scratch_end(scratch); } + // rjf: open ui thread log file + { + Temp scratch = scratch_begin(0, 0); + String8 user_program_data_path = os_get_process_info()->user_program_data_path; + String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); + df_state->log_path = push_str8f(df_state->arena, "%S/ui_thread.raddbg_log", user_data_folder); + os_make_directory(user_data_folder); + os_write_data_to_file_path(df_state->log_path, str8_zero()); + scratch_end(scratch); + } + // rjf: register gfx layer views { DF_ViewSpecInfoArray array = {df_g_gfx_view_kind_spec_info_table, ArrayCount(df_g_gfx_view_kind_spec_info_table)}; @@ -8931,13 +9261,10 @@ df_frame(void) local_persist S32 depth = 0; ////////////////////////////// - //- rjf: apply new rich hover info + //- rjf: begin logging // - arena_clear(df_state->rich_hover_info_current_arena); - MemoryCopyStruct(&df_state->rich_hover_info_current, &df_state->rich_hover_info_next); - df_state->rich_hover_info_current.dbgi_key = di_key_copy(df_state->rich_hover_info_current_arena, &df_state->rich_hover_info_current.dbgi_key); - arena_clear(df_state->rich_hover_info_next_arena); - MemoryZeroStruct(&df_state->rich_hover_info_next); + log_select(df_state->log); + log_scope_begin(); ////////////////////////////// //- rjf: get events from the OS @@ -8948,6 +9275,15 @@ df_frame(void) events = os_get_events(scratch.arena, df_state->num_frames_requested == 0); } + ////////////////////////////// + //- rjf: apply new rich hover info + // + arena_clear(df_state->rich_hover_info_current_arena); + MemoryCopyStruct(&df_state->rich_hover_info_current, &df_state->rich_hover_info_next); + df_state->rich_hover_info_current.dbgi_key = di_key_copy(df_state->rich_hover_info_current_arena, &df_state->rich_hover_info_current.dbgi_key); + arena_clear(df_state->rich_hover_info_next_arena); + MemoryZeroStruct(&df_state->rich_hover_info_next); + ////////////////////////////// //- rjf: pick target hz // @@ -8997,7 +9333,7 @@ df_frame(void) U64 begin_time_us = os_now_microseconds(); ////////////////////////////// - //- rjf: bind change + //- rjf: consume OS events for bind change // if(!df_state->confirm_active && df_state->bind_change_active) { @@ -9009,9 +9345,8 @@ df_frame(void) if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Delete)) { df_request_frame(); - df_unbind_spec(df_state->bind_change_cmd_spec, df_state->bind_change_binding); + df_msg(DF_MsgKind_RemoveEntity, .cfg_tree = df_state->bind_change_bind_handle); df_state->bind_change_active = 0; - // TODO(rjf): @msgs df_msg(d_cfg_src_write_cmd_kind_table[D_CfgSrc_User]); } for(OS_Event *event = events.first, *next = 0; event != 0; event = next) { @@ -9027,7 +9362,24 @@ df_frame(void) event->key != OS_Key_Alt && event->key != OS_Key_Shift) { - df_state->bind_change_active = 0; + MD_Node *current_bind_cfg = df_cfg_tree_from_handle(df_state->bind_change_bind_handle); + MD_Node *bindings_root_cfg = current_bind_cfg->parent; + if(md_node_is_nil(bindings_root_cfg)) + { + bindings_root_cfg = md_child_from_string(df_state->cfg_slot_roots[DF_CfgSlot_User], str8_lit("keybindings"), 0); + if(md_node_is_nil(bindings_root_cfg)) + { + bindings_root_cfg = df_single_cfg_tree_from_string(str8_lit("keybindings")); + md_node_insert_child(df_state->cfg_slot_roots[DF_CfgSlot_User], df_state->cfg_slot_roots[DF_CfgSlot_User]->last, bindings_root_cfg); + } + } + MD_Node *prev_bind_cfg = current_bind_cfg->prev; + String8List modifiers_strings = os_string_list_from_event_flags(scratch.arena, event->flags); + String8 modifiers_string = str8_list_join(scratch.arena, &modifiers_strings, &(StringJoin){.sep = str8_lit(" ")}); + String8 key_string = os_g_key_cfg_string_table[event->key]; + MD_Node *new_bind_cfg = df_single_cfg_tree_from_stringf("{\"%S\" %S %S}", df_state->bind_change_msg_name, modifiers_string, key_string); + md_node_insert_child(bindings_root_cfg, prev_bind_cfg, new_bind_cfg); +#if 0 // NOTE(rjf): @msgs DF_Binding binding = zero_struct; { binding.key = event->key; @@ -9035,10 +9387,12 @@ df_frame(void) } df_unbind_spec(df_state->bind_change_cmd_spec, df_state->bind_change_binding); df_bind_spec(df_state->bind_change_cmd_spec, binding); +#endif U32 codepoint = os_codepoint_from_event_flags_and_key(event->flags, event->key); os_text(&events, os_handle_zero(), codepoint); os_eat_event(&events, event); df_request_frame(); + df_state->bind_change_active = 0; break; } } @@ -9110,10 +9464,9 @@ df_frame(void) // rjf: look into keymap; push run-command message to frontend if this event // matches a binding B32 taken_by_keybinding = 0; - for(MD_EachNode(file_ref, df_state->cfg_root->first)) + for(EachEnumVal(DF_CfgSlot, slot)) { - MD_Node *file = file_ref->first; - for(MD_EachNode(tln, file->first)) + for(MD_EachNode(tln, df_state->cfg_slot_roots[slot]->first)) { if(str8_match(tln->string, str8_lit("keybindings"), StringMatchFlag_CaseInsensitive)) { @@ -9121,8 +9474,8 @@ df_frame(void) { OS_Key map_key = OS_Key_Null; OS_EventFlags map_flags = 0; - String8 map_msg_name = {0}; - for(MD_EachNode(child, map->first)) + String8 map_msg_name = map->first->string; + for(MD_EachNode(child, map->first->next)) { if(0){} else if(str8_match(child->string, str8_lit("ctrl"), 0)) { map_flags |= OS_EventFlag_Ctrl; } @@ -9131,11 +9484,7 @@ df_frame(void) else { OS_Key key = os_key_from_string(child->string); - if(key == OS_Key_Null) - { - map_msg_name = child->string; - } - else + if(key != OS_Key_Null) { map_key = key; } @@ -9191,7 +9540,7 @@ df_frame(void) } } -#if 0 // TODO(rjf): @msgs +#if 0 // NOTE(rjf): @msgs ////////////////////////////// //- rjf: gather root-level commands // @@ -9201,7 +9550,7 @@ df_frame(void) ////////////////////////////// //- rjf: process messages // - ProfScope("process messages") DF_RegsScope + ProfScope("process messages") DF_RegsScope() { for(DF_Msg *msg = 0; df_next_msg(&msg);) { @@ -9329,17 +9678,10 @@ df_frame(void) case DF_MsgKind_LoadProject: cfg_slot = DF_CfgSlot_Project; goto load_cfg_data; load_cfg_data:; { - arena_clear(df_state->cfg_slot_arenas[cfg_slot]); - arena_clear(df_state->cfg_root_arena); String8 cfg_path = regs->file_path; - String8 cfg_data = os_data_from_file_path(df_state->cfg_slot_arenas[cfg_slot], cfg_path); - df_state->cfg_slot_roots[cfg_slot] = md_tree_from_string(df_state->cfg_slot_arenas[cfg_slot], cfg_data); - df_state->cfg_root = md_push_list(df_state->cfg_root_arena); - for(EachEnumVal(DF_CfgSlot, slot)) - { - md_list_push_ref(df_state->cfg_root_arena, df_state->cfg_root, df_state->cfg_slot_roots[slot]); - } - df_state->cfg_slot_gens[cfg_slot] += 1; + String8 cfg_data = os_data_from_file_path(scratch.arena, cfg_path); + MD_Node *cfg_tree = df_file_cfg_tree_from_string(cfg_data); + df_state->cfg_slot_roots[cfg_slot] = cfg_tree; }break; case DF_MsgKind_SaveUser: cfg_slot = DF_CfgSlot_User; goto save_cfg_data; case DF_MsgKind_SaveProject: cfg_slot = DF_CfgSlot_Project; goto save_cfg_data; @@ -9368,7 +9710,7 @@ df_frame(void) case DF_MsgKind_RemoveTarget: { MD_Node *cfg_tree = df_cfg_tree_from_handle(regs->cfg_tree); - df_cfg_tree_release(cfg_tree); + df_cfg_node_release(cfg_tree); }break; case DF_MsgKind_NameEntity: { @@ -9377,42 +9719,9 @@ df_frame(void) }break; case DF_MsgKind_DuplicateEntity: { -#if 0 // TODO(rjf): @msgs - D_Entity *src = d_entity_from_handle(regs->entity); - if(!d_entity_is_nil(src)) - { - typedef struct Task Task; - struct Task - { - Task *next; - D_Entity *src_n; - D_Entity *dst_parent; - }; - Task starter_task = {0, src, src->parent}; - Task *first_task = &starter_task; - Task *last_task = &starter_task; - for(Task *task = first_task; task != 0; task = task->next) - { - D_Entity *src_n = task->src_n; - D_Entity *dst_n = d_entity_alloc(task->dst_parent, task->src_n->kind); - if(src_n->flags & D_EntityFlag_HasTextPoint) {d_entity_equip_txt_pt(dst_n, src_n->text_point);} - if(src_n->flags & D_EntityFlag_HasU64) {d_entity_equip_u64(dst_n, src_n->u64);} - if(src_n->flags & D_EntityFlag_HasColor) {d_entity_equip_color_hsva(dst_n, d_hsva_from_entity(src_n));} - if(src_n->flags & D_EntityFlag_HasVAddrRng) {d_entity_equip_vaddr_rng(dst_n, src_n->vaddr_rng);} - if(src_n->flags & D_EntityFlag_HasVAddr) {d_entity_equip_vaddr(dst_n, src_n->vaddr);} - if(src_n->disabled) {d_entity_equip_disabled(dst_n, 1);} - if(src_n->string.size != 0) {d_entity_equip_name(dst_n, src_n->string);} - dst_n->cfg_src = src_n->cfg_src; - for(D_Entity *src_child = task->src_n->first; !d_entity_is_nil(src_child); src_child = src_child->next) - { - Task *child_task = push_array(scratch.arena, Task, 1); - child_task->src_n = src_child; - child_task->dst_parent = dst_n; - SLLQueuePush(first_task, last_task, child_task); - } - } - } -#endif + MD_Node *cfg_tree = df_cfg_tree_from_handle(regs->cfg_tree); + MD_Node *cfg_tree_dup = df_cfg_tree_copy(cfg_tree); + md_node_insert_child(cfg_tree->parent, cfg_tree, cfg_tree_dup); }break; case DF_MsgKind_RelocateEntity: { @@ -9449,9 +9758,9 @@ df_frame(void) B32 removed_already_existing = 0; if(msg->kind == DF_MsgKind_ToggleBreakpoint) { - for(MD_EachNode(root_ref, df_state->cfg_root)) + for(EachEnumVal(DF_CfgSlot, slot)) { - for(MD_EachNode(tln, root_ref->first->first)) + for(MD_EachNode(tln, df_state->cfg_slot_roots[slot])) { if(str8_match(tln->string, str8_lit("breakpoint"), 0)) { @@ -9471,7 +9780,7 @@ df_frame(void) str8_match(tln_symbol, symbol, 0) || tln_vaddr == vaddr) { - df_cfg_tree_release(tln); + df_cfg_node_release(tln); removed_already_existing = 1; goto break_all_remove_existing; } @@ -9485,8 +9794,9 @@ df_frame(void) if(!removed_already_existing) { MD_Node *root = df_state->cfg_slot_roots[DF_CfgSlot_Project]; - MD_Node *prev_bp = md_child_from_string(root, str8_lit("breakpoint"), 0); - MD_Node *new_bp = df_cfg_tree_storef(root, prev_bp->prev, "breakpoint"); + MD_Node *prev_bp = df_cfg_tree_last_from_key(root, str8_lit("breakpoint")); + MD_Node *new_bp = df_single_cfg_tree_from_stringf("breakpoint"); + md_node_insert_child(root, prev_bp, new_bp); df_msg(DF_MsgKind_RelocateEntity, .cfg_tree = df_handle_from_cfg_tree(new_bp)); } }break; @@ -9593,7 +9903,11 @@ df_frame(void) } // rjf: push command for this expr - // TODO(rjf): @msgs + df_msg(msg->kind == DF_MsgKind_GoToNameAtCursor ? DF_MsgKind_GoToName : + msg->kind == DF_MsgKind_ToggleWatchExpressionAtCursor ? DF_MsgKind_ToggleWatchExpression : + DF_MsgKind_GoToName, + .string = expr); + // NOTE(rjf): @msgs // d_msg(msg->kind == DF_MsgKind_GoToNameAtCursor ? DF_MsgKind_GoToName : // msg->kind == DF_MsgKind_ToggleWatchExpressionAtCursor ? DF_MsgKind_ToggleWatchExpression : // DF_MsgKind_GoToName, .string = expr); @@ -9613,30 +9927,32 @@ df_frame(void) String8 working_dir_normalized = str8_chop_last_slash(file_path_normalized); String8 working_dir_relative = path_relative_dst_from_absolute_dst_src(scratch.arena, working_dir_normalized, cfg_folder); String8 working_dir_escaped = escaped_from_raw_string(scratch.arena, working_dir_relative); - MD_Node *target_cfg = df_cfg_tree_storef(cfg_root, &md_nil_node, - "target:{executable:\"%S\", working_directory:\"%S\"}", - file_path_escaped, - working_dir_escaped); + MD_Node *target_cfg = df_single_cfg_tree_from_stringf("target:{executable:\"%S\", working_directory:\"%S\"}", + file_path_escaped, + working_dir_escaped); + MD_Node *last_target_cfg = df_cfg_tree_last_from_key(cfg_root, str8_lit("target")); + md_node_insert_child(cfg_root, last_target_cfg, target_cfg); df_msg(DF_MsgKind_SelectTarget, .string = df_key_from_cfg_tree(scratch.arena, target_cfg)); }break; case DF_MsgKind_SelectTarget: { - MD_Node *target_cfg = df_cfg_tree_from_key(regs->string); + MD_Node *target_cfg = df_cfg_tree_from_handle(regs->cfg_tree); + DF_CfgSlot cfg_slot = df_cfg_slot_from_tree(target_cfg); if(!md_node_is_nil(target_cfg)) { - for(MD_EachNode(root_ref, df_state->cfg_root->first)) + for(EachEnumVal(DF_CfgSlot, slot)) { - for(MD_EachNode(tln, root_ref->first->first)) + for(MD_EachNode(tln, df_state->cfg_slot_roots[slot]->first)) { if(str8_match(target_cfg->string, tln->string, 0)) { - df_cfg_tree_set_keyf(tln, str8_lit("disabled"), "%i", tln == target_cfg); + df_cfg_tree_set_keyf(tln, str8_lit("disabled"), "%s", tln == target_cfg ? "" : "1"); } } } } -#if 0 // TODO(rjf): @msgs +#if 0 // NOTE(rjf): @msgs D_Entity *entity = d_entity_from_handle(regs->entity); if(entity->kind == D_EntityKind_Target) { @@ -9679,7 +9995,7 @@ df_frame(void) { df_state->confirm_active = 0; df_state->confirm_key = ui_key_zero(); - DF_RegsScope + DF_RegsScope() { df_regs_copy_contents(scratch.arena, df_regs(), df_state->confirm_msg.regs); df_msg(df_state->confirm_msg.kind); @@ -9786,7 +10102,8 @@ df_frame(void) for(MD_EachNode(child, parent_cfg->first)) {child_count += !!(child->flags & MD_NodeFlag_Numeric);} F32 new_child_pct = 1.f/child_count; MD_Node *prev_child = split_side == Side_Max ? panel_cfg : panel_cfg->prev; - MD_Node *next = df_cfg_tree_storef(parent_cfg, prev_child, "%f", new_child_pct); + MD_Node *next = df_single_cfg_tree_from_stringf("%f", new_child_pct); + md_node_insert_child(parent_cfg, prev_child, next); for(MD_EachNode(child, parent_cfg->first)) { if(child != next && child->flags & MD_NodeFlag_Numeric) @@ -9857,8 +10174,8 @@ df_frame(void) msg->kind == DF_MsgKind_SplitPanel) { MD_Node *move_tab_panel_cfg = move_tab_cfg->parent; - df_cfg_tree_unhook(move_tab_cfg); - df_cfg_tree_insert_child(new_panel_cfg, new_panel_cfg->last, move_tab_cfg); + md_unhook_child(move_tab_cfg); + md_node_insert_child(new_panel_cfg, new_panel_cfg->last, move_tab_cfg); df_msg(DF_MsgKind_SelectTab, .tab = df_handle_from_cfg_tree(move_tab_cfg)); B32 move_tab_panel_is_empty = 1; for(MD_EachNode(child, move_tab_panel_cfg->first)) @@ -9879,9 +10196,23 @@ df_frame(void) //- rjf: [panel creation/removal] removal case DF_MsgKind_ClosePanel: { + // rjf: unpack context of the panel-to-close MD_Node *panel_cfg = df_cfg_tree_from_handle(regs->panel); + DF_CfgSlot cfg_slot = df_cfg_slot_from_tree(panel_cfg); + MD_Node *root_panel_cfg = &md_nil_node; + for(MD_Node *p = panel_cfg; !md_node_is_nil(p); p = p->parent) + { + root_panel_cfg = p; + if(str8_match(root_panel_cfg->string, str8_lit("panels"), 0)) + { + break; + } + } + MD_Node *window_cfg = root_panel_cfg->parent; MD_Node *parent_cfg = panel_cfg->parent; - if(!str8_match(panel_cfg->string, str8_lit("panels"), 0)) + + // rjf: close panel, if not root + if(panel_cfg != root_panel_cfg) { // rjf: count children U64 child_count = 0; @@ -9893,7 +10224,7 @@ df_frame(void) if(child_count == 2) { // rjf: gather nodes - MD_Node *grandparent_cfg = !str8_match(parent_cfg->string, str8_lit("panels"), 0) ? parent_cfg->parent : &md_nil_node; + MD_Node *grandparent_cfg = (parent_cfg != root_panel_cfg) ? parent_cfg->parent : &md_nil_node; MD_Node *discard_child_cfg = panel_cfg; MD_Node *keep_child_cfg = &md_nil_node; F32 pct_of_parent = f32_from_str8(parent_cfg->string); @@ -9919,145 +10250,106 @@ df_frame(void) } // rjf: unhook kept child - df_cfg_tree_unhook(keep_child_cfg); + md_unhook_child(keep_child_cfg); // rjf: unhook this subtree if(!md_node_is_nil(grandparent_cfg)) { - df_cfg_tree_unhook(parent_cfg); + md_unhook_child(parent_cfg); } // rjf: release the things we should discard { - df_cfg_tree_release(parent_cfg); - df_cfg_tree_release(discard_child_cfg); + df_cfg_node_release(parent_cfg); + df_cfg_node_release(discard_child_cfg); } // rjf: re-hook our kept child into the overall tree - if(df_panel_is_nil(grandparent)) + if(md_node_is_nil(grandparent_cfg)) { - ws->root_panel = keep_child; + md_node_insert_child(window_cfg, window_cfg->last, keep_child_cfg); + df_cfg_tree_set_stringf(keep_child_cfg, "panels"); } else { - df_panel_insert(grandparent, parent_prev, keep_child); + md_node_insert_child(grandparent_cfg, parent_prev_cfg, keep_child_cfg); + df_cfg_tree_set_stringf(keep_child_cfg, "%f", pct_of_parent); } - keep_child->pct_of_parent = pct_of_parent; // rjf: reset focus, if needed - if(ws->focused_panel == discard_child) + if(md_node_has_tag(discard_child_cfg, str8_lit("selected"), 0)) { - ws->focused_panel = keep_child; - for(DF_Panel *grandchild = ws->focused_panel; !df_panel_is_nil(grandchild); grandchild = grandchild->first) + MD_Node *new_focused_panel_cfg = keep_child_cfg; + for(MD_Node *descendant = new_focused_panel_cfg; !md_node_is_nil(descendant); descendant = descendant->first) { - ws->focused_panel = grandchild; + new_focused_panel_cfg = descendant; } + df_msg(DF_MsgKind_FocusPanel, .panel = df_handle_from_cfg_tree(new_focused_panel_cfg)); } - // rjf: keep-child split-axis == grandparent split-axis? bubble keep-child up into grandparent's children - if(!df_panel_is_nil(grandparent) && grandparent->split_axis == keep_child->split_axis && !df_panel_is_nil(keep_child->first)) + // rjf: keep-child has children? bubble keep-child children up into grandparent's children + if(!md_node_is_nil(grandparent_cfg) && !md_node_is_nil(md_node_from_chain_flags(keep_child_cfg->first, &md_nil_node, MD_NodeFlag_Numeric))) { - df_panel_remove(grandparent, keep_child); - DF_Panel *prev = parent_prev; - for(DF_Panel *child = keep_child->first, *next = 0; !df_panel_is_nil(child); child = next) + md_unhook_child(keep_child_cfg); + MD_Node *prev_cfg = parent_prev_cfg; + F32 keep_child_pct = f32_from_str8(keep_child_cfg->string); + for(MD_Node *child_cfg = keep_child_cfg->first, *next = 0; !md_node_is_nil(child_cfg); child_cfg = next) { - next = child->next; - df_panel_remove(keep_child, child); - df_panel_insert(grandparent, prev, child); - prev = child; - child->pct_of_parent *= keep_child->pct_of_parent; + next = child_cfg->next; + md_unhook_child(child_cfg); + md_node_insert_child(grandparent_cfg, prev_cfg, child_cfg); + prev_cfg = child_cfg; + F32 pct = f32_from_str8(child_cfg->string); + F32 new_pct = pct*keep_child_pct; + df_cfg_tree_set_stringf(child_cfg, "%f", new_pct); } - df_panel_release(ws, keep_child); + df_cfg_node_release(keep_child_cfg); } } - // NOTE(rjf): If we're removing all but the last child of this parent, - // we should just remove both children. - if(parent->child_count == 2) - { - DF_Panel *discard_child = panel; - DF_Panel *keep_child = panel == parent->first ? parent->last : parent->first; - DF_Panel *grandparent = parent->parent; - DF_Panel *parent_prev = parent->prev; - F32 pct_of_parent = parent->pct_of_parent; - - // rjf: unhook kept child - df_panel_remove(parent, keep_child); - - // rjf: unhook this subtree - if(!df_panel_is_nil(grandparent)) - { - df_panel_remove(grandparent, parent); - } - - // rjf: release the things we should discard - { - df_panel_release(ws, parent); - df_panel_release(ws, discard_child); - } - - // rjf: re-hook our kept child into the overall tree - if(df_panel_is_nil(grandparent)) - { - ws->root_panel = keep_child; - } - else - { - df_panel_insert(grandparent, parent_prev, keep_child); - } - keep_child->pct_of_parent = pct_of_parent; - - // rjf: reset focus, if needed - if(ws->focused_panel == discard_child) - { - ws->focused_panel = keep_child; - for(DF_Panel *grandchild = ws->focused_panel; !df_panel_is_nil(grandchild); grandchild = grandchild->first) - { - ws->focused_panel = grandchild; - } - } - - // rjf: keep-child split-axis == grandparent split-axis? bubble keep-child up into grandparent's children - if(!df_panel_is_nil(grandparent) && grandparent->split_axis == keep_child->split_axis && !df_panel_is_nil(keep_child->first)) - { - df_panel_remove(grandparent, keep_child); - DF_Panel *prev = parent_prev; - for(DF_Panel *child = keep_child->first, *next = 0; !df_panel_is_nil(child); child = next) - { - next = child->next; - df_panel_remove(keep_child, child); - df_panel_insert(grandparent, prev, child); - prev = child; - child->pct_of_parent *= keep_child->pct_of_parent; - } - df_panel_release(ws, keep_child); - } - } - - // NOTE(rjf): Otherwise we can just remove this child. + // rjf: if we are just removing one child of >2, then we just need + // to remove this one from the list & give its space back to siblings else { - DF_Panel *next = &df_nil_panel; - F32 removed_size_pct = panel->pct_of_parent; - if(df_panel_is_nil(next)) { next = panel->prev; } - if(df_panel_is_nil(next)) { next = panel->next; } - df_panel_remove(parent, panel); - df_panel_release(ws, panel); - if(ws->focused_panel == panel) + F32 removed_size_pct = f32_from_str8(panel_cfg->string); + MD_Node *next = &md_nil_node; + if(!md_node_is_nil(next)) { - ws->focused_panel = next; + next = md_node_from_chain_flags(panel_cfg->next, &md_nil_node, MD_NodeFlag_Numeric); } - for(DF_Panel *child = parent->first; !df_panel_is_nil(child); child = child->next) + if(!md_node_is_nil(next)) { - child->pct_of_parent /= 1.f-removed_size_pct; + for(MD_EachNode(child, parent_cfg->first)) + { + if(child != panel_cfg && child->flags & MD_NodeFlag_Numeric) + { + next = child; + } + } + } + B32 panel_is_focused = md_node_has_tag(panel_cfg, str8_lit("selected"), 0); + md_unhook_child(panel_cfg); + df_cfg_node_release(panel_cfg); + if(panel_is_focused) + { + df_msg(DF_MsgKind_FocusPanel, .panel = df_handle_from_cfg_tree(next)); + } + for(MD_EachNode(child, parent_cfg->first)) + { + F32 pct = f32_from_str8(child->string); + F32 new_pct = pct / (1.f - removed_size_pct); + df_cfg_tree_set_stringf(child, "%f", new_pct); } } } }break; //- rjf: panel rearranging +#if 0 // TODO(rjf): @msgs case DF_MsgKind_RotatePanelColumns: { + MD_Node *panel = df_cfg_tree_from_handle(regs->panel); + MD_Node *parent = &md_nil_node; DF_Window *ws = df_window_from_handle(regs->window); DF_Panel *panel = ws->focused_panel; DF_Panel *parent = &df_nil_panel; @@ -10081,12 +10373,14 @@ df_frame(void) parent->last = old_first; } }break; +#endif //- rjf: panel focusing case DF_MsgKind_NextPanel: panel_sib_off = OffsetOf(DF_Panel, next); panel_child_off = OffsetOf(DF_Panel, first); goto panel_cycle; case DF_MsgKind_PrevPanel: panel_sib_off = OffsetOf(DF_Panel, prev); panel_child_off = OffsetOf(DF_Panel, last); goto panel_cycle; panel_cycle:; { +#if 0 // TODO(rjf): @msgs DF_Window *ws = df_window_from_handle(regs->window); for(DF_Panel *panel = ws->focused_panel; !df_panel_is_nil(panel);) { @@ -10102,9 +10396,11 @@ df_frame(void) break; } } +#endif }break; case DF_MsgKind_FocusPanel: { +#if 0 // TODO(rjf): @msgs DF_Window *ws = df_window_from_handle(regs->window); DF_Panel *panel = df_panel_from_handle(regs->panel); if(!df_panel_is_nil(panel)) @@ -10113,6 +10409,7 @@ df_frame(void) ws->menu_bar_focused = 0; ws->query_view_selected = 0; } +#endif }break; case DF_MsgKind_FocusPanelRight: panel_change_dir = v2s32(+1, +0); goto msg_focus_panel_dir; case DF_MsgKind_FocusPanelLeft: panel_change_dir = v2s32(-1, +0); goto msg_focus_panel_dir; @@ -10120,6 +10417,7 @@ df_frame(void) case DF_MsgKind_FocusPanelDown: panel_change_dir = v2s32(+0, +1); goto msg_focus_panel_dir; msg_focus_panel_dir:; { +#if 0 // TODO(rjf): @msgs DF_Window *ws = df_window_from_handle(regs->window); DF_Panel *src_panel = ws->focused_panel; Rng2F32 src_panel_rect = df_target_rect_from_panel(r2f32(v2f32(0, 0), v2f32(1000, 1000)), ws->root_panel, src_panel); @@ -10154,6 +10452,7 @@ df_frame(void) } df_msg(DF_MsgKind_FocusPanel, .panel = df_handle_from_panel(dst_panel)); } +#endif }break; //- rjf: view history navigation @@ -10163,6 +10462,7 @@ df_frame(void) //- rjf: tab selection case DF_MsgKind_NextTab: { +#if 0 // TODO(rjf): @msgs DF_Panel *panel = df_panel_from_handle(regs->panel); DF_View *view = df_selected_tab_from_panel(panel); DF_View *next_view = view; @@ -10178,9 +10478,11 @@ df_frame(void) } view = next_view; panel->selected_tab_view = df_handle_from_view(view); +#endif }break; case DF_MsgKind_PrevTab: { +#if 0 // TODO(rjf): @msgs DF_Panel *panel = df_panel_from_handle(regs->panel); DF_View *view = df_selected_tab_from_panel(panel); DF_View *next_view = view; @@ -10196,12 +10498,14 @@ df_frame(void) } view = next_view; panel->selected_tab_view = df_handle_from_view(view); +#endif }break; //- rjf: tab rearranging case DF_MsgKind_MoveTabRight: case DF_MsgKind_MoveTabLeft: { +#if 0 // TODO(rjf): @msgs DF_Window *ws = df_window_from_handle(regs->window); DF_Panel *panel = ws->focused_panel; DF_View *view = df_selected_tab_from_panel(panel); @@ -10214,9 +10518,11 @@ df_frame(void) .view = df_handle_from_view(view), .prev_view = df_handle_from_view(prev_view)); } +#endif }break; case DF_MsgKind_MoveTab: { +#if 0 // TODO(rjf): @msgs DF_Window * ws = df_window_from_handle(regs->window); DF_Panel * src_panel = df_panel_from_handle(regs->panel); DF_View * view = df_view_from_handle(regs->view); @@ -10243,11 +10549,13 @@ df_frame(void) df_msg(DF_MsgKind_ClosePanel, .panel = df_handle_from_panel(src_panel)); } } +#endif }break; //- rjf: tab creation/removal case DF_MsgKind_OpenTab: { +#if 0 // TODO(rjf): @msgs DF_Panel *panel = df_panel_from_handle(regs->panel); DF_View *view = df_view_alloc(); df_view_equip_spec(view, &df_nil_view_spec, regs->string, regs->params_tree); @@ -10257,9 +10565,11 @@ df_frame(void) prev_view = df_view_from_handle(regs->prev_view); } df_panel_insert_tab_view(panel, prev_view, view); +#endif }break; case DF_MsgKind_CloseTab: { +#if 0 // TODO(rjf): @msgs DF_Panel *panel = df_panel_from_handle(regs->panel); DF_View *view = df_view_from_handle(regs->view); if(!df_view_is_nil(view)) @@ -10267,23 +10577,29 @@ df_frame(void) df_panel_remove_tab_view(panel, view); df_view_release(view); } +#endif }break; //- rjf: panel tab settings case DF_MsgKind_TabBarTop: { +#if 0 // TODO(rjf): @msgs DF_Panel *panel = df_panel_from_handle(regs->panel); panel->tab_side = Side_Min; +#endif }break; case DF_MsgKind_TabBarBottom: { +#if 0 // TODO(rjf): @msgs DF_Panel *panel = df_panel_from_handle(regs->panel); panel->tab_side = Side_Max; +#endif }break; //- rjf: tab filters case DF_MsgKind_Filter: { +#if 0 // TODO(rjf): @msgs DF_View *view = df_view_from_handle(regs->view); DF_Panel *panel = df_panel_from_handle(regs->panel); B32 view_is_tab = 0; @@ -10302,9 +10618,11 @@ df_frame(void) view->query_cursor = txt_pt(1, 1+(S64)view->query_string_size); view->query_mark = txt_pt(1, 1); } +#endif }break; case DF_MsgKind_ClearFilter: { +#if 0 // TODO(rjf): @msgs DF_View *view = df_view_from_handle(regs->view); if(!df_view_is_nil(view)) { @@ -10312,20 +10630,24 @@ df_frame(void) view->is_filtering = 0; view->query_cursor = view->query_mark = txt_pt(1, 1); } +#endif }break; case DF_MsgKind_ApplyFilter: { +#if 0 // TODO(rjf): @msgs DF_View *view = df_view_from_handle(regs->view); if(!df_view_is_nil(view)) { view->is_filtering = 0; } +#endif }break; //- rjf: default panel layouts case DF_MsgKind_ResetToDefaultPanels: case DF_MsgKind_ResetToCompactPanels: { +#if 0 // TODO(rjf): @msgs DF_Window *ws = df_window_from_handle(regs->window); typedef enum Layout @@ -10678,18 +11000,18 @@ df_frame(void) ws->focused_panel = root_1; }break; } +#endif }break; //- rjf: filesystem fast paths case DF_MsgKind_Open: { - DF_Window *ws = df_window_from_handle(regs->window); +#if 0 // TODO(rjf): @msgs String8 path = regs->file_path; FileProperties props = os_properties_from_file_path(path); if(props.created != 0) { df_msg(DF_MsgKind_OpenTab, - .panel = df_handle_from_panel(ws->focused_panel), .string = d_eval_string_from_file_path(scratch.arena, path), .params_tree = md_tree_from_string(scratch.arena, df_view_kind_name_lower_table[DF_ViewKind_PendingFile])); } @@ -10697,6 +11019,7 @@ df_frame(void) { log_user_errorf("Couldn't open file at \"%S\".", path); } +#endif }break; case DF_MsgKind_Switch: { @@ -10704,6 +11027,7 @@ df_frame(void) }break; case DF_MsgKind_SwitchToPartnerFile: { +#if 0 // TODO(rjf): @msgs DF_Panel *panel = df_panel_from_handle(regs->panel); DF_View *view = df_selected_tab_from_panel(panel); String8 file_path = d_file_path_from_eval_string(scratch.arena, str8(view->query_buffer, view->query_string_size)); @@ -10735,6 +11059,7 @@ df_frame(void) } } } +#endif }break; //- rjf: [snapping to code locations] thread finding @@ -10818,6 +11143,8 @@ df_frame(void) //- rjf: [snapping to code locations] go to code location case DF_MsgKind_FindCodeLocation: { +#if 0 // TODO(rjf): @msgs + // NOTE(rjf): This command is where a lot of high-level flow things // in the debugger come together. It's that codepath that runs any // time a source code location is clicked in the UI, when a thread @@ -11110,6 +11437,7 @@ df_frame(void) df_msg(cursor_snap_kind); } } +#endif }break; } } @@ -11163,6 +11491,7 @@ df_frame(void) ////////////////////////////// //- rjf: animate alive-transitions for entities // +#if 0 // TODO(rjf): @msgs { F32 rate = 1.f - pow_f32(2.f, -20.f*d_dt()); for(D_Entity *e = d_entity_root(); !d_entity_is_nil(e); e = d_entity_rec_depth_first_pre(e, d_entity_root()).next) @@ -11175,11 +11504,12 @@ df_frame(void) } } } +#endif ////////////////////////////// //- rjf: capture is active? -> keep rendering // - if(ProfIsCapturing() || DEV_telemetry_capture) + if(ProfIsCapturing()) { df_request_frame(); } @@ -11187,6 +11517,7 @@ df_frame(void) ////////////////////////////// //- rjf: commit params changes for all views // +#if 0 // TODO(rjf): @msgs { for(DF_View *v = df_state->first_view; !df_view_is_nil(v); v = v->alloc_next) { @@ -11196,6 +11527,7 @@ df_frame(void) } } } +#endif ////////////////////////////// //- rjf: process top-level graphical commands @@ -13759,26 +14091,25 @@ df_frame(void) // { dr_begin_frame(); - for(MD_EachNode(root_ref, df_state->cfg_root->first)) + for(EachEnumVal(DF_CfgSlot, slot)) { - for(MD_EachNode(tln, root_ref->first->first)) + for(MD_EachNode(tln, df_state->cfg_slot_roots[slot]->first)) { if(str8_match(tln->string, str8_lit("window"), 0)) { - String8 window_cfg_key = df_key_from_cfg_tree(scratch.arena, tln); - DF_Window *w = df_window_from_cfg_key(window_cfg_key); - B32 window_is_focused = os_window_is_focused(w->os); + DF_Window *window = df_window_from_cfg_tree(tln); + B32 window_is_focused = os_window_is_focused(window->os); if(window_is_focused) { - df_state->last_focused_window = df_handle_from_window(w); + df_state->last_focused_window = df_handle_from_cfg_tree(tln); } - d_push_regs(); - d_regs()->window = df_handle_from_window(w); - df_window_frame(w); - D_Regs *window_regs = d_pop_regs(); - if(df_window_from_handle(df_state->last_focused_window) == w) + df_push_regs(); + df_regs()->window = df_handle_from_cfg_tree(tln); + df_window_frame(tln); + DF_Regs *window_regs = df_pop_regs(); + if(window_is_focused) { - MemoryCopyStruct(d_regs(), window_regs); + MemoryCopyStruct(df_regs(), window_regs); } } } @@ -13799,7 +14130,6 @@ df_frame(void) if(df_state->drag_drop_state == DF_DragDropState_Dropping) { df_state->drag_drop_state = DF_DragDropState_Null; - MemoryZeroStruct(&df_drag_drop_payload); } ////////////////////////////// @@ -13872,6 +14202,21 @@ df_frame(void) // df_state->frame_index += 1; + ////////////////////////////// + //- rjf: end logging + // + { + LogScopeResult log = log_scope_end(scratch.arena); + os_append_data_to_file_path(df_state->log_path, log.strings[LogMsgKind_Info]); + if(log.strings[LogMsgKind_UserError].size != 0) + { + arena_clear(df_state->error_arena); + df_state->error_string = push_str8_copy(df_state->error_arena, log.strings[LogMsgKind_UserError]); + df_state->error_num_seconds_shown = 0.f; + df_state->error_num_seconds_to_show = 10.f; + } + } + di_scope_close(di_scope); scratch_end(scratch); } diff --git a/src/dbg_frontend/dbg_frontend_core.h b/src/dbg_frontend/dbg_frontend_core.h index 0ebbf8a8..465a30ae 100644 --- a/src/dbg_frontend/dbg_frontend_core.h +++ b/src/dbg_frontend/dbg_frontend_core.h @@ -9,6 +9,7 @@ typedef enum DF_CfgSlot { + DF_CfgSlot_Null, DF_CfgSlot_User, DF_CfgSlot_Project, DF_CfgSlot_CommandLine, @@ -16,13 +17,23 @@ typedef enum DF_CfgSlot } DF_CfgSlot; +//////////////////////////////// +//~ rjf: String Allocation Types + +typedef struct DF_StringChunkNode DF_StringChunkNode; +struct DF_StringChunkNode +{ + DF_StringChunkNode *next; + U64 size; +}; + //////////////////////////////// //~ rjf: Handle Types typedef struct DF_Handle DF_Handle; struct DF_Handle { - U64 u64[4]; + U64 u64[2]; }; typedef struct DF_HandleNode DF_HandleNode; @@ -340,14 +351,6 @@ typedef enum DF_DragDropState } DF_DragDropState; -typedef struct DF_DragDropPayload DF_DragDropPayload; -struct DF_DragDropPayload -{ - DF_Handle cfg_tree; - D_Handle entity; - TxtPt text_point; -}; - //////////////////////////////// //~ rjf: Rich Hover Types @@ -451,6 +454,7 @@ struct DF_MsgKindInfo String8 search_tags; DF_MsgKindFlags flags; DF_MsgQuery query; + U32 icon_kind; }; //////////////////////////////// @@ -612,6 +616,10 @@ struct DF_Window B32 menu_bar_key_held; B32 menu_bar_focus_press_started; + // rjf: context menu state + Arena *ctx_menu_arena; + DF_Regs *ctx_menu_regs; + // rjf: code context menu state Arena *code_ctx_menu_arena; String8 code_ctx_menu_file_path; @@ -685,11 +693,6 @@ struct DF_Window F32 hover_eval_open_t; F32 hover_eval_num_visible_rows_t; - // rjf: error state - U8 error_buffer[512]; - U64 error_string_size; - F32 error_t; - // rjf: panel state DF_Panel *root_panel; DF_Panel *free_panel; @@ -733,6 +736,9 @@ struct DF_State Arena *arena; B32 quit; U64 frame_index; + F32 dt; + Log *log; + String8 log_path; // rjf: frame arenas Arena *frame_arenas[2]; @@ -746,12 +752,11 @@ struct DF_State // rjf: frame request state U64 num_frames_requested; - // rjf: config trees - Arena *cfg_root_arena; - MD_Node *cfg_root; - Arena *cfg_slot_arenas[DF_CfgSlot_COUNT]; - U64 cfg_slot_gens[DF_CfgSlot_COUNT]; + // rjf: config tree state + Arena *cfg_arena; MD_Node *cfg_slot_roots[DF_CfgSlot_COUNT]; + MD_Node *cfg_free; + DF_StringChunkNode *cfg_free_string_chunks[8]; // rjf: interaction registers DF_RegsNode base_regs; @@ -777,11 +782,13 @@ struct DF_State U64 key_map_total_count; // rjf: bind change + Arena *bind_change_arena; B32 bind_change_active; - D_CmdSpec *bind_change_cmd_spec; - DF_Binding bind_change_binding; + String8 bind_change_msg_name; + DF_Handle bind_change_bind_handle; // rjf: top-level context menu keys + UI_Key ctx_menu_key; UI_Key code_ctx_menu_key; UI_Key entity_ctx_menu_key; UI_Key tab_ctx_menu_key; @@ -795,6 +802,12 @@ struct DF_State String8 confirm_title; String8 confirm_desc; + // rjf: error popup state + Arena *error_arena; + String8 error_string; + F32 error_num_seconds_shown; + F32 error_num_seconds_to_show; + // rjf: string search state Arena *string_search_arena; String8 string_search_string; @@ -816,7 +829,7 @@ struct DF_State DF_Window *free_window; U64 window_count; B32 last_window_queued_save; - D_Handle last_focused_window; + DF_Handle last_focused_window; // rjf: view state DF_View *first_view; @@ -895,7 +908,6 @@ read_only global DF_Panel df_nil_panel = }; global DF_State *df_state = 0; -global DF_DragDropPayload df_drag_drop_payload = {0}; global D_Handle df_last_drag_drop_panel = {0}; global D_Handle df_last_drag_drop_prev_tab = {0}; @@ -994,6 +1006,12 @@ internal void df_queue_drag_drop(void); internal void df_set_rich_hover_info(DF_RichHoverInfo *info); internal DF_RichHoverInfo df_get_rich_hover_info(void); +//////////////////////////////// +//~ rjf: Context Menu Opening + +internal void df_ctx_menu_open_(UI_Box *box, DF_Regs *regs); +#define df_ctx_menu_open(box, ...) df_ctx_menu_open_((box), &(DF_Regs){df_regs_lit_init_top __VA_ARGS__}) + //////////////////////////////// //~ rjf: View Spec State Functions @@ -1099,26 +1117,48 @@ internal Arena *df_frame_arena(void); internal DF_Handle df_handle_from_cfg_tree(MD_Node *cfg); internal MD_Node *df_cfg_tree_from_handle(DF_Handle handle); -//- rjf: string <-> cfg tree +//- rjf: cfg tree -> slot +internal DF_CfgSlot df_cfg_slot_from_tree(MD_Node *node); + +//- rjf: cfg slot allocations +internal MD_Node *df_cfg_node_alloc(void); +internal void df_cfg_node_release(MD_Node *node); +internal U64 df_cfg_string_bucket_idx_from_string_size(U64 size); +internal String8 df_cfg_string_alloc(String8 string); +internal void df_cfg_string_release(String8 string); + +//- rjf: tree -> cfg slot copying +internal MD_Node *df_cfg_tree_copy(MD_Node *src); + +//- rjf: string -> cfg tree helpers +internal MD_Node *df_file_cfg_tree_from_string(String8 string); +internal MD_Node *df_single_cfg_tree_from_string(String8 string); +internal MD_Node *df_single_cfg_tree_from_stringf(char *fmt, ...); + +//- rjf: cfg node string replacing helper +internal void df_cfg_tree_set_string(MD_Node *node, String8 new_string); +internal void df_cfg_tree_set_stringf(MD_Node *node, char *fmt, ...); + +//- rjf: cfg subtree replacing helper +internal MD_Node *df_cfg_tree_set_key(MD_Node *root, String8 key, String8 value); +internal MD_Node *df_cfg_tree_set_keyf(MD_Node *root, String8 key, char *fmt, ...); + +//- rjf: key string <-> cfg tree internal MD_Node *df_cfg_tree_from_key(String8 string); internal String8 df_key_from_cfg_tree(Arena *arena, MD_Node *node); -//- rjf: config tree mutations -internal DF_CfgSlot df_cfg_slot_from_tree(MD_Node *node); -internal MD_Node *df_cfg_tree_store(MD_Node *parent, MD_Node *prev_child, String8 string); -internal MD_Node *df_cfg_tree_storef(MD_Node *parent, MD_Node *prev_child, char *fmt, ...); -internal void df_cfg_tree_set_string(MD_Node *node, String8 string); -internal void df_cfg_tree_set_stringf(MD_Node *node, char *fmt, ...); -internal void df_cfg_tree_insert_child(MD_Node *parent, MD_Node *prev_child, MD_Node *node); -internal void df_cfg_tree_release(MD_Node *node); -#define df_cfg_tree_set_key(parent, key, val) df_cfg_tree_store((parent), md_child_from_string((parent), (key), 0), (val)) -#define df_cfg_tree_set_keyf(parent, key, fmt, ...) df_cfg_tree_storef((parent), md_child_from_string((parent), (key), 0), (fmt), __VA_ARGS__) +//- rjf: cfg tree general introspection helpers +internal MD_Node *df_cfg_tree_last_from_key(MD_Node *root, String8 key); +internal Vec4F32 df_rgba_from_cfg_tree(MD_Node *cfg); -//- rjf: config tree lookups +//- rjf: window/panel/tab tree introspection helpers internal Axis2 df_split_axis_from_panel_cfg(MD_Node *panel); internal Rng2F32 df_target_rect_from_panel_child_cfg(Rng2F32 parent_rect, Axis2 parent_split_axis, MD_Node *panel); internal Rng2F32 df_target_rect_from_panel_cfg(Rng2F32 root_rect, MD_Node *panel); internal B32 df_tab_cfg_is_project_filtered(MD_Node *cfg); +#define df_window_from_panel_cfg(node) md_ancestor_from_string((node), str8_lit("window"), 0) +#define df_panel_tree_from_panel_cfg(node) (str8_match((node)->string, str8_lit("panels"), 0) ? (node) : md_ancestor_from_string((node), str8_lit("panels"), 0)) +#define df_panel_tree_from_window_cfg(node) md_child_from_string((node), str8_lit("panels"), 0) //- rjf: keybindings internal void df_clear_bindings(void); @@ -1165,9 +1205,10 @@ internal void df_request_frame(void); internal DF_Regs *df_regs(void); internal DF_Regs *df_base_regs(void); -internal DF_Regs *df_push_regs(void); +internal DF_Regs *df_push_regs_(DF_Regs *regs); +#define df_push_regs(...) df_push_regs_(&(DF_Regs){df_regs_lit_init_top __VA_ARGS__ }) internal DF_Regs *df_pop_regs(void); -#define DF_RegsScope DeferLoop(df_push_regs(), df_pop_regs()) +#define DF_RegsScope(...) DeferLoop(df_push_regs(__VA_ARGS__), df_pop_regs()) //////////////////////////////// //~ rjf: Message Functions diff --git a/src/dbg_frontend/dbg_frontend_views.c b/src/dbg_frontend/dbg_frontend_views.c index 1529d4da..e315dc87 100644 --- a/src/dbg_frontend/dbg_frontend_views.c +++ b/src/dbg_frontend/dbg_frontend_views.c @@ -1,6 +1,28 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +//////////////////////////////// +//~ rjf: View Building API + +//- rjf: getting view parameters +internal U128 get_view_id(void){return u128_zero();} // TODO(rjf): @msgs {(U64)view, d_hash_from_string(str8_struct(&view))} +internal String8 get_view_expression(void) { return str8_zero(); } +internal String8 get_view_filter(void) { return str8_zero(); } +internal UI_ScrollPt2 get_view_scroll_position(void) { UI_ScrollPt2 pt = {0}; return pt; } + +//- rjf: overwriting view parameters +internal void set_view_expression(String8 string){} +internal void set_view_filter(String8 string){} +internal void set_view_scroll_position(UI_ScrollPt2 pos){} + +//- rjf: getting view resources (top-level view lifetime arena, extra arenas, user state slot) +internal Arena *get_view_arena(void){return 0;} +internal void *get_or_push_view_state(U64 needed_size){return 0;} +internal Arena *push_view_extension_arena(void){return 0;} + +//- rjf: view completion +internal void complete_view_(String8 string){} + //////////////////////////////// //~ rjf: Code Views @@ -44,7 +66,7 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie default: break; case DF_MsgKind_GoToLine: { - cv->goto_line_num = msg->regs.cursor.line; + cv->goto_line_num = msg->regs->cursor.line; }break; case DF_MsgKind_CenterCursor: { @@ -166,9 +188,9 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie code_slice_params.line_text = push_array(scratch.arena, String8, visible_line_count); code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, visible_line_count); code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, visible_line_count); - code_slice_params.line_bps = push_array(scratch.arena, D_EntityList, visible_line_count); + code_slice_params.line_bps = push_array(scratch.arena, MD_NodePtrList, visible_line_count); code_slice_params.line_ips = push_array(scratch.arena, CTRL_EntityList, visible_line_count); - code_slice_params.line_pins = push_array(scratch.arena, D_EntityList, visible_line_count); + code_slice_params.line_pins = push_array(scratch.arena, MD_NodePtrList, visible_line_count); code_slice_params.line_vaddrs = push_array(scratch.arena, U64, visible_line_count); code_slice_params.line_infos = push_array(scratch.arena, D_LineList, visible_line_count); code_slice_params.font = code_font; @@ -197,6 +219,7 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie // rjf: find visible breakpoints for source code ProfScope("find visible breakpoints") { +#if 0 // TODO(rjf): @msgs D_EntityList bps = d_query_cached_entity_list_with_kind(D_EntityKind_Breakpoint); for(D_EntityNode *n = bps.first; n != 0; n = n->next) { @@ -209,6 +232,7 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie d_entity_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp); } } +#endif } // rjf: find live threads mapping to source code @@ -243,6 +267,7 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie // rjf: find visible watch pins for source code ProfScope("find visible watch pins") { +#if 0 // TODO(rjf): @msgs D_EntityList wps = d_query_cached_entity_list_with_kind(D_EntityKind_WatchPin); for(D_EntityNode *n = wps.first; n != 0; n = n->next) { @@ -255,6 +280,7 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie d_entity_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], wp); } } +#endif } // rjf: find all src -> dasm info @@ -295,6 +321,7 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie // rjf: find breakpoints mapping to this disasm if(dasm_lines) ProfScope("find breakpoints mapping to this disassembly") { +#if 0 // TODO(rjf): @msgs D_EntityList bps = d_query_cached_entity_list_with_kind(D_EntityKind_Breakpoint); for(D_EntityNode *n = bps.first; n != 0; n = n->next) { @@ -312,11 +339,13 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie } } } +#endif } // rjf: find watch pins mapping to this disasm if(dasm_lines) ProfScope("find watch pins mapping to this disassembly") { +#if 0 // TODO(rjf): @msgs D_EntityList pins = d_query_cached_entity_list_with_kind(D_EntityKind_WatchPin); for(D_EntityNode *n = pins.first; n != 0; n = n->next) { @@ -334,6 +363,7 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie } } } +#endif } // rjf: fill dasm -> src info @@ -434,7 +464,7 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie cv->center_cursor = found; if(found == 0) { - d_errorf("Could not find \"%S\"", cv->find_text_fwd); + log_user_errorf("Could not find \"%S\"", cv->find_text_fwd); } scratch_end(scratch); } @@ -495,7 +525,7 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie cv->center_cursor = found; if(found == 0) { - d_errorf("Could not find \"%S\"", cv->find_text_bwd); + log_user_errorf("Could not find \"%S\"", cv->find_text_bwd); } scratch_end(scratch); } @@ -1768,7 +1798,7 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d } if(!success) { - d_error(str8_lit("Could not commit value successfully.")); + log_user_errorf("Could not commit value successfully."); } }break; case DF_WatchViewColumnKind_Type:{}break; @@ -2310,11 +2340,9 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d } if(ui_clicked(sig)) { - DF_ViewSpec *canvas_view_spec = df_view_spec_from_string(row->expand_ui_rule_spec->info.string); - d_cmd(D_CmdKind_OpenTab, - .string = e_string_from_expr(scratch.arena, row->expr), - .view_spec = canvas_view_spec, - .params_tree = row->expand_ui_rule_params); + df_msg(DF_MsgKind_OpenTab, + .string = e_string_from_expr(scratch.arena, row->expr), + .params_tree = row->expand_ui_rule_params); } } @@ -2338,7 +2366,7 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d //- rjf: build UI_PermissionFlags(UI_PermissionFlag_Clicks|UI_PermissionFlag_ScrollX) { - canvas_view_spec->info.ui_hook(canvas_view, canvas_view->params_roots[canvas_view->params_read_gen%ArrayCount(canvas_view->params_roots)], str8(canvas_view->query_buffer, canvas_view->query_string_size), canvas_rect); + canvas_view_spec->info.ui_hook(canvas_rect); } //- rjf: pop interaction registers @@ -2623,7 +2651,7 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d if(ui_double_clicked(sig) && cell_can_edit) { ui_kill_action(); - d_cmd(D_CmdKind_Edit); + df_msg(DF_MsgKind_Edit); } // rjf: double-click, not editable -> go-to-location @@ -2838,7 +2866,7 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d // if(pressed) { - d_cmd(D_CmdKind_FocusPanel); + df_msg(DF_MsgKind_FocusPanel); } scratch_end(scratch); @@ -2875,7 +2903,7 @@ DF_VIEW_UI_FUNCTION_DEF(empty) { if(ui_clicked(df_icon_buttonf(DF_IconKind_X, 0, "Close Panel"))) { - d_cmd(D_CmdKind_ClosePanel); + df_msg(DF_MsgKind_ClosePanel); } } } @@ -2946,13 +2974,14 @@ DF_VIEW_UI_FUNCTION_DEF(getting_started) DF_Palette(DF_PaletteCode_NeutralPopButton) if(ui_clicked(df_icon_buttonf(DF_IconKind_Add, 0, "Add Target"))) { - d_cmd(D_CmdKind_RunCommand, .cmd_spec = d_cmd_spec_from_kind(D_CmdKind_AddTarget)); + df_msg(DF_MsgKind_RunCommand, .string = df_msg_kind_info_table[DF_MsgKind_AddTarget].name_lower); } }break; //- rjf: user has 1 target. build helper for launching it case 1: { +#if 0 // TODO(rjf): @msgs D_Entity *target = d_first_entity_from_list(&targets); String8 target_full_path = target->string; String8 target_name = str8_skip_last_slash(target_full_path); @@ -2974,6 +3003,7 @@ DF_VIEW_UI_FUNCTION_DEF(getting_started) d_cmd(D_CmdKind_LaunchAndInit, .entity = d_handle_from_entity(target)); } } +#endif }break; //- rjf: user has N targets. @@ -3158,6 +3188,7 @@ DF_VIEW_UI_FUNCTION_DEF(commands) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); +#if 0 // TODO(rjf): @msgs //- rjf: grab state typedef struct DF_CmdsViewState DF_CmdsViewState; @@ -3165,17 +3196,18 @@ DF_VIEW_UI_FUNCTION_DEF(commands) { D_CmdSpec *selected_cmd_spec; }; - DF_CmdsViewState *cv = df_view_user_state(view, DF_CmdsViewState); + DF_CmdsViewState *cv = get_view_state(DF_CmdsViewState); //- rjf: build filtered array of commands - DF_CmdListerItemList cmd_list = df_cmd_lister_item_list_from_needle(scratch.arena, string); + String8 filter = get_view_filter(); + DF_CmdListerItemList cmd_list = df_cmd_lister_item_list_from_needle(scratch.arena, filter); DF_CmdListerItemArray cmd_array = df_cmd_lister_item_array_from_list(scratch.arena, cmd_list); df_cmd_lister_item_array_sort_by_strength__in_place(cmd_array); //- rjf: submit best match when hitting enter w/ no selection if(cv->selected_cmd_spec == &d_nil_cmd_spec && ui_slot_press(UI_EventActionSlot_Accept)) { - d_cmd(D_CmdKind_CompleteQuery, .cmd_spec = (cmd_array.count > 0 ? cmd_array.v[0].cmd_spec : &d_nil_cmd_spec)); + df_msg(DF_MsgKind_CompleteQuery, .cmd_spec = (cmd_array.count > 0 ? cmd_array.v[0].cmd_spec : &d_nil_cmd_spec)); } //- rjf: selected kind -> cursor @@ -3303,6 +3335,7 @@ DF_VIEW_UI_FUNCTION_DEF(commands) cv->selected_cmd_spec = &d_nil_cmd_spec; } +#endif scratch_end(scratch); ProfEnd(); } @@ -3483,7 +3516,7 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - String8 query = string; + String8 query = get_view_filter(); String8 query_normalized = path_normalized_from_string(scratch.arena, query); B32 query_has_slash = (query.size != 0 && char_to_correct_slash(query.str[query.size-1]) == '/'); String8 query_normalized_with_opt_slash = push_str8f(scratch.arena, "%S%s", query_normalized, query_has_slash ? "/" : ""); @@ -3495,13 +3528,13 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) B32 dir_selection = !!(window->query_cmd_spec->info.query.flags & D_CmdQueryFlag_AllowFolders); //- rjf: get extra state for this view - DF_FileSystemViewState *fs = df_view_user_state(view, DF_FileSystemViewState); + DF_FileSystemViewState *fs = get_view_state(DF_FileSystemViewState); if(fs->initialized == 0) { fs->initialized = 1; fs->path_state_table_size = 256; - fs->path_state_table = push_array(view->arena, DF_FileSystemViewPathState *, fs->path_state_table_size); - fs->cached_files_arena = df_view_push_arena_ext(view); + fs->path_state_table = push_array(get_view_arena(), DF_FileSystemViewPathState *, fs->path_state_table_size); + fs->cached_files_arena = push_view_extension_arena(); fs->col_pcts[0] = 0.60f; fs->col_pcts[1] = 0.20f; fs->col_pcts[2] = 0.20f; @@ -3523,10 +3556,10 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) } if(ps == 0) { - ps = push_array(view->arena, DF_FileSystemViewPathState, 1); + ps = push_array(get_view_arena(), DF_FileSystemViewPathState, 1); ps->hash_next = fs->path_state_table[slot]; fs->path_state_table[slot] = ps; - ps->normalized_path = push_str8_copy(view->arena, key); + ps->normalized_path = push_str8_copy(get_view_arena(), key); } } @@ -3549,7 +3582,7 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) // choose the most recent change to a file browser path, and live with the // consequences). { - d_cmd(D_CmdKind_SetCurrentPath, .file_path = path_query.path); + df_msg(DF_MsgKind_SetCurrentPath, .file_path = path_query.path); } //- rjf: get files, filtered @@ -3637,7 +3670,7 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) // rjf: command search part is empty, but directory matches some file: if(path_query_path_props.created != 0 && path_query.search.size == 0) { - d_cmd(D_CmdKind_CompleteQuery, .file_path = query_normalized_with_opt_slash); + df_msg(DF_MsgKind_CompleteQuery, .file_path = query_normalized_with_opt_slash); } // rjf: command argument exactly matches some file: @@ -3647,20 +3680,20 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) if(query_normalized_with_opt_slash_props.flags & FilePropertyFlag_IsFolder) { String8 new_path = push_str8f(scratch.arena, "%S%S/", path_query.path, path_query.search); - df_view_equip_query(view, new_path); + df_msg(DF_MsgKind_SetFilter, .string = new_path); } // rjf: is a file -> complete view else { - d_cmd(D_CmdKind_CompleteQuery, .file_path = query_normalized_with_opt_slash); + df_msg(DF_MsgKind_CompleteQuery, .file_path = query_normalized_with_opt_slash); } } // rjf: command argument is empty, picking folders -> use current folder else if(path_query.search.size == 0 && dir_selection) { - d_cmd(D_CmdKind_CompleteQuery, .file_path = path_query.path); + df_msg(DF_MsgKind_CompleteQuery, .file_path = path_query.path); } // rjf: command argument does not exactly match any file, but lister results are in: @@ -3671,19 +3704,19 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) { String8 existing_path = str8_chop_last_slash(path_query.path); String8 new_path = push_str8f(scratch.arena, "%S/%S/", existing_path, files[0].filename); - df_view_equip_query(view, new_path); + df_msg(DF_MsgKind_SetFilter, .string = new_path); } else { String8 file_path = push_str8f(scratch.arena, "%S%S", path_query.path, filename); - d_cmd(D_CmdKind_CompleteQuery, .file_path = file_path); + df_msg(DF_MsgKind_CompleteQuery, .file_path = file_path); } } // rjf: command argument does not match any file, and lister is empty (new file) else { - d_cmd(D_CmdKind_CompleteQuery, .file_path = query); + df_msg(DF_MsgKind_CompleteQuery, .file_path = query); } } @@ -3751,9 +3784,10 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; } UI_ScrollListSignal scroll_list_sig = {0}; + UI_ScrollPt2 scroll_pos = get_view_scroll_position(); UI_Focus(UI_FocusKind_On) UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, + &scroll_pos.y, &ps->cursor, 0, &visible_row_range, @@ -3795,8 +3829,8 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) { String8 new_path = str8_chop_last_slash(str8_chop_last_slash(path_query.path)); new_path = path_normalized_from_string(scratch.arena, new_path); - String8 new_cmd = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); - df_view_equip_query(view, new_cmd); + String8 new_filter = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); + set_view_filter(new_filter); } } @@ -3813,7 +3847,7 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) UI_Signal file_sig = {0}; UI_FocusHot(file_kb_focus ? UI_FocusKind_On : UI_FocusKind_Off) { - file_sig = ui_buttonf("##%S_%p", file->filename, view); + file_sig = ui_buttonf("##%S", file->filename); } // rjf: make content @@ -3877,16 +3911,17 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) new_path = path_normalized_from_string(scratch.arena, new_path); if(file->props.flags & FilePropertyFlag_IsFolder) { - String8 new_cmd = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); - df_view_equip_query(view, new_cmd); + String8 new_filter = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); + set_view_filter(new_filter); } else { - d_cmd(D_CmdKind_CompleteQuery, .file_path = new_path); + complete_view(.file_path = new_path); } } } } + set_view_scroll_position(scroll_pos); scratch_end(scratch); ProfEnd(); @@ -4077,16 +4112,16 @@ DF_VIEW_UI_FUNCTION_DEF(system_processes) String8 cached_process_arg; DF_ProcessInfoArray cached_process_array; }; - DF_SystemProcessesViewState *sp = df_view_user_state(view, DF_SystemProcessesViewState); + DF_SystemProcessesViewState *sp = get_view_state(DF_SystemProcessesViewState); if(sp->initialized == 0) { sp->initialized = 1; sp->need_initial_gather = 1; - sp->cached_process_arena = df_view_push_arena_ext(view); + sp->cached_process_arena = push_view_extension_arena(); } //- rjf: gather list of filtered process infos - String8 query = string; + String8 query = get_view_filter(); DF_ProcessInfoArray process_info_array = sp->cached_process_array; if(sp->need_initial_gather || !str8_match(sp->cached_process_arg, query, 0)) { @@ -4103,7 +4138,7 @@ DF_VIEW_UI_FUNCTION_DEF(system_processes) if(sp->selected_pid == 0 && process_info_array.count > 0 && ui_slot_press(UI_EventActionSlot_Accept)) { DF_ProcessInfo *info = &process_info_array.v[0]; - d_cmd(D_CmdKind_CompleteQuery, .id = info->info.pid); + complete_view(.pid = info->info.pid); } //- rjf: selected PID -> cursor @@ -4132,9 +4167,10 @@ DF_VIEW_UI_FUNCTION_DEF(system_processes) scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; } UI_ScrollListSignal scroll_list_sig = {0}; + UI_ScrollPt2 scroll_pos = get_view_scroll_position(); UI_Focus(UI_FocusKind_On) UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, + &scroll_pos.y, &cursor, 0, &visible_row_range, @@ -4191,10 +4227,11 @@ DF_VIEW_UI_FUNCTION_DEF(system_processes) // rjf: click => activate this specific process if(ui_clicked(sig)) { - d_cmd(D_CmdKind_CompleteQuery, .id = info->info.pid); + complete_view(.pid = info->info.pid); } } } + set_view_scroll_position(scroll_pos); //- rjf: selected num -> selected PID { @@ -4313,6 +4350,7 @@ DF_VIEW_SETUP_FUNCTION_DEF(entity_lister){} DF_VIEW_CMD_FUNCTION_DEF(entity_lister){} DF_VIEW_UI_FUNCTION_DEF(entity_lister) { +#if 0 // TODO(rjf): @msgs ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); DF_Window *window = df_window_from_handle(d_regs()->window); @@ -4432,6 +4470,7 @@ DF_VIEW_UI_FUNCTION_DEF(entity_lister) scratch_end(scratch); ProfEnd(); +#endif } //////////////////////////////// @@ -4469,12 +4508,13 @@ DF_VIEW_UI_FUNCTION_DEF(symbol_lister) { Vec2S64 cursor; }; - DF_SymbolListerViewState *slv = df_view_user_state(view, DF_SymbolListerViewState); + DF_SymbolListerViewState *slv = get_view_state(DF_SymbolListerViewState); - //- rjf: query -> raddbg, filtered items - U128 fuzzy_search_key = {(U64)view, d_hash_from_string(str8_struct(&view))}; + //- rjf: filter -> rdi, filtered items + String8 filter = get_view_filter(); + U128 fuzzy_search_key = get_view_id(); B32 items_stale = 0; - FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fuzzy_search_key, &fuzzy_search_params, string, endt_us, &items_stale); + FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fuzzy_search_key, &fuzzy_search_params, filter, endt_us, &items_stale); if(items_stale) { df_request_frame(); @@ -4498,7 +4538,7 @@ DF_VIEW_UI_FUNCTION_DEF(symbol_lister) String8 name = str8(name_base, name_size); if(name.size != 0) { - d_cmd(D_CmdKind_CompleteQuery, .string = name); + complete_view(.string = name); } break; } @@ -4519,9 +4559,10 @@ DF_VIEW_UI_FUNCTION_DEF(symbol_lister) scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; } UI_ScrollListSignal scroll_list_sig = {0}; + UI_ScrollPt2 scroll_pos = get_view_scroll_position(); UI_Focus(UI_FocusKind_On) UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, + &scroll_pos.y, &slv->cursor, 0, &visible_row_range, @@ -4588,7 +4629,7 @@ DF_VIEW_UI_FUNCTION_DEF(symbol_lister) UI_Signal sig = ui_signal_from_box(box); if(ui_clicked(sig)) { - d_cmd(D_CmdKind_CompleteQuery, .string = name); + complete_view(.string = name); } if(ui_hovering(sig)) UI_Tooltip { @@ -4613,6 +4654,7 @@ DF_VIEW_UI_FUNCTION_DEF(symbol_lister) } } + set_view_scroll_position(scroll_pos); fzy_scope_close(fzy_scope); di_scope_close(di_scope); scratch_end(scratch); @@ -4967,6 +5009,7 @@ DF_VIEW_SETUP_FUNCTION_DEF(targets){} DF_VIEW_CMD_FUNCTION_DEF(targets){} DF_VIEW_UI_FUNCTION_DEF(targets) { +#if 0 // TODO(rjf): @msgs ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); D_EntityList targets_list = d_query_cached_entity_list_with_kind(D_EntityKind_Target); @@ -5110,6 +5153,7 @@ DF_VIEW_UI_FUNCTION_DEF(targets) scratch_end(scratch); ProfEnd(); +#endif } //////////////////////////////// @@ -5472,42 +5516,44 @@ DF_VIEW_UI_FUNCTION_DEF(auto_view_rules){} //////////////////////////////// //~ rjf: breakpoints @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(breakpoints) -{ - DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_init(wv, view, DF_WatchViewFillKind_Breakpoints); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.25f, .string = str8_lit("Label"), .dequote_string = 1, .is_non_code = 1); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.35f, .string = str8_lit("Location"), .dequote_string = 1, .is_non_code = 1); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.20f, .string = str8_lit("Condition"), .dequote_string = 1); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.10f, .string = str8_lit("Enabled"), .view_rule = str8_lit("checkbox")); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.10f, .string = str8_lit("Hit Count")); -} +DF_VIEW_SETUP_FUNCTION_DEF(breakpoints){} DF_VIEW_CMD_FUNCTION_DEF(breakpoints){} DF_VIEW_UI_FUNCTION_DEF(breakpoints) { - ProfBeginFunction(); - DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_build(view, ewv, 0, 10, rect); - ProfEnd(); +#if 0 // TODO(rjf): @msgs + DF_WatchViewState *wv = get_view_state(DF_WatchViewState); + if(wv->initialized == 0) + { + wv->initialized = 1; + df_watch_view_init(wv, view, DF_WatchViewFillKind_Breakpoints); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.25f, .string = str8_lit("Label"), .dequote_string = 1, .is_non_code = 1); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.35f, .string = str8_lit("Location"), .dequote_string = 1, .is_non_code = 1); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.20f, .string = str8_lit("Condition"), .dequote_string = 1); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.10f, .string = str8_lit("Enabled"), .view_rule = str8_lit("checkbox")); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.10f, .string = str8_lit("Hit Count")); + } + df_watch_view_build(view, wv, 0, 10, rect); +#endif } //////////////////////////////// //~ rjf: watch_pins @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(watch_pins) -{ - DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_init(wv, view, DF_WatchViewFillKind_WatchPins); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.5f, .string = str8_lit("Label"), .dequote_string = 1, .is_non_code = 1); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.5f, .string = str8_lit("Location"), .dequote_string = 1, .is_non_code = 1); -} +DF_VIEW_SETUP_FUNCTION_DEF(watch_pins){} DF_VIEW_CMD_FUNCTION_DEF(watch_pins){} DF_VIEW_UI_FUNCTION_DEF(watch_pins) { - ProfBeginFunction(); - DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_build(view, ewv, 0, 10, rect); - ProfEnd(); +#if 0 // TODO(rjf): @msgs + DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); + if(wv->initialized == 0) + { + wv->initialized = 1; + df_watch_view_init(wv, view, DF_WatchViewFillKind_WatchPins); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.5f, .string = str8_lit("Label"), .dequote_string = 1, .is_non_code = 1); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Member, 0.5f, .string = str8_lit("Location"), .dequote_string = 1, .is_non_code = 1); + } + df_watch_view_build(view, wv, 0, 10, rect); +#endif } //////////////////////////////// @@ -5737,21 +5783,22 @@ DF_VIEW_UI_FUNCTION_DEF(scheduler) //////////////////////////////// //~ rjf: call_stack @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(call_stack) -{ - DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_init(wv, view, DF_WatchViewFillKind_CallStack); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_FrameSelection, 0.05f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.7f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Module, 0.25f, .is_non_code = 1); -} +DF_VIEW_SETUP_FUNCTION_DEF(call_stack){} DF_VIEW_CMD_FUNCTION_DEF(call_stack){} DF_VIEW_UI_FUNCTION_DEF(call_stack) { - ProfBeginFunction(); +#if 0 // TODO(rjf): @msgs DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); + if(wv->initialized == 0) + { + wv->initialized = 1; + df_watch_view_init(wv, view, DF_WatchViewFillKind_CallStack); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_FrameSelection, 0.05f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.7f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Module, 0.25f, .is_non_code = 1); + } df_watch_view_build(view, wv, 0, 10, rect); - ProfEnd(); +#endif } //////////////////////////////// @@ -6102,43 +6149,45 @@ DF_VIEW_UI_FUNCTION_DEF(modules) //////////////////////////////// //~ rjf: watch @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(watch) -{ - DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_init(wv, view, DF_WatchViewFillKind_Watch); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); -} +DF_VIEW_SETUP_FUNCTION_DEF(watch){} DF_VIEW_CMD_FUNCTION_DEF(watch){} DF_VIEW_UI_FUNCTION_DEF(watch) { - ProfBeginFunction(); - DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_build(view, ewv, 1*(view->query_string_size == 0), 10, rect); - ProfEnd(); +#if 0 // TODO(rjf): @msgs + DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); + if(wv->initialized == 0) + { + wv->initialized = 1; + df_watch_view_init(wv, view, DF_WatchViewFillKind_Watch); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); + } + df_watch_view_build(view, wv, 1*(view->query_string_size == 0), 10, rect); +#endif } //////////////////////////////// //~ rjf: locals @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(locals) -{ - DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_init(wv, view, DF_WatchViewFillKind_Locals); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); -} +DF_VIEW_SETUP_FUNCTION_DEF(locals) {} DF_VIEW_CMD_FUNCTION_DEF(locals) {} DF_VIEW_UI_FUNCTION_DEF(locals) { - ProfBeginFunction(); +#if 0 // TODO(rjf): @msgs DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); + if(wv->initialized == 0) + { + wv->initialized = 1; + df_watch_view_init(wv, view, DF_WatchViewFillKind_Locals); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); + } df_watch_view_build(view, wv, 0, 10, rect); - ProfEnd(); +#endif } //////////////////////////////// @@ -6146,103 +6195,98 @@ DF_VIEW_UI_FUNCTION_DEF(locals) DF_VIEW_SETUP_FUNCTION_DEF(registers) { - DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); - df_watch_view_init(wv, view, DF_WatchViewFillKind_Registers); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); - df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); } DF_VIEW_CMD_FUNCTION_DEF(registers) {} DF_VIEW_UI_FUNCTION_DEF(registers) { - ProfBeginFunction(); +#if 0 // TODO(rjf): @msgs DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); + if(wv->initialized == 0) + { + wv->initialized = 1; + df_watch_view_init(wv, view, DF_WatchViewFillKind_Registers); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); + df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); + } df_watch_view_build(view, wv, 0, 16, rect); - ProfEnd(); +#endif } //////////////////////////////// //~ rjf: globals @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(globals) +DF_VIEW_SETUP_FUNCTION_DEF(globals){} +DF_VIEW_CMD_FUNCTION_DEF(globals) {} +DF_VIEW_UI_FUNCTION_DEF(globals) { +#if 0 // TODO(rjf): @msgs DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_Globals); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); -} -DF_VIEW_CMD_FUNCTION_DEF(globals) {} -DF_VIEW_UI_FUNCTION_DEF(globals) -{ - ProfBeginFunction(); DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); df_watch_view_build(view, ewv, 0, 10, rect); - ProfEnd(); +#endif } //////////////////////////////// //~ rjf: thread_locals @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(thread_locals) +DF_VIEW_SETUP_FUNCTION_DEF(thread_locals){} +DF_VIEW_CMD_FUNCTION_DEF(thread_locals){} +DF_VIEW_UI_FUNCTION_DEF(thread_locals) { +#if 0 // TODO(rjf): @msgs DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_ThreadLocals); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); -} -DF_VIEW_CMD_FUNCTION_DEF(thread_locals) {} -DF_VIEW_UI_FUNCTION_DEF(thread_locals) -{ - ProfBeginFunction(); DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); df_watch_view_build(view, ewv, 0, 10, rect); - ProfEnd(); +#endif } //////////////////////////////// //~ rjf: types @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(types) +DF_VIEW_SETUP_FUNCTION_DEF(types) {} +DF_VIEW_CMD_FUNCTION_DEF(types) {} +DF_VIEW_UI_FUNCTION_DEF(types) { +#if 0 // TODO(rjf): @msgs DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_Types); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.25f); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.3f); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Type, 0.15f); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.30f); -} -DF_VIEW_CMD_FUNCTION_DEF(types) {} -DF_VIEW_UI_FUNCTION_DEF(types) -{ - ProfBeginFunction(); DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); df_watch_view_build(view, ewv, 0, 10, rect); - ProfEnd(); +#endif } //////////////////////////////// //~ rjf: procedures @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(procedures) +DF_VIEW_SETUP_FUNCTION_DEF(procedures) {} +DF_VIEW_CMD_FUNCTION_DEF(procedures) {} +DF_VIEW_UI_FUNCTION_DEF(procedures) { +#if 0 // TODO(rjf): @msgs DF_WatchViewState *wv = df_view_user_state(view, DF_WatchViewState); df_watch_view_init(wv, view, DF_WatchViewFillKind_Procedures); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Expr, 0.2f); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_Value, 0.6f); df_watch_view_column_alloc(wv, DF_WatchViewColumnKind_ViewRule, 0.2f); -} -DF_VIEW_CMD_FUNCTION_DEF(procedures) {} -DF_VIEW_UI_FUNCTION_DEF(procedures) -{ - ProfBeginFunction(); DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); df_watch_view_build(view, ewv, 0, 10, rect); - ProfEnd(); +#endif } //////////////////////////////// @@ -6251,10 +6295,12 @@ DF_VIEW_UI_FUNCTION_DEF(procedures) DF_VIEW_SETUP_FUNCTION_DEF(pending_file){} DF_VIEW_CMD_FUNCTION_DEF(pending_file) { +#if 0 // TODO(rjf): @msgs Temp scratch = scratch_begin(0, 0); //- rjf: determine if file is ready, and which viewer to use - String8 file_path = d_file_path_from_eval_string(scratch.arena, str8(view->query_buffer, view->query_string_size)); + String8 expr = get_view_expression(); + String8 file_path = d_file_path_from_eval_string(scratch.arena, expr); Rng1U64 file_range = r1u64(0, 1024); U128 file_hash = fs_hash_from_path_range(file_path, file_range, 0); B32 file_is_ready = 0; @@ -6333,12 +6379,15 @@ DF_VIEW_CMD_FUNCTION_DEF(pending_file) } scratch_end(scratch); +#endif } DF_VIEW_UI_FUNCTION_DEF(pending_file) { +#if 0 // TODO(rjf): @msgs view->loading_t = view->loading_t_target = 1.f; df_request_frame(); +#endif } //////////////////////////////// @@ -6346,14 +6395,17 @@ DF_VIEW_UI_FUNCTION_DEF(pending_file) DF_VIEW_SETUP_FUNCTION_DEF(text) { +#if 0 // TODO(rjf): @msgs DF_CodeViewState *cv = df_view_user_state(view, DF_CodeViewState); df_code_view_init(cv, view); df_view_equip_loading_info(view, 1, 0, 0); view->loading_t = view->loading_t_target = 1.f; +#endif } DF_VIEW_CMD_FUNCTION_DEF(text) { +#if 0 // TODO(rjf): @msgs DF_CodeViewState *cv = df_view_user_state(view, DF_CodeViewState); Temp scratch = scratch_begin(0, 0); HS_Scope *hs_scope = hs_scope_open(); @@ -6408,10 +6460,12 @@ DF_VIEW_CMD_FUNCTION_DEF(text) txt_scope_close(txt_scope); hs_scope_close(hs_scope); scratch_end(scratch); +#endif } DF_VIEW_UI_FUNCTION_DEF(text) { +#if 0 // TODO(rjf): @msgs DF_CodeViewState *cv = df_view_user_state(view, DF_CodeViewState); Temp scratch = scratch_begin(0, 0); HS_Scope *hs_scope = hs_scope_open(); @@ -6588,6 +6642,7 @@ DF_VIEW_UI_FUNCTION_DEF(text) txt_scope_close(txt_scope); hs_scope_close(hs_scope); scratch_end(scratch); +#endif } //////////////////////////////// @@ -6606,6 +6661,7 @@ struct DF_DisasmViewState DF_VIEW_SETUP_FUNCTION_DEF(disasm) { +#if 0 // TODO(rjf): @msgs DF_DisasmViewState *dv = df_view_user_state(view, DF_DisasmViewState); if(dv->initialized == 0) { @@ -6615,10 +6671,12 @@ DF_VIEW_SETUP_FUNCTION_DEF(disasm) dv->style_flags = DASM_StyleFlag_Addresses|DASM_StyleFlag_SourceFilesNames|DASM_StyleFlag_SourceLines|DASM_StyleFlag_SymbolNames; df_code_view_init(&dv->cv, view); } +#endif } DF_VIEW_CMD_FUNCTION_DEF(disasm) { +#if 0 // TODO(rjf): @msgs DF_DisasmViewState *dv = df_view_user_state(view, DF_DisasmViewState); Temp scratch = scratch_begin(0, 0); DASM_Scope *dasm_scope = dasm_scope_open(); @@ -6737,10 +6795,12 @@ DF_VIEW_CMD_FUNCTION_DEF(disasm) hs_scope_close(hs_scope); dasm_scope_close(dasm_scope); scratch_end(scratch); +#endif } DF_VIEW_UI_FUNCTION_DEF(disasm) { +#if 0 // TODO(rjf): @msgs DF_DisasmViewState *dv = df_view_user_state(view, DF_DisasmViewState); DF_CodeViewState *cv = &dv->cv; Temp scratch = scratch_begin(0, 0); @@ -6890,6 +6950,7 @@ DF_VIEW_UI_FUNCTION_DEF(disasm) dasm_scope_close(dasm_scope); hs_scope_close(hs_scope); scratch_end(scratch); +#endif } //////////////////////////////// @@ -6897,12 +6958,15 @@ DF_VIEW_UI_FUNCTION_DEF(disasm) DF_VIEW_SETUP_FUNCTION_DEF(output) { +#if 0 // TODO(rjf): @msgs DF_CodeViewState *cv = df_view_user_state(view, DF_CodeViewState); df_code_view_init(cv, view); +#endif } DF_VIEW_CMD_FUNCTION_DEF(output) { +#if 0 // TODO(rjf): @msgs DF_CodeViewState *cv = df_view_user_state(view, DF_CodeViewState); Temp scratch = scratch_begin(0, 0); HS_Scope *hs_scope = hs_scope_open(); @@ -6916,10 +6980,12 @@ DF_VIEW_CMD_FUNCTION_DEF(output) txt_scope_close(txt_scope); hs_scope_close(hs_scope); scratch_end(scratch); +#endif } DF_VIEW_UI_FUNCTION_DEF(output) { +#if 0 // TODO(rjf): @msgs DF_CodeViewState *cv = df_view_user_state(view, DF_CodeViewState); Temp scratch = scratch_begin(0, 0); HS_Scope *hs_scope = hs_scope_open(); @@ -6977,6 +7043,7 @@ DF_VIEW_UI_FUNCTION_DEF(output) txt_scope_close(txt_scope); hs_scope_close(hs_scope); scratch_end(scratch); +#endif } //////////////////////////////// @@ -6989,13 +7056,10 @@ struct DF_MemoryViewState B32 contain_cursor; }; -DF_VIEW_SETUP_FUNCTION_DEF(memory) -{ - DF_MemoryViewState *mv = df_view_user_state(view, DF_MemoryViewState); -} - +DF_VIEW_SETUP_FUNCTION_DEF(memory){} DF_VIEW_CMD_FUNCTION_DEF(memory) { +#if 0 // TODO(rjf): @msgs DF_MemoryViewState *mv = df_view_user_state(view, DF_MemoryViewState); for(D_CmdNode *n = cmds->first; n != 0; n = n->next) { @@ -7033,10 +7097,12 @@ DF_VIEW_CMD_FUNCTION_DEF(memory) }break; } } +#endif } DF_VIEW_UI_FUNCTION_DEF(memory) { +#if 0 // TODO(rjf): @msgs ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); HS_Scope *hs_scope = hs_scope_open(); @@ -7785,6 +7851,7 @@ DF_VIEW_UI_FUNCTION_DEF(memory) hs_scope_close(hs_scope); scratch_end(scratch); ProfEnd(); +#endif } //////////////////////////////// @@ -7905,14 +7972,11 @@ internal UI_BOX_CUSTOM_DRAW(df_bitmap_view_canvas_box_draw) } } -DF_VIEW_SETUP_FUNCTION_DEF(bitmap) -{ - df_view_equip_loading_info(view, 1, 0, 0); - view->loading_t = view->loading_t_target = 1.f; -} -DF_VIEW_CMD_FUNCTION_DEF(bitmap) {} +DF_VIEW_SETUP_FUNCTION_DEF(bitmap){} +DF_VIEW_CMD_FUNCTION_DEF(bitmap){} DF_VIEW_UI_FUNCTION_DEF(bitmap) { +#if 0 // TODO(rjf): @msgs Temp scratch = scratch_begin(0, 0); HS_Scope *hs_scope = hs_scope_open(); TEX_Scope *tex_scope = tex_scope_open(); @@ -8109,6 +8173,7 @@ DF_VIEW_UI_FUNCTION_DEF(bitmap) hs_scope_close(hs_scope); tex_scope_close(tex_scope); scratch_end(scratch); +#endif } //////////////////////////////// @@ -8140,6 +8205,7 @@ DF_VIEW_SETUP_FUNCTION_DEF(color_rgba) {} DF_VIEW_CMD_FUNCTION_DEF(color_rgba) {} DF_VIEW_UI_FUNCTION_DEF(color_rgba) { +#if 0 // TODO(rjf): @msgs Temp scratch = scratch_begin(0, 0); Vec2F32 dim = dim_2f32(rect); F32 padding = ui_top_font_size()*3.f; @@ -8181,6 +8247,7 @@ DF_VIEW_UI_FUNCTION_DEF(color_rgba) } } scratch_end(scratch); +#endif } //////////////////////////////// @@ -8233,14 +8300,11 @@ internal UI_BOX_CUSTOM_DRAW(df_geo3d_box_draw) dr_mesh(draw_data->vertex_buffer, draw_data->index_buffer, R_GeoTopologyKind_Triangles, R_GeoVertexFlag_TexCoord|R_GeoVertexFlag_Normals|R_GeoVertexFlag_RGB, r_handle_zero(), mat_4x4f32(1.f)); } -DF_VIEW_SETUP_FUNCTION_DEF(geo3d) -{ - df_view_equip_loading_info(view, 1, 0, 0); - view->loading_t = view->loading_t_target = 1.f; -} +DF_VIEW_SETUP_FUNCTION_DEF(geo3d){} DF_VIEW_CMD_FUNCTION_DEF(geo3d) {} DF_VIEW_UI_FUNCTION_DEF(geo3d) { +#if 0 // TODO(rjf): @msgs Temp scratch = scratch_begin(0, 0); GEO_Scope *geo_scope = geo_scope_open(); DF_Geo3DViewState *state = df_view_user_state(view, DF_Geo3DViewState); @@ -8350,6 +8414,7 @@ DF_VIEW_UI_FUNCTION_DEF(geo3d) geo_scope_close(geo_scope); scratch_end(scratch); +#endif } //////////////////////////////// @@ -8359,10 +8424,11 @@ DF_VIEW_SETUP_FUNCTION_DEF(exception_filters) {} DF_VIEW_CMD_FUNCTION_DEF(exception_filters) {} DF_VIEW_UI_FUNCTION_DEF(exception_filters) { +#if 0 // TODO(rjf): @msgs ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - String8 query = string; + String8 filter = get_view_filter(); //- rjf: get state typedef struct DF_ExceptionFiltersViewState DF_ExceptionFiltersViewState; @@ -8410,7 +8476,7 @@ DF_VIEW_UI_FUNCTION_DEF(exception_filters) { DF_ExceptionFiltersOptionChunkNode *node = opts_list.last; String8 name = push_str8f(scratch.arena, "0x%x %S", ctrl_exception_code_kind_code_table[k], ctrl_exception_code_kind_display_string_table[k]); - FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, query, name); + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, name); if(matches.count >= matches.needle_part_count) { if(node == 0 || node->count >= node->cap) @@ -8454,9 +8520,10 @@ DF_VIEW_UI_FUNCTION_DEF(exception_filters) scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; } UI_ScrollListSignal scroll_list_sig = {0}; + UI_ScrollPt2 scroll_pos = get_view_scroll_position(); UI_Focus(UI_FocusKind_On) UI_ScrollList(&scroll_list_params, - &view->scroll_pos.y, + &scroll_pos.y, &sv->cursor, 0, &visible_row_range, @@ -8485,9 +8552,11 @@ DF_VIEW_UI_FUNCTION_DEF(exception_filters) } } } + set_view_scroll_position(scroll_pos); scratch_end(scratch); ProfEnd(); +#endif } //////////////////////////////// @@ -8568,10 +8637,11 @@ DF_VIEW_SETUP_FUNCTION_DEF(settings){} DF_VIEW_CMD_FUNCTION_DEF(settings){} DF_VIEW_UI_FUNCTION_DEF(settings) { +#if 0 // TODO(rjf): @msgs ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - String8 query = string; + String8 filter = get_view_filter(); DF_Window *window = df_window_from_handle(d_regs()->window); ////////////////////////////// @@ -8591,7 +8661,7 @@ DF_VIEW_UI_FUNCTION_DEF(settings) DF_ThemePreset preset_apply_confirm; B32 category_opened[DF_SettingsItemKind_COUNT]; }; - DF_SettingsViewState *sv = df_view_user_state(view, DF_SettingsViewState); + DF_SettingsViewState *sv = get_view_state(DF_SettingsViewState); if(!sv->initialized) { sv->initialized = 1; @@ -8991,8 +9061,9 @@ DF_VIEW_UI_FUNCTION_DEF(settings) scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1; } UI_ScrollListSignal scroll_list_sig = {0}; + UI_ScrollPt2 scroll_pos = get_view_scroll_position(); UI_Focus(UI_FocusKind_On) - UI_ScrollList(&scroll_list_params, &view->scroll_pos.y, &sv->cursor, 0, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, &scroll_pos.y, &sv->cursor, 0, &visible_row_range, &scroll_list_sig) UI_Focus(UI_FocusKind_Null) { for(S64 row_num = visible_row_range.min; row_num <= visible_row_range.max && row_num < items.count; row_num += 1) @@ -9178,6 +9249,8 @@ DF_VIEW_UI_FUNCTION_DEF(settings) } } + set_view_scroll_position(scroll_pos); scratch_end(scratch); ProfEnd(); +#endif } diff --git a/src/dbg_frontend/dbg_frontend_views.h b/src/dbg_frontend/dbg_frontend_views.h index 38d6457b..e5204e0a 100644 --- a/src/dbg_frontend/dbg_frontend_views.h +++ b/src/dbg_frontend/dbg_frontend_views.h @@ -151,6 +151,30 @@ struct DF_WatchViewState B32 text_editing; }; +//////////////////////////////// +//~ rjf: View Building API + +//- rjf: getting view parameters +internal U128 get_view_id(void); // TODO(rjf): @msgs {(U64)view, d_hash_from_string(str8_struct(&view))} +internal String8 get_view_expression(void); +internal String8 get_view_filter(void); +internal UI_ScrollPt2 get_view_scroll_position(void); + +//- rjf: overwriting view parameters +internal void set_view_expression(String8 string); +internal void set_view_filter(String8 string); +internal void set_view_scroll_position(UI_ScrollPt2 pos); + +//- rjf: getting view resources (top-level view lifetime arena, extra arenas, user state slot) +internal Arena *get_view_arena(void); +internal void *get_or_push_view_state(U64 needed_size); +#define get_view_state(T) (T *)get_or_push_view_state(sizeof(T)) +internal Arena *push_view_extension_arena(void); + +//- rjf: view completion +internal void complete_view_(String8 string); +#define complete_view(...) + //////////////////////////////// //~ rjf: Code View Functions diff --git a/src/dbg_frontend/dbg_frontend_widgets.c b/src/dbg_frontend/dbg_frontend_widgets.c index 69b0805d..4a4f6eca 100644 --- a/src/dbg_frontend/dbg_frontend_widgets.c +++ b/src/dbg_frontend/dbg_frontend_widgets.c @@ -91,9 +91,52 @@ df_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U64 progress_v_t //////////////////////////////// //~ rjf: UI Widgets: Fancy Buttons +internal void +df_keybinding_buttons(String8 msg_name) +{ + Temp scratch = scratch_begin(0, 0); + + // rjf: gather all keybinding maps + typedef struct MapTask MapTask; + struct MapTask + { + MapTask *next; + MD_Node *root; + }; + MapTask *first_task = 0; + MapTask *last_task = 0; + for(EachEnumVal(DF_CfgSlot, slot)) + { + for(MD_EachNode(tln, df_state->cfg_slot_roots[slot]->first)) + { + if(!str8_match(tln->string, str8_lit("keybindings"), 0)) { continue; } + MapTask *t = push_array(scratch.arena, MapTask, 1); + SLLQueuePush(first_task, last_task, t); + t->root = tln; + } + } + + // rjf: build button for each binding + for(MapTask *t = first_task; t != 0; t = t->next) + { + for(MD_Node *map = md_node_from_chain_string(t->root->first, &md_nil_node, msg_name, 0); + !md_node_is_nil(map); + map = md_node_from_chain_string(map->next, &md_nil_node, msg_name, 0)) + { + // rjf: determine if this binding is being rebound + B32 rebinding_active_for_this_binding = (df_state->bind_change_active && + df_handle_match(df_state->bind_change_bind_handle, df_handle_from_cfg_tree(map)) && + str8_match(df_state->bind_change_msg_name, msg_name, 0)); + // TODO(rjf): @msgs + } + } + scratch_end(scratch); +} + internal void df_cmd_binding_buttons(D_CmdSpec *spec) { +#if 0 // TODO(rjf): @msgs Temp scratch = scratch_begin(0, 0); DF_BindingList bindings = df_bindings_from_spec(scratch.arena, spec); @@ -177,7 +220,7 @@ df_cmd_binding_buttons(D_CmdSpec *spec) { if((binding.key == OS_Key_Esc || binding.key == OS_Key_Delete) && binding.flags == 0) { - d_error(str8_lit("Cannot rebind; this command uses a reserved keybinding.")); + log_user_error(str8_lit("Cannot rebind; this command uses a reserved keybinding.")); } else { @@ -270,6 +313,7 @@ df_cmd_binding_buttons(D_CmdSpec *spec) } scratch_end(scratch); +#endif } internal UI_Signal @@ -281,6 +325,62 @@ df_menu_bar_button(String8 string) return sig; } +internal UI_Signal +df_msg_button(String8 msg_name) +{ + ui_set_next_hover_cursor(OS_Cursor_HandPoint); + ui_set_next_child_layout_axis(Axis2_X); + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackground| + UI_BoxFlag_DrawHotEffects| + UI_BoxFlag_DrawActiveEffects| + UI_BoxFlag_Clickable, + "###msg_%S", msg_name); + UI_Parent(box) UI_HeightFill UI_Padding(ui_em(1.f, 1.f)) + { + DF_MsgKind kind = df_msg_kind_from_string(msg_name); + DF_MsgKindInfo *info = &df_msg_kind_info_table[kind]; + DF_IconKind icon_kind = info->icon_kind; + if(icon_kind != DF_IconKind_Null) + { + DF_Font(DF_FontSlot_Icons) + UI_PrefWidth(ui_em(2.f, 1.f)) + UI_TextAlignment(UI_TextAlign_Center) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + { + ui_label(df_g_icon_kind_text_table[icon_kind]); + } + } + UI_PrefWidth(ui_text_dim(10, 1.f)) + { + UI_Flags(UI_BoxFlag_DrawTextFastpathCodepoint) + UI_FastpathCodepoint(box->fastpath_codepoint) + { + if(info->display_name.size != 0) + { + ui_label(info->display_name); + } + else + { + DF_Font(DF_FontSlot_Code) ui_label(msg_name); + } + } + ui_spacer(ui_pct(1, 0)); + ui_set_next_flags(UI_BoxFlag_Clickable); + ui_set_next_group_key(ui_key_zero()); + UI_PrefWidth(ui_children_sum(1)) + UI_NamedRow(str8_lit("###bindings")) + UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + UI_FastpathCodepoint(0) + { + df_keybinding_buttons(msg_name); + } + } + } + UI_Signal sig = ui_signal_from_box(box); + return sig; +} + internal UI_Signal df_cmd_spec_button(D_CmdSpec *spec) { @@ -330,7 +430,7 @@ df_cmd_spec_button(D_CmdSpec *spec) internal void df_cmd_list_menu_buttons(U64 count, D_CmdKind *cmds, U32 *fastpath_codepoints) { - Temp scratch = scratch_begin(0, 0); +#if 0 // TODO(rjf): @msgs for(U64 idx = 0; idx < count; idx += 1) { D_CmdSpec *spec = d_cmd_spec_from_kind(cmds[idx]); @@ -344,7 +444,25 @@ df_cmd_list_menu_buttons(U64 count, D_CmdKind *cmds, U32 *fastpath_codepoints) window->menu_bar_focused = 0; } } - scratch_end(scratch); +#endif +} + +internal void +df_msg_list_menu_buttons(U64 count, String8 *msg_names, U32 *fastpath_codepoints) +{ + for(U64 idx = 0; idx < count; idx += 1) + { + ui_set_next_fastpath_codepoint(fastpath_codepoints[idx]); + UI_Signal sig = df_msg_button(msg_names[idx]); + if(ui_clicked(sig)) + { + df_msg(DF_MsgKind_RunCommand, .string = msg_names[idx]); + ui_ctx_menu_close(); + MD_Node *window_cfg = df_cfg_tree_from_handle(df_regs()->window); + DF_Window *window = df_window_from_cfg_tree(window_cfg); + window->menu_bar_focused = 0; + } + } } internal UI_Signal @@ -580,6 +698,12 @@ df_entity_tooltips(D_Entity *entity) #endif } +internal void +df_cfg_tree_tooltips(MD_Node *cfg_tree) +{ + +} + internal void df_ctrl_entity_tooltips(CTRL_Entity *entity) { @@ -896,6 +1020,7 @@ df_entity_desc_button(D_Entity *entity, FuzzyMatchRangeList *name_matches, Strin internal void df_src_loc_button(String8 file_path, TxtPt point) { +#if 0 // TODO(rjf): @msgs Temp scratch = scratch_begin(0, 0); String8 filename = str8_skip_last_slash(file_path); @@ -933,6 +1058,7 @@ df_src_loc_button(String8 file_path, TxtPt point) ui_labelf("%S:%I64d:%I64d", file_path, point.line, point.column); } scratch_end(scratch); +#endif } //////////////////////////////// @@ -1327,8 +1453,8 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe line_num += 1, line_idx += 1) { CTRL_EntityList line_ips = params->line_ips[line_idx]; - D_EntityList line_bps = params->line_bps[line_idx]; - D_EntityList line_pins = params->line_pins[line_idx]; + MD_NodePtrList line_bps = params->line_bps[line_idx]; + MD_NodePtrList line_pins = params->line_pins[line_idx]; ui_set_next_hover_cursor(OS_Cursor_HandPoint); UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & DF_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num); UI_Parent(line_margin_box) @@ -1468,15 +1594,16 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } //- rjf: build margin breakpoint ui - for(D_EntityNode *n = line_bps.first; n != 0; n = n->next) + for(MD_NodePtrNode *n = line_bps.first; n != 0; n = n->next) { - D_Entity *bp = n->entity; - Vec4F32 bp_color = df_rgba_from_theme_color(DF_ThemeColor_Breakpoint); - if(bp->flags & D_EntityFlag_HasColor) + MD_Node *bp = n->v; + B32 bp_is_disabled = !md_node_is_nil(md_tag_from_string(bp, str8_lit("disabled"), 0)); + Vec4F32 bp_color = df_rgba_from_cfg_tree(bp); + if(bp_color.w == 0) { - bp_color = d_rgba_from_entity(bp); + bp_color = df_rgba_from_theme_color(DF_ThemeColor_Breakpoint); } - if(bp->disabled) + if(bp_is_disabled) { bp_color = v4f32(bp_color.x * 0.6f, bp_color.y * 0.6f, bp_color.z * 0.6f, bp_color.w * 0.6f); } @@ -1485,7 +1612,7 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe DF_BreakpointBoxDrawExtData *bp_draw = push_array(ui_build_arena(), DF_BreakpointBoxDrawExtData, 1); { bp_draw->color = bp_color; - bp_draw->alive_t = bp->alive_t; + bp_draw->alive_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "%p_alive_t", bp), 1.f); bp_draw->do_lines = df_setting_val_from_code(DF_SettingCode_BreakpointLines).s32; bp_draw->do_glow = df_setting_val_from_code(DF_SettingCode_BreakpointGlow).s32; if(d_regs()->file_path.size != 0) @@ -1525,41 +1652,36 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // rjf: bp hovering if(ui_hovering(bp_sig) && !df_drag_is_active()) { - df_entity_tooltips(bp); + df_cfg_tree_tooltips(bp); } // rjf: click => remove breakpoint if(ui_clicked(bp_sig)) { - d_cmd(D_CmdKind_RemoveBreakpoint, .entity = d_handle_from_entity(bp)); + df_msg(DF_MsgKind_RemoveBreakpoint, .cfg_tree = df_handle_from_cfg_tree(bp)); } // rjf: drag start if(ui_dragging(bp_sig) && !contains_2f32(bp_box->rect, ui_mouse())) { - DF_DragDropPayload payload = {0}; - payload.entity = d_handle_from_entity(bp); - df_drag_begin(&payload); + df_drag_begin(.cfg_tree = df_handle_from_cfg_tree(bp)); } // rjf: bp right-click menu if(ui_right_clicked(bp_sig)) { - D_Handle handle = d_handle_from_entity(bp); - ui_ctx_menu_open(df_state->entity_ctx_menu_key, bp_box->key, v2f32(0, bp_box->rect.y1-bp_box->rect.y0)); - DF_Window *window = df_window_from_handle(d_regs()->window); - window->entity_ctx_menu_entity = handle; + df_ctx_menu_open(bp_box, .cfg_tree = df_handle_from_cfg_tree(bp)); } } //- rjf: build margin watch pin ui - for(D_EntityNode *n = line_pins.first; n != 0; n = n->next) + for(MD_NodePtrNode *n = line_pins.first; n != 0; n = n->next) { - D_Entity *pin = n->entity; - Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_Text); - if(pin->flags & D_EntityFlag_HasColor) + MD_Node *pin = n->v; + Vec4F32 color = df_rgba_from_cfg_tree(pin); + if(color.w == 0) { - color = d_rgba_from_entity(pin); + color = df_rgba_from_theme_color(DF_ThemeColor_Text); } // rjf: build box for watch @@ -1583,30 +1705,25 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // rjf: watch hovering if(ui_hovering(pin_sig) && !df_drag_is_active()) { - df_entity_tooltips(pin); + df_cfg_tree_tooltips(pin); } // rjf: click => remove pin if(ui_clicked(pin_sig)) { - d_cmd(D_CmdKind_RemoveEntity, .entity = d_handle_from_entity(pin)); + df_msg(DF_MsgKind_RemoveEntity, .cfg_tree = df_handle_from_cfg_tree(pin)); } // rjf: drag start if(ui_dragging(pin_sig) && !contains_2f32(pin_box->rect, ui_mouse())) { - DF_DragDropPayload payload = {0}; - payload.entity = d_handle_from_entity(pin); - df_drag_begin(&payload); + df_drag_begin(.cfg_tree = df_handle_from_cfg_tree(pin)); } // rjf: watch right-click menu if(ui_right_clicked(pin_sig)) { - D_Handle handle = d_handle_from_entity(pin); - ui_ctx_menu_open(df_state->entity_ctx_menu_key, pin_box->key, v2f32(0, pin_box->rect.y1-pin_box->rect.y0)); - DF_Window *window = df_window_from_handle(d_regs()->window); - window->entity_ctx_menu_entity = handle; + df_ctx_menu_open(pin_box, .cfg_tree = df_handle_from_cfg_tree(pin)); } } } @@ -1615,10 +1732,10 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe UI_Signal line_margin_sig = ui_signal_from_box(line_margin_box); if(ui_clicked(line_margin_sig)) { - d_cmd(D_CmdKind_AddBreakpoint, - .file_path = d_regs()->file_path, - .text_point = txt_pt(line_num, 1), - .vaddr = params->line_vaddrs[line_idx]); + df_msg(DF_MsgKind_AddBreakpoint, + .file_path = df_regs()->file_path, + .cursor = txt_pt(line_num, 1), + .vaddr_range = r1u64(params->line_vaddrs[line_idx], params->line_vaddrs[line_idx])); } } } @@ -1785,16 +1902,16 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe line_num < params->line_num_range.max; line_num += 1, line_idx += 1) { - D_EntityList pins = params->line_pins[line_idx]; + MD_NodePtrList pins = params->line_pins[line_idx]; if(pins.count != 0) UI_Parent(line_extras_boxes[line_idx]) DF_Font(DF_FontSlot_Code) UI_FontSize(params->font_size) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) { - for(D_EntityNode *n = pins.first; n != 0; n = n->next) + for(MD_NodePtrNode *n = pins.first; n != 0; n = n->next) { - D_Entity *pin = n->entity; - String8 pin_expr = pin->string; + MD_Node *pin = n->v; + String8 pin_expr = pin->first->string; E_Eval eval = e_eval_from_string(scratch.arena, pin_expr); String8 eval_string = {0}; if(!e_type_key_match(e_type_key_zero(), eval.type_key)) @@ -1811,10 +1928,10 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe UI_BoxFlag_DrawBorder, pin_box_key); UI_Parent(pin_box) UI_PrefWidth(ui_text_dim(10, 1)) { - Vec4F32 pin_color = df_rgba_from_theme_color(DF_ThemeColor_CodeDefault); - if(pin->flags & D_EntityFlag_HasColor) + Vec4F32 pin_color = df_rgba_from_cfg_tree(pin); + if(pin_color.w == 0) { - pin_color = d_rgba_from_entity(pin); + pin_color = df_rgba_from_theme_color(DF_ThemeColor_CodeDefault); } UI_PrefWidth(ui_em(1.5f, 1.f)) DF_Font(DF_FontSlot_Icons) @@ -1825,15 +1942,11 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe UI_Signal sig = ui_buttonf("%S###pin_nub", df_g_icon_kind_text_table[DF_IconKind_Pin]); if(ui_dragging(sig) && !contains_2f32(sig.box->rect, ui_mouse())) { - DF_DragDropPayload payload = {0}; - payload.entity = d_handle_from_entity(pin); - df_drag_begin(&payload); + df_drag_begin(.cfg_tree = df_handle_from_cfg_tree(pin)); } if(ui_right_clicked(sig)) { - ui_ctx_menu_open(df_state->entity_ctx_menu_key, sig.box->key, v2f32(0, sig.box->rect.y1-sig.box->rect.y0)); - DF_Window *window = df_window_from_handle(d_regs()->window); - window->entity_ctx_menu_entity = d_handle_from_entity(pin); + df_ctx_menu_open(pin_box, .cfg_tree = df_handle_from_cfg_tree(pin)); } } df_code_label(0.8f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), pin_expr); @@ -1921,7 +2034,7 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe UI_Signal priority_margin_container_sig = ui_signal_from_box(priority_margin_container_box); UI_Signal catchall_margin_container_sig = ui_signal_from_box(catchall_margin_container_box); UI_Signal text_container_sig = ui_signal_from_box(text_container_box); - D_Entity *line_drag_entity = &d_nil_entity; + CTRL_Entity *line_drag_entity = &ctrl_entity_nil; { //- rjf: determine mouse drag range TxtRng mouse_drag_rng = txt_rng(mouse_pt, mouse_pt); @@ -1991,6 +2104,7 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe //- rjf: dragging threads, breakpoints, or watch pins over this slice -> // drop target +#if 0 // TODO(rjf): @msgs if(df_drag_is_active() && contains_2f32(clipped_top_container_rect, ui_mouse())) { DF_DragDropPayload *payload = &df_drag_drop_payload; @@ -2002,8 +2116,10 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe line_drag_entity = entity; } } +#endif //- rjf: drop target is dropped -> process +#if 0 // TODO(rjf): @msgs { DF_DragDropPayload payload = {0}; if(!d_entity_is_nil(line_drag_entity) && df_drag_drop(&payload) && contains_1s64(params->line_num_range, mouse_pt.line)) @@ -2046,6 +2162,7 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } } } +#endif //- rjf: commit text container signal to main output result.base = text_container_sig; @@ -2136,6 +2253,7 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe ////////////////////////////// //- rjf: dragging entity which applies to lines over this slice -> visualize // +#if 0 // TODO(rjf): @msgs if(!d_entity_is_nil(line_drag_entity) && contains_2f32(clipped_top_container_rect, ui_mouse())) { Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_DropSiteOverlay); @@ -2156,6 +2274,7 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } ui_box_equip_draw_bucket(text_container_box, bucket); } +#endif ////////////////////////////// //- rjf: (cursor*mark*list(flash_range)) -> list(text_range*color) diff --git a/src/dbg_frontend/dbg_frontend_widgets.h b/src/dbg_frontend/dbg_frontend_widgets.h index f83af39c..012539cb 100644 --- a/src/dbg_frontend/dbg_frontend_widgets.h +++ b/src/dbg_frontend/dbg_frontend_widgets.h @@ -42,9 +42,9 @@ struct DF_CodeSliceParams String8 *line_text; Rng1U64 *line_ranges; TXT_TokenArray *line_tokens; - D_EntityList *line_bps; + MD_NodePtrList *line_bps; CTRL_EntityList *line_ips; - D_EntityList *line_pins; + MD_NodePtrList *line_pins; U64 *line_vaddrs; D_LineList *line_infos; DI_KeyList relevant_dbgi_keys; @@ -84,13 +84,17 @@ internal void df_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U6 //////////////////////////////// //~ rjf: UI Widgets: Fancy Buttons +internal void df_keybinding_buttons(String8 msg_name); internal void df_cmd_binding_buttons(D_CmdSpec *spec); internal UI_Signal df_menu_bar_button(String8 string); +internal UI_Signal df_msg_button(String8 msg_name); internal UI_Signal df_cmd_spec_button(D_CmdSpec *spec); internal void df_cmd_list_menu_buttons(U64 count, D_CmdKind *cmds, U32 *fastpath_codepoints); +internal void df_msg_list_menu_buttons(U64 count, String8 *msg_names, U32 *fastpath_codepoints); internal UI_Signal df_icon_button(DF_IconKind kind, FuzzyMatchRangeList *matches, String8 string); internal UI_Signal df_icon_buttonf(DF_IconKind kind, FuzzyMatchRangeList *matches, char *fmt, ...); internal void df_entity_tooltips(D_Entity *entity); +internal void df_cfg_tree_tooltips(MD_Node *cfg_tree); internal void df_ctrl_entity_tooltips(CTRL_Entity *entity); internal UI_Signal df_entity_desc_button(D_Entity *entity, FuzzyMatchRangeList *name_matches, String8 fuzzy_query, B32 is_implicit); internal void df_src_loc_button(String8 file_path, TxtPt point); diff --git a/src/dbg_frontend/generated/dbg_frontend.meta.c b/src/dbg_frontend/generated/dbg_frontend.meta.c index 366f46b6..69c149c3 100644 --- a/src/dbg_frontend/generated/dbg_frontend.meta.c +++ b/src/dbg_frontend/generated/dbg_frontend.meta.c @@ -37,11 +37,12 @@ Rng1U64 df_reg_slot_range_table[29] = {OffsetOf(DF_Regs, os_event), OffsetOf(DF_Regs, os_event) + sizeof(OS_Event *)}, }; -DF_MsgKindInfo df_msg_kind_info_table[135] = +DF_MsgKindInfo df_msg_kind_info_table[138] = { {0}, {str8_lit_comp("exit"), str8_lit_comp("Exit"), str8_lit_comp(""), str8_lit_comp("Exit"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("run_command"), str8_lit_comp("RunCommand"), str8_lit_comp(""), str8_lit_comp("RunCommand"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, +{str8_lit_comp("run_command"), str8_lit_comp("SetCurrentPath"), str8_lit_comp(""), str8_lit_comp("SetCurrentPath"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("toggle_dev_menu"), str8_lit_comp("ToggleDevMenu"), str8_lit_comp(""), str8_lit_comp("ToggleDevMenu"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("register_as_jit_debugger"), str8_lit_comp("RegisterAsJITDebugger"), str8_lit_comp(""), str8_lit_comp("RegisterAsJITDebugger"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("log_marker"), str8_lit_comp("LogMarker"), str8_lit_comp(""), str8_lit_comp("LogMarker"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, @@ -74,6 +75,7 @@ DF_MsgKindInfo df_msg_kind_info_table[135] = {str8_lit_comp("toggle_breakpoint_at_cursor"), str8_lit_comp("ToggleBreakpointAtCursor"), str8_lit_comp(""), str8_lit_comp("ToggleBreakpointAtCursor"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("toggle_watch_pin_at_cursor"), str8_lit_comp("ToggleWatchPinAtCursor"), str8_lit_comp(""), str8_lit_comp("ToggleWatchPinAtCursor"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("toggle_watch_expression_at_cursor"), str8_lit_comp("ToggleWatchExpressionAtCursor"), str8_lit_comp(""), str8_lit_comp("ToggleWatchExpressionAtCursor"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, +{str8_lit_comp("toggle_watch_expression_at_mouse"), str8_lit_comp("ToggleWatchExpressionAtMouse"), str8_lit_comp(""), str8_lit_comp("ToggleWatchExpressionAtMouse"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("open_window"), str8_lit_comp("OpenWindow"), str8_lit_comp(""), str8_lit_comp("OpenWindow"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("close_window"), str8_lit_comp("CloseWindow"), str8_lit_comp(""), str8_lit_comp("CloseWindow"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("toggle_fullscreen"), str8_lit_comp("ToggleFullscreen"), str8_lit_comp(""), str8_lit_comp("ToggleFullscreen"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, @@ -116,6 +118,7 @@ DF_MsgKindInfo df_msg_kind_info_table[135] = {str8_lit_comp("tab_bar_top"), str8_lit_comp("TabBarTop"), str8_lit_comp(""), str8_lit_comp("TabBarTop"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("tab_bar_bottom"), str8_lit_comp("TabBarBottom"), str8_lit_comp(""), str8_lit_comp("TabBarBottom"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("filter"), str8_lit_comp("Filter"), str8_lit_comp(""), str8_lit_comp("Filter"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, +{str8_lit_comp("set_filter"), str8_lit_comp("SetFilter"), str8_lit_comp(""), str8_lit_comp("SetFilter"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("clear_filter"), str8_lit_comp("ClearFilter"), str8_lit_comp(""), str8_lit_comp("ClearFilter"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("apply_filter"), str8_lit_comp("ApplyFilter"), str8_lit_comp(""), str8_lit_comp("ApplyFilter"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, {str8_lit_comp("reset_to_default_panels"), str8_lit_comp("ResetToDefaultPanels"), str8_lit_comp(""), str8_lit_comp("ResetToDefaultPanels"), ((0*DF_MsgKindFlag_ListInUI)|(0*DF_MsgKindFlag_ListInIPCDocs)), {(0*DF_MsgQueryFlag_AllowFiles)|(0*DF_MsgQueryFlag_AllowFolders)|(0*DF_MsgQueryFlag_KeepOldInput)|(0*DF_MsgQueryFlag_SelectOldInput)|(0*DF_MsgQueryFlag_CodeInput)|(0*DF_MsgQueryFlag_Required), D_RegSlot_Null, D_EntityKind_Nil}}, diff --git a/src/dbg_frontend/generated/dbg_frontend.meta.h b/src/dbg_frontend/generated/dbg_frontend.meta.h index 04846545..60b45c98 100644 --- a/src/dbg_frontend/generated/dbg_frontend.meta.h +++ b/src/dbg_frontend/generated/dbg_frontend.meta.h @@ -80,6 +80,7 @@ DF_MsgKind_RunToCursor, DF_MsgKind_SetNextStatement, DF_MsgKind_Exit, DF_MsgKind_RunCommand, +DF_MsgKind_SetCurrentPath, DF_MsgKind_ToggleDevMenu, DF_MsgKind_RegisterAsJITDebugger, DF_MsgKind_LogMarker, @@ -112,6 +113,7 @@ DF_MsgKind_GoToNameAtCursor, DF_MsgKind_ToggleBreakpointAtCursor, DF_MsgKind_ToggleWatchPinAtCursor, DF_MsgKind_ToggleWatchExpressionAtCursor, +DF_MsgKind_ToggleWatchExpressionAtMouse, DF_MsgKind_OpenWindow, DF_MsgKind_CloseWindow, DF_MsgKind_ToggleFullscreen, @@ -154,6 +156,7 @@ DF_MsgKind_CloseTab, DF_MsgKind_TabBarTop, DF_MsgKind_TabBarBottom, DF_MsgKind_Filter, +DF_MsgKind_SetFilter, DF_MsgKind_ClearFilter, DF_MsgKind_ApplyFilter, DF_MsgKind_ResetToDefaultPanels, @@ -622,7 +625,7 @@ DF_VIEW_RULE_ROW_UI_FUNCTION_DEF(checkbox); DF_VIEW_RULE_ROW_UI_FUNCTION_DEF(color_rgba); C_LINKAGE_BEGIN extern Rng1U64 df_reg_slot_range_table[29]; -extern DF_MsgKindInfo df_msg_kind_info_table[135]; +extern DF_MsgKindInfo df_msg_kind_info_table[138]; extern DF_StringBindingPair df_g_default_binding_table[110]; extern String8 df_g_binding_version_remap_old_name_table[7]; extern String8 df_g_binding_version_remap_new_name_table[7]; diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index aa48af13..340ec7e1 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -239,6 +239,7 @@ e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name) { result.mode = eval.mode; result.space = eval.space; + result.type_key = member->type_key; result.code = eval.code; result.msgs = eval.msgs; @@ -264,3 +265,23 @@ e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name) } return result; } + +internal F32 +e_f32_from_eval(E_Eval eval) +{ + F32 result = 0; + E_TypeKind kind = e_type_kind_from_key(e_type_unwrap(eval.type_key)); + if(e_type_kind_is_integer(kind)) + { + result = (F32)eval.value.s64; + } + else if(kind == E_TypeKind_F64) + { + result = (F32)eval.value.f64; + } + else if(kind == E_TypeKind_F32) + { + result = eval.value.f32; + } + return result; +} diff --git a/src/eval/eval_bundles.h b/src/eval/eval_bundles.h index 957ff123..6461b93c 100644 --- a/src/eval/eval_bundles.h +++ b/src/eval/eval_bundles.h @@ -29,5 +29,6 @@ internal E_Eval e_dynamically_typed_eval_from_eval(E_Eval eval); internal E_Eval e_value_eval_from_eval(E_Eval eval); internal E_Eval e_element_eval_from_array_eval_index(E_Eval eval, U64 index); internal E_Eval e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name); +internal F32 e_f32_from_eval(E_Eval eval); #endif // EVAL_BUNDLES_H diff --git a/src/mdesk/mdesk.c b/src/mdesk/mdesk.c index 7db16415..8568b7b7 100644 --- a/src/mdesk/mdesk.c +++ b/src/mdesk/mdesk.c @@ -212,7 +212,7 @@ md_node_push_child(MD_Node *parent, MD_Node *node) } internal void -md_node_unhook_child(MD_Node *node) +md_unhook_child(MD_Node *node) { MD_Node *parent = node->parent; if(!md_node_is_nil(parent)) @@ -236,7 +236,7 @@ md_node_push_tag(MD_Node *parent, MD_Node *node) } internal void -md_node_unhook_tag(MD_Node *node) +md_unhook_tag(MD_Node *node) { MD_Node *parent = node->parent; if(!md_node_is_nil(parent)) @@ -393,6 +393,21 @@ md_tag_arg_from_string(MD_Node *node, String8 tag_string, StringMatchFlags tag_s return arg; } +internal MD_Node * +md_ancestor_from_string(MD_Node *node, String8 string, StringMatchFlags flags) +{ + MD_Node *result = &md_nil_node; + for(MD_Node *n = node->parent; !md_node_is_nil(n); n = n->parent) + { + if(str8_match(n->string, string, flags)) + { + result = n; + break; + } + } + return result; +} + internal B32 md_node_has_child(MD_Node *node, String8 string, StringMatchFlags flags) { @@ -552,6 +567,18 @@ md_tree_copy(Arena *arena, MD_Node *src_root) return dst_root; } +//- rjf: node pointer lists + +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; +} + + //////////////////////////////// //~ rjf: Text -> Tokens Functions diff --git a/src/mdesk/mdesk.h b/src/mdesk/mdesk.h index f2d728ac..467674ad 100644 --- a/src/mdesk/mdesk.h +++ b/src/mdesk/mdesk.h @@ -193,6 +193,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 @@ -254,7 +269,8 @@ internal MD_NodeFlags md_node_flags_from_token_flags(MD_TokenFlags flags); internal B32 md_node_is_nil(MD_Node *node); //- rjf: iteration -#define MD_EachNode(it, first) MD_Node *it = first; !md_node_is_nil(it); it = it->next +#define MD_EachNode(it, first_in_chain) MD_Node *it = first_in_chain; !md_node_is_nil(it); it = it->next +#define MD_EachNodeRef(it, first_in_chain) MD_Node *ref_it = first_in_chain, *it = first_in_chain->first; !md_node_is_nil(ref_it) && !md_node_is_nil(it); (ref_it = ref_it->next, it = ref_it->first) internal MD_NodeRec md_node_rec_depth_first(MD_Node *node, MD_Node *subtree_root, U64 child_off, U64 sib_off); #define md_node_rec_depth_first_pre(node, subtree_root) md_node_rec_depth_first((node), (subtree_root), OffsetOf(MD_Node, first), OffsetOf(MD_Node, next)) #define md_node_rec_depth_first_pre_rev(node, subtree_root) md_node_rec_depth_first((node), (subtree_root), OffsetOf(MD_Node, last), OffsetOf(MD_Node, prev)) @@ -263,10 +279,10 @@ internal MD_NodeRec md_node_rec_depth_first(MD_Node *node, MD_Node *subtree_root internal MD_Node *md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset); internal void md_node_insert_child(MD_Node *parent, MD_Node *prev_child, MD_Node *node); internal void md_node_push_child(MD_Node *parent, MD_Node *node); -internal void md_node_unhook_child(MD_Node *node); +internal void md_unhook_child(MD_Node *node); internal void md_node_insert_tag(MD_Node *parent, MD_Node *prev_child, MD_Node *node); internal void md_node_push_tag(MD_Node *parent, MD_Node *node); -internal void md_node_unhook_tag(MD_Node *node); +internal void md_unhook_tag(MD_Node *node); //- rjf: tree building helpers internal MD_Node *md_push_list(Arena *arena); @@ -285,6 +301,7 @@ internal MD_Node * md_child_from_index(MD_Node *node, U64 index); internal MD_Node * md_tag_from_index(MD_Node *node, U64 index); internal MD_Node * md_tag_arg_from_index(MD_Node *node, String8 tag_string, StringMatchFlags flags, U64 index); internal MD_Node * md_tag_arg_from_string(MD_Node *node, String8 tag_string, StringMatchFlags tag_str_flags, String8 arg_string, StringMatchFlags arg_str_flags); +internal MD_Node * md_ancestor_from_string(MD_Node *node, String8 string, StringMatchFlags flags); internal B32 md_node_has_child(MD_Node *node, String8 string, StringMatchFlags flags); internal B32 md_node_has_tag(MD_Node *node, String8 string, StringMatchFlags flags); internal U64 md_child_count_from_node(MD_Node *node); @@ -298,6 +315,9 @@ internal B32 md_node_match(MD_Node *a, MD_Node *b, StringMatchFlags flags); //- rjf: tree duplication internal MD_Node *md_tree_copy(Arena *arena, MD_Node *src_root); +//- rjf: node pointer lists +internal void md_node_ptr_list_push(Arena *arena, MD_NodePtrList *list, MD_Node *node); + //////////////////////////////// //~ rjf: Text -> Tokens Functions diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index eff93c1b..d3544443 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -616,10 +616,6 @@ global U64 ipc_s2m_ring_read_pos = 0; global OS_Handle ipc_s2m_ring_mutex = {0}; global OS_Handle ipc_s2m_ring_cv = {0}; -//- rjf: main thread log -global Log *main_thread_log = 0; -global String8 main_thread_log_path = {0}; - //////////////////////////////// //~ rjf: IPC Signaler Thread @@ -671,35 +667,7 @@ internal B32 frame(void) { ProfBeginFunction(); - Temp scratch = scratch_begin(0, 0); - - //- rjf: begin logging - if(main_thread_log == 0) - { - main_thread_log = log_alloc(); - String8 user_program_data_path = os_get_process_info()->user_program_data_path; - String8 user_data_folder = push_str8f(scratch.arena, "%S/raddbg/logs", user_program_data_path); - main_thread_log_path = push_str8f(d_state->arena, "%S/ui_thread.raddbg_log", user_data_folder); - os_make_directory(user_data_folder); - os_write_data_to_file_path(main_thread_log_path, str8_zero()); - } - log_select(main_thread_log); - log_scope_begin(); - - //- rjf: do frontend frame df_frame(); - - //- rjf: end logging - { - LogScopeResult log = log_scope_end(scratch.arena); - os_append_data_to_file_path(main_thread_log_path, log.strings[LogMsgKind_Info]); - if(log.strings[LogMsgKind_UserError].size != 0) - { - d_error(log.strings[LogMsgKind_UserError]); - } - } - - scratch_end(scratch); ProfEnd(); return df_state->quit; } @@ -910,30 +878,21 @@ entry_point(CmdLine *cmd_line) break; } } - if(dst_window != 0) D_RegsScope + if(dst_window != 0 && dst_window != &df_nil_window) DF_RegsScope(.window = dst_window->handle) { - df_regs_set_window(dst_window); dst_window->window_temporarily_focused_ipc = 1; U64 first_space_pos = str8_find_needle(msg, 0, str8_lit(" "), 0); String8 msg_kind_name = lower_from_str8(scratch.arena, str8_prefix(msg, first_space_pos)); String8 args_string = str8_skip(msg, first_space_pos); args_string = str8_skip_chop_whitespace(args_string); - D_MsgKind d_kind = d_msg_kind_from_string(msg_kind_name); - DF_MsgKind df_kind = df_msg_kind_from_string(msg_kind_name); - DF_MsgQuery query = (d_kind != D_MsgKind_Null ? df_d_msg_kind_info_table[d_kind].query : - df_kind != DF_MsgKind_Null? df_msg_kind_info_table[df_kind].query : - (DF_MsgQuery){0}); + DF_MsgKind kind = df_msg_kind_from_string(msg_kind_name); + DF_MsgQuery query = df_msg_kind_info_table[kind].query; df_regs_set_from_query_slot_string(query.slot, args_string); - if(d_kind != D_MsgKind_Null) + if(kind != DF_MsgKind_Null) { - d_msg(d_kind); + df_msg(kind); } - if(df_kind != DF_MsgKind_Null) - { - df_msg(df_kind); - } - if(d_kind == D_MsgKind_Null && - df_kind == DF_MsgKind_Null) + else { log_user_errorf("\"%S\" is not a command.", msg_kind_name); }