diff --git a/project.4coder b/project.4coder index 7ad1d001..b93c01d4 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", .linux = "", .out = "*compilation*", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, }, + .f1 = { .win = "build raddbg telemetry clang", .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 20013d90..5d4de4ad 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -1660,8 +1660,6 @@ 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) { @@ -1791,14 +1789,11 @@ 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. @@ -1867,15 +1862,10 @@ 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) { @@ -2017,8 +2007,6 @@ d_entity_from_u64_and_kind(U64 u64, D_EntityKind kind) return result; } -#endif - //- rjf: entity freezing state internal void @@ -2643,7 +2631,6 @@ 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 @@ -2715,7 +2702,6 @@ 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 @@ -3353,7 +3339,6 @@ 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 @@ -3382,7 +3367,6 @@ 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; } @@ -3406,7 +3390,6 @@ 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 { @@ -3508,7 +3491,6 @@ 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); } @@ -5899,17 +5881,16 @@ internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena) { DI_KeyList dbgis = {0}; - 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_EntityList modules = d_query_cached_entity_list_with_kind(D_EntityKind_Module); + for(D_EntityNode *n = modules.first; n != 0; n = n->next) { - CTRL_Entity *module = n->v; - DI_Key key = ctrl_dbgi_key_from_module(module); + D_Entity *module = n->entity; + DI_Key key = d_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) { @@ -5924,11 +5905,9 @@ 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) { @@ -5945,7 +5924,6 @@ d_entity_from_expand_key_and_kind(D_ExpandKey key, D_EntityKind kind) } return result; } -#endif //- rjf: per-run caches @@ -6599,7 +6577,6 @@ 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)) @@ -6615,7 +6592,6 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) } } } -#endif }break; //- rjf: entity creation/deletion @@ -6773,7 +6749,6 @@ 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; @@ -6793,11 +6768,9 @@ 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); @@ -6809,7 +6782,6 @@ 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 @@ -6819,7 +6791,6 @@ 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; @@ -6844,7 +6815,6 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) d_entity_equip_name(entity, string); } }break; -#endif //- rjf: memory @@ -6949,7 +6919,6 @@ 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) { @@ -6972,7 +6941,6 @@ d_tick(Arena *arena, DI_Scope *di_scope, F32 dt) }break; } } -#endif scratch_end(scratch); } @@ -9284,7 +9252,6 @@ 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) { @@ -9297,7 +9264,6 @@ 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 8b103fda..7f8ed2ed 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -1293,15 +1293,12 @@ 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); @@ -1310,7 +1307,6 @@ 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); @@ -1341,7 +1337,6 @@ 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); @@ -1352,7 +1347,6 @@ 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 @@ -1557,20 +1551,14 @@ 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 bb023b68..22f574f9 100644 --- a/src/dbg_frontend/dbg_frontend.mdesk +++ b/src/dbg_frontend/dbg_frontend.mdesk @@ -78,11 +78,10 @@ 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 ""} @@ -125,10 +124,7 @@ 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 ""} @@ -197,8 +193,7 @@ 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 ""} - {SetFilter "" set_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 ""} {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 a64476d3..d222c5bb 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 // NOTE(rjf): @msgs +#if 0 // TODO(rjf): @msgs internal D_CmdParams df_cmd_params_from_window(DF_Window *window) { @@ -625,6 +625,7 @@ internal void df_drag_kill(void) { df_state->drag_drop_state = DF_DragDropState_Null; + MemoryZeroStruct(&df_drag_drop_payload); } internal void @@ -648,19 +649,6 @@ 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 @@ -900,7 +888,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 - // NOTE(rjf): @msgs DF_ViewSetupFunctionType *view_setup = spec->info.setup_hook; + // TODO(rjf): @msgs DF_ViewSetupFunctionType *view_setup = spec->info.setup_hook; { for(DF_ArenaExt *ext = view->first_arena_ext; ext != 0; ext = ext->next) { @@ -931,7 +919,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; - // 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)); + // 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)); } internal void @@ -1416,7 +1404,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 = df_panel_tree_from_window_cfg(window_cfg); + MD_Node *panels_cfg = md_child_from_string(window_cfg, str8_lit("panels"), 0); if(!md_node_is_nil(panels_cfg)) { PanelTask *start_task = push_array(scratch.arena, PanelTask, 1); @@ -1425,7 +1413,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_tag_from_string(t->root, str8_lit("selected"), 0))) + if(!md_node_is_nil(md_child_from_string(t->root, str8_lit("selected"), 0))) { focused_panel_cfg = t->root; } @@ -2162,12 +2150,14 @@ 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 - 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) + if(str8_match(drag_cfg->string, str8_lit("tab"), 0)) DF_RegsScope { - MD_Node *expr_cfg = tab_cfg->first; + df_regs_set_view(drag_cfg); + MD_Node *expr_cfg = drag_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(); @@ -2322,7 +2312,6 @@ 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:"); @@ -2347,7 +2336,6 @@ df_window_frame(MD_Node *window_cfg) indent += rec.push_count; indent -= rec.pop_count; } -#endif } } @@ -2942,9 +2930,10 @@ 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) { - DF_RegsScope(.tab = ws->tab_ctx_menu_view) + MD_Node *tab_cfg = df_cfg_tree_from_handle(ws->tab_ctx_menu_view); + DF_RegsScope { - MD_Node *tab_cfg = df_cfg_tree_from_handle(df_regs()->tab); + df_regs_set_view(tab_cfg); 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; @@ -3663,9 +3652,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(EachEnumVal(DF_CfgSlot, slot)) + for(MD_EachNode(root_ref, df_state->cfg_root->first)) { - for(MD_EachNode(tln, df_state->cfg_slot_roots[slot]->first)) + for(MD_EachNode(tln, root_ref->first->first)) { if(!str8_match(tln->string, str8_lit("target"), 0)) { @@ -3877,7 +3866,6 @@ 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) { @@ -3904,7 +3892,6 @@ df_window_frame(MD_Node *window_cfg) } scratch_end(scratch); } -#endif } //- rjf: center column @@ -3915,7 +3902,7 @@ df_window_frame(MD_Node *window_cfg) { Temp scratch = scratch_begin(0, 0); D_EntityList targets = d_push_active_target_list(scratch.arena); - CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + D_EntityList processes = d_query_cached_entity_list_with_kind(D_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())); @@ -4270,7 +4257,6 @@ 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); @@ -4294,7 +4280,7 @@ df_window_frame(MD_Node *window_cfg) }break; } } - if(error_t > 0.01f) + if(ws->error_t > 0.01f) { UI_Palette *blended_scheme = push_array(ui_build_arena(), UI_Palette, 1); MemoryCopyStruct(blended_scheme, palette); @@ -4302,7 +4288,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]) * error_t; + blended_scheme->colors[code].v[idx] += (negative_scheme->colors[code].v[idx] - blended_scheme->colors[code].v[idx]) * ws->error_t; } } palette = blended_scheme; @@ -4357,22 +4343,20 @@ 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_msg_kind_info_table[msg_kind].display_name); + ui_labelf("Currently rebinding \"%S\" hotkey", df_state->bind_change_cmd_spec->info.display_name); } // rjf: error visualization - else if(df_state->error_num_seconds_shown < df_state->error_num_seconds_to_show) + else if(ws->error_t >= 0.01f) { - df_state->error_num_seconds_shown += df_state->dt; + ws->error_t -= d_dt()/8.f; df_request_frame(); - String8 error_string = df_state->error_string; + String8 error_string = str8(ws->error_buffer, ws->error_string_size); if(error_string.size != 0) { ui_set_next_pref_width(ui_children_sum(1)); @@ -4612,7 +4596,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 // NOTE(rjf): @msgs +#if 0 // TODO(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); @@ -5351,9 +5335,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->first->string); + selected_tab_spec = df_view_spec_from_string(selected_tab_cfg->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->first->string); + tab_expr_string = raw_from_escaped_string(scratch.arena, selected_tab_cfg->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); @@ -5368,9 +5352,12 @@ df_window_frame(MD_Node *window_cfg) ////////////////////////// //- rjf: push registers for this panel // - 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)); + 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); + } ////////////////////////// //- rjf: calculate UI rectangles @@ -5420,9 +5407,8 @@ df_window_frame(MD_Node *window_cfg) //- rjf: build combined split+movetab drag/drop sites // { - 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())) + 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())) { 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); @@ -6784,11 +6770,10 @@ df_window_frame(MD_Node *window_cfg) } //- rjf: draw border/overlay color to signify error - 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) + if(ws->error_t > 0.01f) { Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_NegativePopButtonBackground); - color.w *= error_t; + color.w *= ws->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); @@ -7511,368 +7496,29 @@ 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)cfg; - handle.u64[1] = cfg->user_gen; + 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; return handle; } internal MD_Node * df_cfg_tree_from_handle(DF_Handle handle) { - MD_Node *cfg_tree = (MD_Node *)handle.u64[0]; - if(cfg_tree->user_gen != handle.u64[1]) + 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]) { cfg_tree = &md_nil_node; } return 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 +//- rjf: string <-> cfg tree internal MD_Node * df_cfg_tree_from_key(String8 string) @@ -7981,63 +7627,98 @@ df_key_from_cfg_tree(Arena *arena, MD_Node *node) return result; } -//- rjf: config tree lookups +//- 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_last_from_key(MD_Node *root, String8 key) +df_cfg_tree_store(MD_Node *parent, MD_Node *prev_child, String8 string) { - MD_Node *result = &md_nil_node; - for(MD_Node *tln = root->last; !md_node_is_nil(tln); tln = tln->prev) + if(md_node_is_nil(parent)) { - if(str8_match(tln->string, key, 0)) + 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)) { - result = tln; - break; + md_node_insert_child(parent, prev_child, child); + prev_child = child; } } return result; } -internal Vec4F32 -df_rgba_from_cfg_tree(MD_Node *cfg) +internal MD_Node * +df_cfg_tree_storef(MD_Node *parent, MD_Node *prev_child, char *fmt, ...) { - 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); - } - } + 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 Axis2 df_split_axis_from_panel_cfg(MD_Node *panel) { @@ -8923,10 +8604,11 @@ df_base_regs(void) } internal DF_Regs * -df_push_regs_(DF_Regs *regs) +df_push_regs(void) { + DF_Regs *top = df_regs(); DF_RegsNode *n = push_array(df_frame_arena(), DF_RegsNode, 1); - MemoryCopyStruct(&n->v, regs); + MemoryCopyStruct(&n->v, top); SLLStackPush(df_state->top_regs, n); return &n->v; } @@ -9086,12 +8768,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_arena = arena_alloc(); - df_state->cfg_free = &md_nil_node; + df_state->cfg_root_arena = arena_alloc(); + df_state->cfg_root = &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(); @@ -9106,7 +8788,6 @@ 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(); @@ -9141,17 +8822,6 @@ 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)}; @@ -9261,10 +8931,13 @@ df_frame(void) local_persist S32 depth = 0; ////////////////////////////// - //- rjf: begin logging + //- rjf: apply new rich hover info // - log_select(df_state->log); - log_scope_begin(); + 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: get events from the OS @@ -9275,15 +8948,6 @@ 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 // @@ -9333,7 +8997,7 @@ df_frame(void) U64 begin_time_us = os_now_microseconds(); ////////////////////////////// - //- rjf: consume OS events for bind change + //- rjf: bind change // if(!df_state->confirm_active && df_state->bind_change_active) { @@ -9345,8 +9009,9 @@ df_frame(void) if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Delete)) { df_request_frame(); - df_msg(DF_MsgKind_RemoveEntity, .cfg_tree = df_state->bind_change_bind_handle); + df_unbind_spec(df_state->bind_change_cmd_spec, df_state->bind_change_binding); 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) { @@ -9362,24 +9027,7 @@ df_frame(void) event->key != OS_Key_Alt && event->key != OS_Key_Shift) { - 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_state->bind_change_active = 0; DF_Binding binding = zero_struct; { binding.key = event->key; @@ -9387,12 +9035,10 @@ 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; } } @@ -9464,9 +9110,10 @@ 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(EachEnumVal(DF_CfgSlot, slot)) + for(MD_EachNode(file_ref, df_state->cfg_root->first)) { - for(MD_EachNode(tln, df_state->cfg_slot_roots[slot]->first)) + MD_Node *file = file_ref->first; + for(MD_EachNode(tln, file->first)) { if(str8_match(tln->string, str8_lit("keybindings"), StringMatchFlag_CaseInsensitive)) { @@ -9474,8 +9121,8 @@ df_frame(void) { OS_Key map_key = OS_Key_Null; OS_EventFlags map_flags = 0; - String8 map_msg_name = map->first->string; - for(MD_EachNode(child, map->first->next)) + String8 map_msg_name = {0}; + for(MD_EachNode(child, map->first)) { if(0){} else if(str8_match(child->string, str8_lit("ctrl"), 0)) { map_flags |= OS_EventFlag_Ctrl; } @@ -9484,7 +9131,11 @@ df_frame(void) else { OS_Key key = os_key_from_string(child->string); - if(key != OS_Key_Null) + if(key == OS_Key_Null) + { + map_msg_name = child->string; + } + else { map_key = key; } @@ -9540,7 +9191,7 @@ df_frame(void) } } -#if 0 // NOTE(rjf): @msgs +#if 0 // TODO(rjf): @msgs ////////////////////////////// //- rjf: gather root-level commands // @@ -9550,7 +9201,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);) { @@ -9678,10 +9329,17 @@ 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(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; + 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; }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; @@ -9710,7 +9368,7 @@ df_frame(void) case DF_MsgKind_RemoveTarget: { MD_Node *cfg_tree = df_cfg_tree_from_handle(regs->cfg_tree); - df_cfg_node_release(cfg_tree); + df_cfg_tree_release(cfg_tree); }break; case DF_MsgKind_NameEntity: { @@ -9719,9 +9377,42 @@ df_frame(void) }break; case DF_MsgKind_DuplicateEntity: { - 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); +#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 }break; case DF_MsgKind_RelocateEntity: { @@ -9758,9 +9449,9 @@ df_frame(void) B32 removed_already_existing = 0; if(msg->kind == DF_MsgKind_ToggleBreakpoint) { - for(EachEnumVal(DF_CfgSlot, slot)) + for(MD_EachNode(root_ref, df_state->cfg_root)) { - for(MD_EachNode(tln, df_state->cfg_slot_roots[slot])) + for(MD_EachNode(tln, root_ref->first->first)) { if(str8_match(tln->string, str8_lit("breakpoint"), 0)) { @@ -9780,7 +9471,7 @@ df_frame(void) str8_match(tln_symbol, symbol, 0) || tln_vaddr == vaddr) { - df_cfg_node_release(tln); + df_cfg_tree_release(tln); removed_already_existing = 1; goto break_all_remove_existing; } @@ -9794,9 +9485,8 @@ df_frame(void) if(!removed_already_existing) { MD_Node *root = df_state->cfg_slot_roots[DF_CfgSlot_Project]; - 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); + 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"); df_msg(DF_MsgKind_RelocateEntity, .cfg_tree = df_handle_from_cfg_tree(new_bp)); } }break; @@ -9903,11 +9593,7 @@ df_frame(void) } // rjf: push command for this expr - 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 + // TODO(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); @@ -9927,32 +9613,30 @@ 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_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); + 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); 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_handle(regs->cfg_tree); - DF_CfgSlot cfg_slot = df_cfg_slot_from_tree(target_cfg); + MD_Node *target_cfg = df_cfg_tree_from_key(regs->string); if(!md_node_is_nil(target_cfg)) { - for(EachEnumVal(DF_CfgSlot, slot)) + for(MD_EachNode(root_ref, df_state->cfg_root->first)) { - for(MD_EachNode(tln, df_state->cfg_slot_roots[slot]->first)) + for(MD_EachNode(tln, root_ref->first->first)) { if(str8_match(target_cfg->string, tln->string, 0)) { - df_cfg_tree_set_keyf(tln, str8_lit("disabled"), "%s", tln == target_cfg ? "" : "1"); + df_cfg_tree_set_keyf(tln, str8_lit("disabled"), "%i", tln == target_cfg); } } } } -#if 0 // NOTE(rjf): @msgs +#if 0 // TODO(rjf): @msgs D_Entity *entity = d_entity_from_handle(regs->entity); if(entity->kind == D_EntityKind_Target) { @@ -9995,7 +9679,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); @@ -10102,8 +9786,7 @@ 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_single_cfg_tree_from_stringf("%f", new_child_pct); - md_node_insert_child(parent_cfg, prev_child, next); + MD_Node *next = df_cfg_tree_storef(parent_cfg, prev_child, "%f", new_child_pct); for(MD_EachNode(child, parent_cfg->first)) { if(child != next && child->flags & MD_NodeFlag_Numeric) @@ -10174,8 +9857,8 @@ df_frame(void) msg->kind == DF_MsgKind_SplitPanel) { MD_Node *move_tab_panel_cfg = move_tab_cfg->parent; - md_unhook_child(move_tab_cfg); - md_node_insert_child(new_panel_cfg, new_panel_cfg->last, move_tab_cfg); + df_cfg_tree_unhook(move_tab_cfg); + df_cfg_tree_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)) @@ -10196,23 +9879,9 @@ 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; - - // rjf: close panel, if not root - if(panel_cfg != root_panel_cfg) + if(!str8_match(panel_cfg->string, str8_lit("panels"), 0)) { // rjf: count children U64 child_count = 0; @@ -10224,7 +9893,7 @@ df_frame(void) if(child_count == 2) { // rjf: gather nodes - MD_Node *grandparent_cfg = (parent_cfg != root_panel_cfg) ? parent_cfg->parent : &md_nil_node; + MD_Node *grandparent_cfg = !str8_match(parent_cfg->string, str8_lit("panels"), 0) ? 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); @@ -10250,106 +9919,145 @@ df_frame(void) } // rjf: unhook kept child - md_unhook_child(keep_child_cfg); + df_cfg_tree_unhook(keep_child_cfg); // rjf: unhook this subtree if(!md_node_is_nil(grandparent_cfg)) { - md_unhook_child(parent_cfg); + df_cfg_tree_unhook(parent_cfg); } // rjf: release the things we should discard { - df_cfg_node_release(parent_cfg); - df_cfg_node_release(discard_child_cfg); + df_cfg_tree_release(parent_cfg); + df_cfg_tree_release(discard_child_cfg); } // rjf: re-hook our kept child into the overall tree - if(md_node_is_nil(grandparent_cfg)) + if(df_panel_is_nil(grandparent)) { - md_node_insert_child(window_cfg, window_cfg->last, keep_child_cfg); - df_cfg_tree_set_stringf(keep_child_cfg, "panels"); + ws->root_panel = keep_child; } else { - md_node_insert_child(grandparent_cfg, parent_prev_cfg, keep_child_cfg); - df_cfg_tree_set_stringf(keep_child_cfg, "%f", pct_of_parent); + df_panel_insert(grandparent, parent_prev, keep_child); } + keep_child->pct_of_parent = pct_of_parent; // rjf: reset focus, if needed - if(md_node_has_tag(discard_child_cfg, str8_lit("selected"), 0)) + if(ws->focused_panel == discard_child) { - 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 = keep_child; + for(DF_Panel *grandchild = ws->focused_panel; !df_panel_is_nil(grandchild); grandchild = grandchild->first) { - new_focused_panel_cfg = descendant; + ws->focused_panel = grandchild; } - df_msg(DF_MsgKind_FocusPanel, .panel = df_handle_from_cfg_tree(new_focused_panel_cfg)); } - // 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))) + // 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)) { - 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) + 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_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); + 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_cfg_node_release(keep_child_cfg); + df_panel_release(ws, keep_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 + // 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) { - F32 removed_size_pct = f32_from_str8(panel_cfg->string); - MD_Node *next = &md_nil_node; - if(!md_node_is_nil(next)) + 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)) { - next = md_node_from_chain_flags(panel_cfg->next, &md_nil_node, MD_NodeFlag_Numeric); + df_panel_remove(grandparent, parent); } - if(!md_node_is_nil(next)) + + // rjf: release the things we should discard { - for(MD_EachNode(child, parent_cfg->first)) + 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) { - if(child != panel_cfg && child->flags & MD_NodeFlag_Numeric) - { - next = child; - } + ws->focused_panel = grandchild; } } - 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) + + // 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_msg(DF_MsgKind_FocusPanel, .panel = df_handle_from_cfg_tree(next)); + 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); } - for(MD_EachNode(child, parent_cfg->first)) + } + + // NOTE(rjf): Otherwise we can just remove this child. + 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 pct = f32_from_str8(child->string); - F32 new_pct = pct / (1.f - removed_size_pct); - df_cfg_tree_set_stringf(child, "%f", new_pct); + ws->focused_panel = next; + } + for(DF_Panel *child = parent->first; !df_panel_is_nil(child); child = child->next) + { + child->pct_of_parent /= 1.f-removed_size_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; @@ -10373,14 +10081,12 @@ 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);) { @@ -10396,11 +10102,9 @@ 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)) @@ -10409,7 +10113,6 @@ 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; @@ -10417,7 +10120,6 @@ 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); @@ -10452,7 +10154,6 @@ df_frame(void) } df_msg(DF_MsgKind_FocusPanel, .panel = df_handle_from_panel(dst_panel)); } -#endif }break; //- rjf: view history navigation @@ -10462,7 +10163,6 @@ 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; @@ -10478,11 +10178,9 @@ 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; @@ -10498,14 +10196,12 @@ 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); @@ -10518,11 +10214,9 @@ 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); @@ -10549,13 +10243,11 @@ 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); @@ -10565,11 +10257,9 @@ 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)) @@ -10577,29 +10267,23 @@ 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; @@ -10618,11 +10302,9 @@ 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)) { @@ -10630,24 +10312,20 @@ 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 @@ -11000,18 +10678,18 @@ df_frame(void) ws->focused_panel = root_1; }break; } -#endif }break; //- rjf: filesystem fast paths case DF_MsgKind_Open: { -#if 0 // TODO(rjf): @msgs + DF_Window *ws = df_window_from_handle(regs->window); 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])); } @@ -11019,7 +10697,6 @@ df_frame(void) { log_user_errorf("Couldn't open file at \"%S\".", path); } -#endif }break; case DF_MsgKind_Switch: { @@ -11027,7 +10704,6 @@ 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)); @@ -11059,7 +10735,6 @@ df_frame(void) } } } -#endif }break; //- rjf: [snapping to code locations] thread finding @@ -11143,8 +10818,6 @@ 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 @@ -11437,7 +11110,6 @@ df_frame(void) df_msg(cursor_snap_kind); } } -#endif }break; } } @@ -11491,7 +11163,6 @@ 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) @@ -11504,12 +11175,11 @@ df_frame(void) } } } -#endif ////////////////////////////// //- rjf: capture is active? -> keep rendering // - if(ProfIsCapturing()) + if(ProfIsCapturing() || DEV_telemetry_capture) { df_request_frame(); } @@ -11517,7 +11187,6 @@ 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) { @@ -11527,7 +11196,6 @@ df_frame(void) } } } -#endif ////////////////////////////// //- rjf: process top-level graphical commands @@ -14091,25 +13759,26 @@ df_frame(void) // { dr_begin_frame(); - for(EachEnumVal(DF_CfgSlot, slot)) + for(MD_EachNode(root_ref, df_state->cfg_root->first)) { - for(MD_EachNode(tln, df_state->cfg_slot_roots[slot]->first)) + for(MD_EachNode(tln, root_ref->first->first)) { if(str8_match(tln->string, str8_lit("window"), 0)) { - DF_Window *window = df_window_from_cfg_tree(tln); - B32 window_is_focused = os_window_is_focused(window->os); + 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); if(window_is_focused) { - df_state->last_focused_window = df_handle_from_cfg_tree(tln); + df_state->last_focused_window = df_handle_from_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) + 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) { - MemoryCopyStruct(df_regs(), window_regs); + MemoryCopyStruct(d_regs(), window_regs); } } } @@ -14130,6 +13799,7 @@ 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); } ////////////////////////////// @@ -14202,21 +13872,6 @@ 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 465a30ae..0ebbf8a8 100644 --- a/src/dbg_frontend/dbg_frontend_core.h +++ b/src/dbg_frontend/dbg_frontend_core.h @@ -9,7 +9,6 @@ typedef enum DF_CfgSlot { - DF_CfgSlot_Null, DF_CfgSlot_User, DF_CfgSlot_Project, DF_CfgSlot_CommandLine, @@ -17,23 +16,13 @@ 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[2]; + U64 u64[4]; }; typedef struct DF_HandleNode DF_HandleNode; @@ -351,6 +340,14 @@ 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 @@ -454,7 +451,6 @@ struct DF_MsgKindInfo String8 search_tags; DF_MsgKindFlags flags; DF_MsgQuery query; - U32 icon_kind; }; //////////////////////////////// @@ -616,10 +612,6 @@ 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; @@ -693,6 +685,11 @@ 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; @@ -736,9 +733,6 @@ struct DF_State Arena *arena; B32 quit; U64 frame_index; - F32 dt; - Log *log; - String8 log_path; // rjf: frame arenas Arena *frame_arenas[2]; @@ -752,11 +746,12 @@ struct DF_State // rjf: frame request state U64 num_frames_requested; - // rjf: config tree state - Arena *cfg_arena; + // 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]; 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; @@ -782,13 +777,11 @@ struct DF_State U64 key_map_total_count; // rjf: bind change - Arena *bind_change_arena; B32 bind_change_active; - String8 bind_change_msg_name; - DF_Handle bind_change_bind_handle; + D_CmdSpec *bind_change_cmd_spec; + DF_Binding bind_change_binding; // 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; @@ -802,12 +795,6 @@ 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; @@ -829,7 +816,7 @@ struct DF_State DF_Window *free_window; U64 window_count; B32 last_window_queued_save; - DF_Handle last_focused_window; + D_Handle last_focused_window; // rjf: view state DF_View *first_view; @@ -908,6 +895,7 @@ 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}; @@ -1006,12 +994,6 @@ 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 @@ -1117,48 +1099,26 @@ 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: 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 +//- rjf: 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: 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 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: window/panel/tab tree introspection helpers +//- rjf: config tree lookups 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); @@ -1205,10 +1165,9 @@ 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_(DF_Regs *regs); -#define df_push_regs(...) df_push_regs_(&(DF_Regs){df_regs_lit_init_top __VA_ARGS__ }) +internal DF_Regs *df_push_regs(void); internal DF_Regs *df_pop_regs(void); -#define DF_RegsScope(...) DeferLoop(df_push_regs(__VA_ARGS__), df_pop_regs()) +#define DF_RegsScope DeferLoop(df_push_regs(), 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 e315dc87..1529d4da 100644 --- a/src/dbg_frontend/dbg_frontend_views.c +++ b/src/dbg_frontend/dbg_frontend_views.c @@ -1,28 +1,6 @@ // 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 @@ -66,7 +44,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: { @@ -188,9 +166,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, MD_NodePtrList, visible_line_count); + code_slice_params.line_bps = push_array(scratch.arena, D_EntityList, 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, MD_NodePtrList, visible_line_count); + code_slice_params.line_pins = push_array(scratch.arena, D_EntityList, 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; @@ -219,7 +197,6 @@ 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) { @@ -232,7 +209,6 @@ 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 @@ -267,7 +243,6 @@ 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) { @@ -280,7 +255,6 @@ 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 @@ -321,7 +295,6 @@ 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) { @@ -339,13 +312,11 @@ 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) { @@ -363,7 +334,6 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie } } } -#endif } // rjf: fill dasm -> src info @@ -464,7 +434,7 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie cv->center_cursor = found; if(found == 0) { - log_user_errorf("Could not find \"%S\"", cv->find_text_fwd); + d_errorf("Could not find \"%S\"", cv->find_text_fwd); } scratch_end(scratch); } @@ -525,7 +495,7 @@ df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeVie cv->center_cursor = found; if(found == 0) { - log_user_errorf("Could not find \"%S\"", cv->find_text_bwd); + d_errorf("Could not find \"%S\"", cv->find_text_bwd); } scratch_end(scratch); } @@ -1798,7 +1768,7 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d } if(!success) { - log_user_errorf("Could not commit value successfully."); + d_error(str8_lit("Could not commit value successfully.")); } }break; case DF_WatchViewColumnKind_Type:{}break; @@ -2340,9 +2310,11 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d } if(ui_clicked(sig)) { - df_msg(DF_MsgKind_OpenTab, - .string = e_string_from_expr(scratch.arena, row->expr), - .params_tree = row->expand_ui_rule_params); + 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); } } @@ -2366,7 +2338,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_rect); + 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); } //- rjf: pop interaction registers @@ -2651,7 +2623,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(); - df_msg(DF_MsgKind_Edit); + d_cmd(D_CmdKind_Edit); } // rjf: double-click, not editable -> go-to-location @@ -2866,7 +2838,7 @@ df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 d // if(pressed) { - df_msg(DF_MsgKind_FocusPanel); + d_cmd(D_CmdKind_FocusPanel); } scratch_end(scratch); @@ -2903,7 +2875,7 @@ DF_VIEW_UI_FUNCTION_DEF(empty) { if(ui_clicked(df_icon_buttonf(DF_IconKind_X, 0, "Close Panel"))) { - df_msg(DF_MsgKind_ClosePanel); + d_cmd(D_CmdKind_ClosePanel); } } } @@ -2974,14 +2946,13 @@ DF_VIEW_UI_FUNCTION_DEF(getting_started) DF_Palette(DF_PaletteCode_NeutralPopButton) if(ui_clicked(df_icon_buttonf(DF_IconKind_Add, 0, "Add Target"))) { - df_msg(DF_MsgKind_RunCommand, .string = df_msg_kind_info_table[DF_MsgKind_AddTarget].name_lower); + d_cmd(D_CmdKind_RunCommand, .cmd_spec = d_cmd_spec_from_kind(D_CmdKind_AddTarget)); } }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); @@ -3003,7 +2974,6 @@ 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. @@ -3188,7 +3158,6 @@ 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; @@ -3196,18 +3165,17 @@ DF_VIEW_UI_FUNCTION_DEF(commands) { D_CmdSpec *selected_cmd_spec; }; - DF_CmdsViewState *cv = get_view_state(DF_CmdsViewState); + DF_CmdsViewState *cv = df_view_user_state(view, DF_CmdsViewState); //- rjf: build filtered array of commands - String8 filter = get_view_filter(); - DF_CmdListerItemList cmd_list = df_cmd_lister_item_list_from_needle(scratch.arena, filter); + DF_CmdListerItemList cmd_list = df_cmd_lister_item_list_from_needle(scratch.arena, string); 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)) { - df_msg(DF_MsgKind_CompleteQuery, .cmd_spec = (cmd_array.count > 0 ? cmd_array.v[0].cmd_spec : &d_nil_cmd_spec)); + d_cmd(D_CmdKind_CompleteQuery, .cmd_spec = (cmd_array.count > 0 ? cmd_array.v[0].cmd_spec : &d_nil_cmd_spec)); } //- rjf: selected kind -> cursor @@ -3335,7 +3303,6 @@ DF_VIEW_UI_FUNCTION_DEF(commands) cv->selected_cmd_spec = &d_nil_cmd_spec; } -#endif scratch_end(scratch); ProfEnd(); } @@ -3516,7 +3483,7 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); - String8 query = get_view_filter(); + String8 query = string; 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 ? "/" : ""); @@ -3528,13 +3495,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 = get_view_state(DF_FileSystemViewState); + DF_FileSystemViewState *fs = df_view_user_state(view, DF_FileSystemViewState); if(fs->initialized == 0) { fs->initialized = 1; fs->path_state_table_size = 256; - 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->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->col_pcts[0] = 0.60f; fs->col_pcts[1] = 0.20f; fs->col_pcts[2] = 0.20f; @@ -3556,10 +3523,10 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) } if(ps == 0) { - ps = push_array(get_view_arena(), DF_FileSystemViewPathState, 1); + ps = push_array(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(get_view_arena(), key); + ps->normalized_path = push_str8_copy(view->arena, key); } } @@ -3582,7 +3549,7 @@ DF_VIEW_UI_FUNCTION_DEF(file_system) // choose the most recent change to a file browser path, and live with the // consequences). { - df_msg(DF_MsgKind_SetCurrentPath, .file_path = path_query.path); + d_cmd(D_CmdKind_SetCurrentPath, .file_path = path_query.path); } //- rjf: get files, filtered @@ -3670,7 +3637,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) { - df_msg(DF_MsgKind_CompleteQuery, .file_path = query_normalized_with_opt_slash); + d_cmd(D_CmdKind_CompleteQuery, .file_path = query_normalized_with_opt_slash); } // rjf: command argument exactly matches some file: @@ -3680,20 +3647,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_msg(DF_MsgKind_SetFilter, .string = new_path); + df_view_equip_query(view, new_path); } // rjf: is a file -> complete view else { - df_msg(DF_MsgKind_CompleteQuery, .file_path = query_normalized_with_opt_slash); + d_cmd(D_CmdKind_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) { - df_msg(DF_MsgKind_CompleteQuery, .file_path = path_query.path); + d_cmd(D_CmdKind_CompleteQuery, .file_path = path_query.path); } // rjf: command argument does not exactly match any file, but lister results are in: @@ -3704,19 +3671,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_msg(DF_MsgKind_SetFilter, .string = new_path); + df_view_equip_query(view, new_path); } else { String8 file_path = push_str8f(scratch.arena, "%S%S", path_query.path, filename); - df_msg(DF_MsgKind_CompleteQuery, .file_path = file_path); + d_cmd(D_CmdKind_CompleteQuery, .file_path = file_path); } } // rjf: command argument does not match any file, and lister is empty (new file) else { - df_msg(DF_MsgKind_CompleteQuery, .file_path = query); + d_cmd(D_CmdKind_CompleteQuery, .file_path = query); } } @@ -3784,10 +3751,9 @@ 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, - &scroll_pos.y, + &view->scroll_pos.y, &ps->cursor, 0, &visible_row_range, @@ -3829,8 +3795,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_filter = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); - set_view_filter(new_filter); + String8 new_cmd = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); + df_view_equip_query(view, new_cmd); } } @@ -3847,7 +3813,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", file->filename); + file_sig = ui_buttonf("##%S_%p", file->filename, view); } // rjf: make content @@ -3911,17 +3877,16 @@ 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_filter = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); - set_view_filter(new_filter); + String8 new_cmd = push_str8f(scratch.arena, "%S%s", new_path, new_path.size != 0 ? "/" : ""); + df_view_equip_query(view, new_cmd); } else { - complete_view(.file_path = new_path); + d_cmd(D_CmdKind_CompleteQuery, .file_path = new_path); } } } } - set_view_scroll_position(scroll_pos); scratch_end(scratch); ProfEnd(); @@ -4112,16 +4077,16 @@ DF_VIEW_UI_FUNCTION_DEF(system_processes) String8 cached_process_arg; DF_ProcessInfoArray cached_process_array; }; - DF_SystemProcessesViewState *sp = get_view_state(DF_SystemProcessesViewState); + DF_SystemProcessesViewState *sp = df_view_user_state(view, DF_SystemProcessesViewState); if(sp->initialized == 0) { sp->initialized = 1; sp->need_initial_gather = 1; - sp->cached_process_arena = push_view_extension_arena(); + sp->cached_process_arena = df_view_push_arena_ext(view); } //- rjf: gather list of filtered process infos - String8 query = get_view_filter(); + String8 query = string; DF_ProcessInfoArray process_info_array = sp->cached_process_array; if(sp->need_initial_gather || !str8_match(sp->cached_process_arg, query, 0)) { @@ -4138,7 +4103,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]; - complete_view(.pid = info->info.pid); + d_cmd(D_CmdKind_CompleteQuery, .id = info->info.pid); } //- rjf: selected PID -> cursor @@ -4167,10 +4132,9 @@ 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, - &scroll_pos.y, + &view->scroll_pos.y, &cursor, 0, &visible_row_range, @@ -4227,11 +4191,10 @@ DF_VIEW_UI_FUNCTION_DEF(system_processes) // rjf: click => activate this specific process if(ui_clicked(sig)) { - complete_view(.pid = info->info.pid); + d_cmd(D_CmdKind_CompleteQuery, .id = info->info.pid); } } } - set_view_scroll_position(scroll_pos); //- rjf: selected num -> selected PID { @@ -4350,7 +4313,6 @@ 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); @@ -4470,7 +4432,6 @@ DF_VIEW_UI_FUNCTION_DEF(entity_lister) scratch_end(scratch); ProfEnd(); -#endif } //////////////////////////////// @@ -4508,13 +4469,12 @@ DF_VIEW_UI_FUNCTION_DEF(symbol_lister) { Vec2S64 cursor; }; - DF_SymbolListerViewState *slv = get_view_state(DF_SymbolListerViewState); + DF_SymbolListerViewState *slv = df_view_user_state(view, DF_SymbolListerViewState); - //- rjf: filter -> rdi, filtered items - String8 filter = get_view_filter(); - U128 fuzzy_search_key = get_view_id(); + //- rjf: query -> raddbg, filtered items + U128 fuzzy_search_key = {(U64)view, d_hash_from_string(str8_struct(&view))}; B32 items_stale = 0; - FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fuzzy_search_key, &fuzzy_search_params, filter, endt_us, &items_stale); + FZY_ItemArray items = fzy_items_from_key_params_query(fzy_scope, fuzzy_search_key, &fuzzy_search_params, string, endt_us, &items_stale); if(items_stale) { df_request_frame(); @@ -4538,7 +4498,7 @@ DF_VIEW_UI_FUNCTION_DEF(symbol_lister) String8 name = str8(name_base, name_size); if(name.size != 0) { - complete_view(.string = name); + d_cmd(D_CmdKind_CompleteQuery, .string = name); } break; } @@ -4559,10 +4519,9 @@ 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, - &scroll_pos.y, + &view->scroll_pos.y, &slv->cursor, 0, &visible_row_range, @@ -4629,7 +4588,7 @@ DF_VIEW_UI_FUNCTION_DEF(symbol_lister) UI_Signal sig = ui_signal_from_box(box); if(ui_clicked(sig)) { - complete_view(.string = name); + d_cmd(D_CmdKind_CompleteQuery, .string = name); } if(ui_hovering(sig)) UI_Tooltip { @@ -4654,7 +4613,6 @@ 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); @@ -5009,7 +4967,6 @@ 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); @@ -5153,7 +5110,6 @@ DF_VIEW_UI_FUNCTION_DEF(targets) scratch_end(scratch); ProfEnd(); -#endif } //////////////////////////////// @@ -5516,44 +5472,42 @@ DF_VIEW_UI_FUNCTION_DEF(auto_view_rules){} //////////////////////////////// //~ rjf: breakpoints @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(breakpoints){} +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_CMD_FUNCTION_DEF(breakpoints){} DF_VIEW_UI_FUNCTION_DEF(breakpoints) { -#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 + ProfBeginFunction(); + DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); + df_watch_view_build(view, ewv, 0, 10, rect); + ProfEnd(); } //////////////////////////////// //~ rjf: watch_pins @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(watch_pins){} +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_CMD_FUNCTION_DEF(watch_pins){} DF_VIEW_UI_FUNCTION_DEF(watch_pins) { -#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 + ProfBeginFunction(); + DF_WatchViewState *ewv = df_view_user_state(view, DF_WatchViewState); + df_watch_view_build(view, ewv, 0, 10, rect); + ProfEnd(); } //////////////////////////////// @@ -5783,22 +5737,21 @@ DF_VIEW_UI_FUNCTION_DEF(scheduler) //////////////////////////////// //~ rjf: call_stack @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(call_stack){} +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_CMD_FUNCTION_DEF(call_stack){} DF_VIEW_UI_FUNCTION_DEF(call_stack) { -#if 0 // TODO(rjf): @msgs + ProfBeginFunction(); 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); -#endif + ProfEnd(); } //////////////////////////////// @@ -6149,45 +6102,43 @@ DF_VIEW_UI_FUNCTION_DEF(modules) //////////////////////////////// //~ rjf: watch @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(watch){} +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_CMD_FUNCTION_DEF(watch){} DF_VIEW_UI_FUNCTION_DEF(watch) { -#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 + 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(); } //////////////////////////////// //~ rjf: locals @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(locals) {} +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_CMD_FUNCTION_DEF(locals) {} DF_VIEW_UI_FUNCTION_DEF(locals) { -#if 0 // TODO(rjf): @msgs + ProfBeginFunction(); 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); -#endif + ProfEnd(); } //////////////////////////////// @@ -6195,98 +6146,103 @@ 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) { -#if 0 // TODO(rjf): @msgs + ProfBeginFunction(); 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); -#endif + ProfEnd(); } //////////////////////////////// //~ rjf: globals @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(globals){} -DF_VIEW_CMD_FUNCTION_DEF(globals) {} -DF_VIEW_UI_FUNCTION_DEF(globals) +DF_VIEW_SETUP_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); -#endif + ProfEnd(); } //////////////////////////////// //~ rjf: thread_locals @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(thread_locals){} -DF_VIEW_CMD_FUNCTION_DEF(thread_locals){} -DF_VIEW_UI_FUNCTION_DEF(thread_locals) +DF_VIEW_SETUP_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); -#endif + ProfEnd(); } //////////////////////////////// //~ rjf: types @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(types) {} -DF_VIEW_CMD_FUNCTION_DEF(types) {} -DF_VIEW_UI_FUNCTION_DEF(types) +DF_VIEW_SETUP_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); -#endif + ProfEnd(); } //////////////////////////////// //~ rjf: procedures @view_hook_impl -DF_VIEW_SETUP_FUNCTION_DEF(procedures) {} -DF_VIEW_CMD_FUNCTION_DEF(procedures) {} -DF_VIEW_UI_FUNCTION_DEF(procedures) +DF_VIEW_SETUP_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); -#endif + ProfEnd(); } //////////////////////////////// @@ -6295,12 +6251,10 @@ 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 expr = get_view_expression(); - String8 file_path = d_file_path_from_eval_string(scratch.arena, expr); + String8 file_path = d_file_path_from_eval_string(scratch.arena, str8(view->query_buffer, view->query_string_size)); Rng1U64 file_range = r1u64(0, 1024); U128 file_hash = fs_hash_from_path_range(file_path, file_range, 0); B32 file_is_ready = 0; @@ -6379,15 +6333,12 @@ 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 } //////////////////////////////// @@ -6395,17 +6346,14 @@ 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(); @@ -6460,12 +6408,10 @@ 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(); @@ -6642,7 +6588,6 @@ DF_VIEW_UI_FUNCTION_DEF(text) txt_scope_close(txt_scope); hs_scope_close(hs_scope); scratch_end(scratch); -#endif } //////////////////////////////// @@ -6661,7 +6606,6 @@ 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) { @@ -6671,12 +6615,10 @@ 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(); @@ -6795,12 +6737,10 @@ 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); @@ -6950,7 +6890,6 @@ DF_VIEW_UI_FUNCTION_DEF(disasm) dasm_scope_close(dasm_scope); hs_scope_close(hs_scope); scratch_end(scratch); -#endif } //////////////////////////////// @@ -6958,15 +6897,12 @@ 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(); @@ -6980,12 +6916,10 @@ 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(); @@ -7043,7 +6977,6 @@ DF_VIEW_UI_FUNCTION_DEF(output) txt_scope_close(txt_scope); hs_scope_close(hs_scope); scratch_end(scratch); -#endif } //////////////////////////////// @@ -7056,10 +6989,13 @@ struct DF_MemoryViewState B32 contain_cursor; }; -DF_VIEW_SETUP_FUNCTION_DEF(memory){} +DF_VIEW_SETUP_FUNCTION_DEF(memory) +{ + DF_MemoryViewState *mv = df_view_user_state(view, DF_MemoryViewState); +} + 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) { @@ -7097,12 +7033,10 @@ 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(); @@ -7851,7 +7785,6 @@ DF_VIEW_UI_FUNCTION_DEF(memory) hs_scope_close(hs_scope); scratch_end(scratch); ProfEnd(); -#endif } //////////////////////////////// @@ -7972,11 +7905,14 @@ internal UI_BOX_CUSTOM_DRAW(df_bitmap_view_canvas_box_draw) } } -DF_VIEW_SETUP_FUNCTION_DEF(bitmap){} -DF_VIEW_CMD_FUNCTION_DEF(bitmap){} +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_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(); @@ -8173,7 +8109,6 @@ DF_VIEW_UI_FUNCTION_DEF(bitmap) hs_scope_close(hs_scope); tex_scope_close(tex_scope); scratch_end(scratch); -#endif } //////////////////////////////// @@ -8205,7 +8140,6 @@ 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; @@ -8247,7 +8181,6 @@ DF_VIEW_UI_FUNCTION_DEF(color_rgba) } } scratch_end(scratch); -#endif } //////////////////////////////// @@ -8300,11 +8233,14 @@ 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_SETUP_FUNCTION_DEF(geo3d) +{ + df_view_equip_loading_info(view, 1, 0, 0); + view->loading_t = view->loading_t_target = 1.f; +} 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); @@ -8414,7 +8350,6 @@ DF_VIEW_UI_FUNCTION_DEF(geo3d) geo_scope_close(geo_scope); scratch_end(scratch); -#endif } //////////////////////////////// @@ -8424,11 +8359,10 @@ 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 filter = get_view_filter(); + String8 query = string; //- rjf: get state typedef struct DF_ExceptionFiltersViewState DF_ExceptionFiltersViewState; @@ -8476,7 +8410,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, filter, name); + FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, query, name); if(matches.count >= matches.needle_part_count) { if(node == 0 || node->count >= node->cap) @@ -8520,10 +8454,9 @@ 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, - &scroll_pos.y, + &view->scroll_pos.y, &sv->cursor, 0, &visible_row_range, @@ -8552,11 +8485,9 @@ DF_VIEW_UI_FUNCTION_DEF(exception_filters) } } } - set_view_scroll_position(scroll_pos); scratch_end(scratch); ProfEnd(); -#endif } //////////////////////////////// @@ -8637,11 +8568,10 @@ 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 filter = get_view_filter(); + String8 query = string; DF_Window *window = df_window_from_handle(d_regs()->window); ////////////////////////////// @@ -8661,7 +8591,7 @@ DF_VIEW_UI_FUNCTION_DEF(settings) DF_ThemePreset preset_apply_confirm; B32 category_opened[DF_SettingsItemKind_COUNT]; }; - DF_SettingsViewState *sv = get_view_state(DF_SettingsViewState); + DF_SettingsViewState *sv = df_view_user_state(view, DF_SettingsViewState); if(!sv->initialized) { sv->initialized = 1; @@ -9061,9 +8991,8 @@ 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, &scroll_pos.y, &sv->cursor, 0, &visible_row_range, &scroll_list_sig) + UI_ScrollList(&scroll_list_params, &view->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) @@ -9249,8 +9178,6 @@ 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 e5204e0a..38d6457b 100644 --- a/src/dbg_frontend/dbg_frontend_views.h +++ b/src/dbg_frontend/dbg_frontend_views.h @@ -151,30 +151,6 @@ 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 4a4f6eca..69b0805d 100644 --- a/src/dbg_frontend/dbg_frontend_widgets.c +++ b/src/dbg_frontend/dbg_frontend_widgets.c @@ -91,52 +91,9 @@ 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); @@ -220,7 +177,7 @@ df_cmd_binding_buttons(D_CmdSpec *spec) { if((binding.key == OS_Key_Esc || binding.key == OS_Key_Delete) && binding.flags == 0) { - log_user_error(str8_lit("Cannot rebind; this command uses a reserved keybinding.")); + d_error(str8_lit("Cannot rebind; this command uses a reserved keybinding.")); } else { @@ -313,7 +270,6 @@ df_cmd_binding_buttons(D_CmdSpec *spec) } scratch_end(scratch); -#endif } internal UI_Signal @@ -325,62 +281,6 @@ 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) { @@ -430,7 +330,7 @@ df_cmd_spec_button(D_CmdSpec *spec) internal void df_cmd_list_menu_buttons(U64 count, D_CmdKind *cmds, U32 *fastpath_codepoints) { -#if 0 // TODO(rjf): @msgs + Temp scratch = scratch_begin(0, 0); for(U64 idx = 0; idx < count; idx += 1) { D_CmdSpec *spec = d_cmd_spec_from_kind(cmds[idx]); @@ -444,25 +344,7 @@ df_cmd_list_menu_buttons(U64 count, D_CmdKind *cmds, U32 *fastpath_codepoints) window->menu_bar_focused = 0; } } -#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; - } - } + scratch_end(scratch); } internal UI_Signal @@ -698,12 +580,6 @@ 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) { @@ -1020,7 +896,6 @@ 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); @@ -1058,7 +933,6 @@ df_src_loc_button(String8 file_path, TxtPt point) ui_labelf("%S:%I64d:%I64d", file_path, point.line, point.column); } scratch_end(scratch); -#endif } //////////////////////////////// @@ -1453,8 +1327,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]; - MD_NodePtrList line_bps = params->line_bps[line_idx]; - MD_NodePtrList line_pins = params->line_pins[line_idx]; + D_EntityList line_bps = params->line_bps[line_idx]; + D_EntityList 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) @@ -1594,16 +1468,15 @@ df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe } //- rjf: build margin breakpoint ui - for(MD_NodePtrNode *n = line_bps.first; n != 0; n = n->next) + for(D_EntityNode *n = line_bps.first; n != 0; n = n->next) { - 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) + D_Entity *bp = n->entity; + Vec4F32 bp_color = df_rgba_from_theme_color(DF_ThemeColor_Breakpoint); + if(bp->flags & D_EntityFlag_HasColor) { - bp_color = df_rgba_from_theme_color(DF_ThemeColor_Breakpoint); + bp_color = d_rgba_from_entity(bp); } - if(bp_is_disabled) + if(bp->disabled) { bp_color = v4f32(bp_color.x * 0.6f, bp_color.y * 0.6f, bp_color.z * 0.6f, bp_color.w * 0.6f); } @@ -1612,7 +1485,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 = ui_anim(ui_key_from_stringf(ui_key_zero(), "%p_alive_t", bp), 1.f); + bp_draw->alive_t = bp->alive_t; 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) @@ -1652,36 +1525,41 @@ 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_cfg_tree_tooltips(bp); + df_entity_tooltips(bp); } // rjf: click => remove breakpoint if(ui_clicked(bp_sig)) { - df_msg(DF_MsgKind_RemoveBreakpoint, .cfg_tree = df_handle_from_cfg_tree(bp)); + d_cmd(D_CmdKind_RemoveBreakpoint, .entity = d_handle_from_entity(bp)); } // rjf: drag start if(ui_dragging(bp_sig) && !contains_2f32(bp_box->rect, ui_mouse())) { - df_drag_begin(.cfg_tree = df_handle_from_cfg_tree(bp)); + DF_DragDropPayload payload = {0}; + payload.entity = d_handle_from_entity(bp); + df_drag_begin(&payload); } // rjf: bp right-click menu if(ui_right_clicked(bp_sig)) { - df_ctx_menu_open(bp_box, .cfg_tree = df_handle_from_cfg_tree(bp)); + 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; } } //- rjf: build margin watch pin ui - for(MD_NodePtrNode *n = line_pins.first; n != 0; n = n->next) + for(D_EntityNode *n = line_pins.first; n != 0; n = n->next) { - MD_Node *pin = n->v; - Vec4F32 color = df_rgba_from_cfg_tree(pin); - if(color.w == 0) + D_Entity *pin = n->entity; + Vec4F32 color = df_rgba_from_theme_color(DF_ThemeColor_Text); + if(pin->flags & D_EntityFlag_HasColor) { - color = df_rgba_from_theme_color(DF_ThemeColor_Text); + color = d_rgba_from_entity(pin); } // rjf: build box for watch @@ -1705,25 +1583,30 @@ 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_cfg_tree_tooltips(pin); + df_entity_tooltips(pin); } // rjf: click => remove pin if(ui_clicked(pin_sig)) { - df_msg(DF_MsgKind_RemoveEntity, .cfg_tree = df_handle_from_cfg_tree(pin)); + d_cmd(D_CmdKind_RemoveEntity, .entity = d_handle_from_entity(pin)); } // rjf: drag start if(ui_dragging(pin_sig) && !contains_2f32(pin_box->rect, ui_mouse())) { - df_drag_begin(.cfg_tree = df_handle_from_cfg_tree(pin)); + DF_DragDropPayload payload = {0}; + payload.entity = d_handle_from_entity(pin); + df_drag_begin(&payload); } // rjf: watch right-click menu if(ui_right_clicked(pin_sig)) { - df_ctx_menu_open(pin_box, .cfg_tree = df_handle_from_cfg_tree(pin)); + 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; } } } @@ -1732,10 +1615,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)) { - 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])); + d_cmd(D_CmdKind_AddBreakpoint, + .file_path = d_regs()->file_path, + .text_point = txt_pt(line_num, 1), + .vaddr = params->line_vaddrs[line_idx]); } } } @@ -1902,16 +1785,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) { - MD_NodePtrList pins = params->line_pins[line_idx]; + D_EntityList 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(MD_NodePtrNode *n = pins.first; n != 0; n = n->next) + for(D_EntityNode *n = pins.first; n != 0; n = n->next) { - MD_Node *pin = n->v; - String8 pin_expr = pin->first->string; + D_Entity *pin = n->entity; + String8 pin_expr = pin->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)) @@ -1928,10 +1811,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_cfg_tree(pin); - if(pin_color.w == 0) + Vec4F32 pin_color = df_rgba_from_theme_color(DF_ThemeColor_CodeDefault); + if(pin->flags & D_EntityFlag_HasColor) { - pin_color = df_rgba_from_theme_color(DF_ThemeColor_CodeDefault); + pin_color = d_rgba_from_entity(pin); } UI_PrefWidth(ui_em(1.5f, 1.f)) DF_Font(DF_FontSlot_Icons) @@ -1942,11 +1825,15 @@ 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_drag_begin(.cfg_tree = df_handle_from_cfg_tree(pin)); + DF_DragDropPayload payload = {0}; + payload.entity = d_handle_from_entity(pin); + df_drag_begin(&payload); } if(ui_right_clicked(sig)) { - df_ctx_menu_open(pin_box, .cfg_tree = df_handle_from_cfg_tree(pin)); + 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_code_label(0.8f, 1, df_rgba_from_theme_color(DF_ThemeColor_CodeDefault), pin_expr); @@ -2034,7 +1921,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); - CTRL_Entity *line_drag_entity = &ctrl_entity_nil; + D_Entity *line_drag_entity = &d_nil_entity; { //- rjf: determine mouse drag range TxtRng mouse_drag_rng = txt_rng(mouse_pt, mouse_pt); @@ -2104,7 +1991,6 @@ 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; @@ -2116,10 +2002,8 @@ 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)) @@ -2162,7 +2046,6 @@ 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; @@ -2253,7 +2136,6 @@ 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); @@ -2274,7 +2156,6 @@ 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 012539cb..f83af39c 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; - MD_NodePtrList *line_bps; + D_EntityList *line_bps; CTRL_EntityList *line_ips; - MD_NodePtrList *line_pins; + D_EntityList *line_pins; U64 *line_vaddrs; D_LineList *line_infos; DI_KeyList relevant_dbgi_keys; @@ -84,17 +84,13 @@ 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 69c149c3..366f46b6 100644 --- a/src/dbg_frontend/generated/dbg_frontend.meta.c +++ b/src/dbg_frontend/generated/dbg_frontend.meta.c @@ -37,12 +37,11 @@ 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[138] = +DF_MsgKindInfo df_msg_kind_info_table[135] = { {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}}, @@ -75,7 +74,6 @@ DF_MsgKindInfo df_msg_kind_info_table[138] = {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}}, @@ -118,7 +116,6 @@ DF_MsgKindInfo df_msg_kind_info_table[138] = {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 60b45c98..04846545 100644 --- a/src/dbg_frontend/generated/dbg_frontend.meta.h +++ b/src/dbg_frontend/generated/dbg_frontend.meta.h @@ -80,7 +80,6 @@ DF_MsgKind_RunToCursor, DF_MsgKind_SetNextStatement, DF_MsgKind_Exit, DF_MsgKind_RunCommand, -DF_MsgKind_SetCurrentPath, DF_MsgKind_ToggleDevMenu, DF_MsgKind_RegisterAsJITDebugger, DF_MsgKind_LogMarker, @@ -113,7 +112,6 @@ DF_MsgKind_GoToNameAtCursor, DF_MsgKind_ToggleBreakpointAtCursor, DF_MsgKind_ToggleWatchPinAtCursor, DF_MsgKind_ToggleWatchExpressionAtCursor, -DF_MsgKind_ToggleWatchExpressionAtMouse, DF_MsgKind_OpenWindow, DF_MsgKind_CloseWindow, DF_MsgKind_ToggleFullscreen, @@ -156,7 +154,6 @@ DF_MsgKind_CloseTab, DF_MsgKind_TabBarTop, DF_MsgKind_TabBarBottom, DF_MsgKind_Filter, -DF_MsgKind_SetFilter, DF_MsgKind_ClearFilter, DF_MsgKind_ApplyFilter, DF_MsgKind_ResetToDefaultPanels, @@ -625,7 +622,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[138]; +extern DF_MsgKindInfo df_msg_kind_info_table[135]; 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 340ec7e1..aa48af13 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -239,7 +239,6 @@ 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; @@ -265,23 +264,3 @@ 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 6461b93c..957ff123 100644 --- a/src/eval/eval_bundles.h +++ b/src/eval/eval_bundles.h @@ -29,6 +29,5 @@ 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 8568b7b7..7db16415 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_unhook_child(MD_Node *node) +md_node_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_unhook_tag(MD_Node *node) +md_node_unhook_tag(MD_Node *node) { MD_Node *parent = node->parent; if(!md_node_is_nil(parent)) @@ -393,21 +393,6 @@ 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) { @@ -567,18 +552,6 @@ 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 467674ad..f2d728ac 100644 --- a/src/mdesk/mdesk.h +++ b/src/mdesk/mdesk.h @@ -193,21 +193,6 @@ 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 @@ -269,8 +254,7 @@ 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_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) +#define MD_EachNode(it, first) MD_Node *it = first; !md_node_is_nil(it); it = it->next 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)) @@ -279,10 +263,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_unhook_child(MD_Node *node); +internal void md_node_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_unhook_tag(MD_Node *node); +internal void md_node_unhook_tag(MD_Node *node); //- rjf: tree building helpers internal MD_Node *md_push_list(Arena *arena); @@ -301,7 +285,6 @@ 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); @@ -315,9 +298,6 @@ 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 d3544443..eff93c1b 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -616,6 +616,10 @@ 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 @@ -667,7 +671,35 @@ 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; } @@ -878,21 +910,30 @@ entry_point(CmdLine *cmd_line) break; } } - if(dst_window != 0 && dst_window != &df_nil_window) DF_RegsScope(.window = dst_window->handle) + if(dst_window != 0) D_RegsScope { + 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); - DF_MsgKind kind = df_msg_kind_from_string(msg_kind_name); - DF_MsgQuery query = df_msg_kind_info_table[kind].query; + 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_regs_set_from_query_slot_string(query.slot, args_string); - if(kind != DF_MsgKind_Null) + if(d_kind != D_MsgKind_Null) { - df_msg(kind); + d_msg(d_kind); } - else + if(df_kind != DF_MsgKind_Null) + { + df_msg(df_kind); + } + if(d_kind == D_MsgKind_Null && + df_kind == DF_MsgKind_Null) { log_user_errorf("\"%S\" is not a command.", msg_kind_name); }