diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 52f51110..7e56a987 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -191,7 +191,7 @@ RD_EntityKindFlags rd_entity_kind_flags_table[27] = (0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (1*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig), }; -Rng1U64 rd_reg_slot_range_table[34] = +Rng1U64 rd_reg_slot_range_table[38] = { {0}, {OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(CTRL_Handle)}, @@ -219,6 +219,10 @@ Rng1U64 rd_reg_slot_range_table[34] = {OffsetOf(RD_Regs, voff), OffsetOf(RD_Regs, voff) + sizeof(U64)}, {OffsetOf(RD_Regs, vaddr_range), OffsetOf(RD_Regs, vaddr_range) + sizeof(Rng1U64)}, {OffsetOf(RD_Regs, voff_range), OffsetOf(RD_Regs, voff_range) + sizeof(Rng1U64)}, +{OffsetOf(RD_Regs, ui_key), OffsetOf(RD_Regs, ui_key) + sizeof(UI_Key)}, +{OffsetOf(RD_Regs, off_px), OffsetOf(RD_Regs, off_px) + sizeof(Vec2F32)}, +{OffsetOf(RD_Regs, lister_flags), OffsetOf(RD_Regs, lister_flags) + sizeof(RD_ListerFlags)}, +{OffsetOf(RD_Regs, reg_slot), OffsetOf(RD_Regs, reg_slot) + sizeof(RD_RegSlot)}, {OffsetOf(RD_Regs, pid), OffsetOf(RD_Regs, pid) + sizeof(U32)}, {OffsetOf(RD_Regs, force_confirm), OffsetOf(RD_Regs, force_confirm) + sizeof(B32)}, {OffsetOf(RD_Regs, prefer_disasm), OffsetOf(RD_Regs, prefer_disasm) + sizeof(B32)}, @@ -229,7 +233,7 @@ Rng1U64 rd_reg_slot_range_table[34] = {OffsetOf(RD_Regs, os_event), OffsetOf(RD_Regs, os_event) + sizeof(OS_Event *)}, }; -RD_CmdKindInfo rd_cmd_kind_info_table[215] = +RD_CmdKindInfo rd_cmd_kind_info_table[216] = { {0}, { str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp("Launch and Run"), RD_IconKind_Play, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Entity, str8_lit_comp(""), RD_EntityKind_Target, CTRL_EntityKind_Null}}, @@ -266,6 +270,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[215] = { str8_lit_comp("set_entity_name"), str8_lit_comp("Sets the passed entity's name."), str8_lit_comp(""), str8_lit_comp("Set Entity Name"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("attach"), str8_lit_comp("Attaches to a process that is already running on the local machine."), str8_lit_comp(""), str8_lit_comp("Attach"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp("Exit"), RD_IconKind_X, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("open_lister"), str8_lit_comp("Opens the lister."), str8_lit_comp("help,cmd"), str8_lit_comp("Open Lister"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp("Run Command"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("commands"), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("OS Event"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp("Select Thread"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Thread}}, @@ -308,7 +313,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[215] = { str8_lit_comp("move_tab_right"), str8_lit_comp("Moves the selected tab right one slot."), str8_lit_comp(""), str8_lit_comp("Move Tab Right"), RD_IconKind_RightArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("move_tab_left"), str8_lit_comp("Moves the selected tab left one slot."), str8_lit_comp(""), str8_lit_comp("Move Tab Left"), RD_IconKind_LeftArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("open_tab"), str8_lit_comp("Opens a new tab with the parameterized view specification."), str8_lit_comp(""), str8_lit_comp("Open Tab"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, -{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("Close Tab"), RD_IconKind_X, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, +{ str8_lit_comp("close_tab"), str8_lit_comp("Closes the currently opened tab."), str8_lit_comp(""), str8_lit_comp("Close Tab"), RD_IconKind_X, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_View, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("move_tab"), str8_lit_comp("Moves a tab to a new panel."), str8_lit_comp(""), str8_lit_comp("Move Tab"), RD_IconKind_Null, (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("tab_bar_top"), str8_lit_comp("Anchors a panel's tab bar to the top of the panel."), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Top"), RD_IconKind_UpArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, { str8_lit_comp("tab_bar_bottom"), str8_lit_comp("Anchors a panel's tab bar to the bottom of the panel."), str8_lit_comp(""), str8_lit_comp("Anchor Tab Bar To Bottom"), RD_IconKind_DownArrow, (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), RD_EntityKind_Nil, CTRL_EntityKind_Null}}, @@ -558,7 +563,7 @@ RD_StringBindingPair rd_default_binding_table[110] = {str8_lit_comp("add_target"), {OS_Key_T, 0 |OS_Modifier_Ctrl }}, {str8_lit_comp("attach"), {OS_Key_F6, 0 |OS_Modifier_Shift }}, {str8_lit_comp("filter"), {OS_Key_Slash, 0 |OS_Modifier_Ctrl }}, -{str8_lit_comp("run_command"), {OS_Key_F1, 0 }}, +{str8_lit_comp("open_lister"), {OS_Key_F1, 0 }}, {str8_lit_comp("log_marker"), {OS_Key_M, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}}, }; diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 17dc9a13..199f4738 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -75,6 +75,10 @@ RD_RegSlot_Vaddr, RD_RegSlot_Voff, RD_RegSlot_VaddrRange, RD_RegSlot_VoffRange, +RD_RegSlot_UIKey, +RD_RegSlot_OffPx, +RD_RegSlot_ListerFlags, +RD_RegSlot_RegSlot, RD_RegSlot_PID, RD_RegSlot_ForceConfirm, RD_RegSlot_PreferDisasm, @@ -123,6 +127,7 @@ RD_CmdKind_SetEntityColor, RD_CmdKind_SetEntityName, RD_CmdKind_Attach, RD_CmdKind_Exit, +RD_CmdKind_OpenLister, RD_CmdKind_RunCommand, RD_CmdKind_OSEvent, RD_CmdKind_SelectThread, @@ -298,9 +303,9 @@ RD_CmdKind_Settings, RD_CmdKind_PickFile, RD_CmdKind_PickFolder, RD_CmdKind_PickFileOrFolder, -RD_CmdKind_PushLister, -RD_CmdKind_CompleteLister, -RD_CmdKind_CancelLister, +RD_CmdKind_PushQuery, +RD_CmdKind_CompleteQuery, +RD_CmdKind_CancelQuery, RD_CmdKind_ToggleDevMenu, RD_CmdKind_LogMarker, RD_CmdKind_COUNT, @@ -567,6 +572,10 @@ U64 vaddr; U64 voff; Rng1U64 vaddr_range; Rng1U64 voff_range; +UI_Key ui_key; +Vec2F32 off_px; +RD_ListerFlags lister_flags; +RD_RegSlot reg_slot; U32 pid; B32 force_confirm; B32 prefer_disasm; @@ -638,6 +647,10 @@ RD_ViewRuleUIFunctionType *ui; .voff = rd_regs()->voff,\ .vaddr_range = rd_regs()->vaddr_range,\ .voff_range = rd_regs()->voff_range,\ +.ui_key = rd_regs()->ui_key,\ +.off_px = rd_regs()->off_px,\ +.lister_flags = rd_regs()->lister_flags,\ +.reg_slot = rd_regs()->reg_slot,\ .pid = rd_regs()->pid,\ .force_confirm = rd_regs()->force_confirm,\ .prefer_disasm = rd_regs()->prefer_disasm,\ @@ -766,7 +779,7 @@ extern String8 d_entity_kind_name_lower_table[27]; extern String8 d_entity_kind_name_lower_plural_table[27]; extern String8 d_entity_kind_name_label_table[27]; extern RD_EntityKindFlags rd_entity_kind_flags_table[27]; -extern Rng1U64 rd_reg_slot_range_table[34]; +extern Rng1U64 rd_reg_slot_range_table[38]; extern RD_StringBindingPair rd_default_binding_table[110]; extern String8 rd_binding_version_remap_old_name_table[8]; extern String8 rd_binding_version_remap_new_name_table[8]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index ab8cbee8..33aa7c04 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -181,6 +181,12 @@ RD_RegTable: {Rng1U64 vaddr_range VaddrRange } {Rng1U64 voff_range VoffRange } + // rjf: ui context + {UI_Key ui_key UIKey } + {Vec2F32 off_px OffPx } + {RD_ListerFlags lister_flags ListerFlags } + {RD_RegSlot reg_slot RegSlot } + // rjf: general parameters {U32 pid PID } {B32 force_confirm ForceConfirm } @@ -228,6 +234,9 @@ RD_CmdTable: // | | | | //- rjf: exiting {Exit 1 1 Null null Nil Null 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" } + //- rjf: top-level lister + {OpenLister 1 1 Null null Nil Null 0 0 0 0 0 0 Null "open_lister" "Open Lister" "Opens the lister." "help,cmd" } + //- rjf: command runner {RunCommand 1 1 CmdName commands Nil Null 0 0 0 0 0 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" } @@ -295,7 +304,7 @@ RD_CmdTable: // | | | | {MoveTabRight 1 1 Null null Nil Null 0 0 0 0 0 0 RightArrow "move_tab_right" "Move Tab Right" "Moves the selected tab right one slot." "" } {MoveTabLeft 1 1 Null null Nil Null 0 0 0 0 0 0 LeftArrow "move_tab_left" "Move Tab Left" "Moves the selected tab left one slot." "" } {OpenTab 0 0 Null null Nil Null 0 0 0 0 0 0 Null "open_tab" "Open Tab" "Opens a new tab with the parameterized view specification." "" } - {CloseTab 1 1 Null null Nil Null 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" } + {CloseTab 1 1 View null Nil Null 0 0 0 0 0 0 X "close_tab" "Close Tab" "Closes the currently opened tab." "" } {MoveTab 0 0 Null null Nil Null 0 0 0 0 0 0 Null "move_tab" "Move Tab" "Moves a tab to a new panel." "" } {TabBarTop 1 1 Null null Nil Null 0 0 0 0 0 0 UpArrow "tab_bar_top" "Anchor Tab Bar To Top" "Anchors a panel's tab bar to the top of the panel." "" } {TabBarBottom 1 1 Null null Nil Null 0 0 0 0 0 0 DownArrow "tab_bar_bottom" "Anchor Tab Bar To Bottom" "Anchors a panel's tab bar to the bottom of the panel." "" } @@ -477,10 +486,10 @@ RD_CmdTable: // | | | | {PickFolder 0 0 FilePath null Nil Null 0 1 0 0 0 1 FolderOpenFilled "pick_folder" "Pick Folder" "Opens the file browser to pick a folder." "" } {PickFileOrFolder 0 0 FilePath null Nil Null 1 1 0 0 0 1 FileOutline "pick_file_or_folder" "Pick File/Folder" "Opens the file browser to pick a file or folder." "" } - //- rjf: lister stack - {PushLister 0 0 Null null Nil Null 0 0 0 0 0 0 Null "push_lister" "Push Lister" "Pushes a new lister onto the lister stack." "" } - {CompleteLister 0 0 Null null Nil Null 0 0 0 0 0 0 Null "complete_lister" "Complete Lister" "Completes a lister, and pops it off the lister stack." "" } - {CancelLister 0 0 Null null Nil Null 0 0 0 0 0 0 Null "cancel_lister" "Cancel Lister" "Cancels a lister, and pops it off the lister stack." "" } + //- rjf: query stack + {PushQuery 0 0 Null null Nil Null 0 0 0 0 0 0 Null "push_lister" "Push Lister" "Pushes a new lister onto the lister stack." "" } + {CompleteQuery 0 0 Null null Nil Null 0 0 0 0 0 0 Null "complete_lister" "Complete Lister" "Completes a lister, and pops it off the lister stack." "" } + {CancelQuery 0 0 Null null Nil Null 0 0 0 0 0 0 Null "cancel_lister" "Cancel Lister" "Cancels a lister, and pops it off the lister stack." "" } //- rjf: developer commands {ToggleDevMenu 1 1 Null null Nil Null 0 0 0 0 0 0 Null "toggle_dev_menu" "Toggle Developer Menu" "Opens and closes the developer menu." "" } @@ -685,7 +694,8 @@ RD_DefaultBindingTable: { "filter" Slash ctrl 0 0 } //- rjf: command lister - { "run_command" F1 0 0 0 } + // { "run_command" F1 0 0 0 } + { "open_lister" F1 0 0 0 } //- rjf: developer commands { "log_marker" M ctrl shift alt } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 5030148c..17e67d8d 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -3127,8 +3127,6 @@ rd_window_state_from_cfg(RD_Cfg *cfg) ws->ctx_menu_input_buffer = push_array(ws->arena, U8, ws->ctx_menu_input_buffer_size); ws->drop_completion_arena = arena_alloc(); ws->hover_eval_arena = arena_alloc(); - ws->lister_arena = arena_alloc(); - ws->query_cmd_arena = arena_alloc(); ws->last_dpi = os_dpi_from_window(ws->os); for EachEnumVal(RD_SettingCode, code) { @@ -3137,7 +3135,6 @@ rd_window_state_from_cfg(RD_Cfg *cfg) ws->setting_vals[code] = rd_setting_code_default_val_table[code]; } } - ws->lister_input_cursor = ws->lister_input_mark = txt_pt(1, 1); ws->setting_vals[RD_SettingCode_MainFontSize].s32 = ws->setting_vals[RD_SettingCode_MainFontSize].s32 * (ws->last_dpi / 96.f); ws->setting_vals[RD_SettingCode_CodeFontSize].s32 = ws->setting_vals[RD_SettingCode_CodeFontSize].s32 * (ws->last_dpi / 96.f); ws->setting_vals[RD_SettingCode_MainFontSize].s32 = ClampBot(ws->setting_vals[RD_SettingCode_MainFontSize].s32, rd_setting_code_default_val_table[RD_SettingCode_MainFontSize].s32); @@ -3209,7 +3206,7 @@ rd_window_frame(void) RD_PanelTree panel_tree = rd_panel_tree_from_cfg(scratch.arena, window); B32 window_is_focused = (os_window_is_focused(ws->os) || ws->window_temporarily_focused_ipc); B32 popup_is_open = (rd_state->popup_active); - B32 lister_is_open = (ws->lister_last_frame_idx+1 >= rd_state->frame_index); + B32 query_is_open = (ws->top_query_lister != 0); B32 hover_eval_is_open = (!popup_is_open && ws->hover_eval_string.size != 0 && ws->hover_eval_first_frame_idx+20 < ws->hover_eval_last_frame_idx && @@ -3346,6 +3343,36 @@ rd_window_frame(void) } } + ////////////////////////////// + //- rjf: gather listers + // + typedef struct ListerTask ListerTask; + struct ListerTask + { + ListerTask *next; + RD_Lister *lister; + UI_Key root_key; + }; + ListerTask *first_lister_task = 0; + ListerTask *last_lister_task = 0; + ProfScope("build all listers") + { + if(ws->autocomp_lister != 0 && ws->autocomp_lister_last_frame_idx+1 >= rd_state->frame_index) + { + ListerTask *task = push_array(scratch.arena, ListerTask, 1); + SLLQueuePush(first_lister_task, last_lister_task, task); + task->lister = ws->autocomp_lister; + task->root_key = ui_key_from_stringf(ui_key_zero(), "###lister_%p", task->lister); + } + if(ws->top_query_lister != 0) + { + ListerTask *task = push_array(scratch.arena, ListerTask, 1); + SLLQueuePush(first_lister_task, last_lister_task, task); + task->lister = ws->top_query_lister; + task->root_key = ui_key_from_stringf(ui_key_zero(), "###lister_%p", task->lister); + } + } + ////////////////////////////// //- rjf: build UI // @@ -3658,7 +3685,9 @@ rd_window_frame(void) { RD_ViewRuleUIFunctionType *view_ui = view_rule_info->ui; String8 expr = rd_view_expr_string(); - view_ui(expr, view_preview_container->rect); + String8 params_string = rd_string_from_cfg_tree(scratch.arena, view); + MD_Node *params = md_tree_from_string(scratch.arena, params_string); + view_ui(expr, params, view_preview_container->rect); } } } @@ -3743,7 +3772,7 @@ rd_window_frame(void) ui_divider(ui_em(1.f, 1.f)); //- rjf: draw per-window stats - for(RD_WindowState *w = rd_state->first_window_state; w != 0; w = w->order_next) + for(RD_WindowState *w = rd_state->first_window_state; w != &rd_nil_window_state; w = w->order_next) { // rjf: calc ui hash chain length F64 avg_ui_hash_chain_length = 0; @@ -3818,13 +3847,13 @@ rd_window_frame(void) } //////////////////////////// - //- rjf: prepare for active query + //- rjf: do query lister stack controls // - if(ws->query_cmd_name.size != 0) + if(ws->top_query_lister != 0) { if(ui_slot_press(UI_EventActionSlot_Cancel)) { - rd_cmd(RD_CmdKind_CancelLister); + rd_cmd(RD_CmdKind_CancelQuery); } if(ui_slot_press(UI_EventActionSlot_Accept)) { @@ -3832,522 +3861,33 @@ rd_window_frame(void) RD_RegsScope() { //rd_regs_fill_slot_from_string(query->slot, str8(ws->query_input_buffer, ws->query_input_string_size)); - rd_cmd(RD_CmdKind_CompleteLister); + rd_cmd(RD_CmdKind_CompleteQuery); } scratch_end(scratch); } - rd_set_autocomp_lister_query(.flags = 0xffffffff); } //////////////////////////// - //- rjf: build lister + //- rjf: build listers // - ProfScope("build lister") - if(ws->lister_last_frame_idx+1 >= rd_state->frame_index) + for(ListerTask *task = first_lister_task; task != 0; task = task->next) { - Temp scratch = scratch_begin(0, 0); DI_Scope *di_scope = di_scope_open(); ////////////////////////// //- rjf: unpack // - U64 input_cursor_off = ws->lister_params.cursor_off; - if(ws->lister_params.flags & RD_ListerFlag_LineEdit) - { - input_cursor_off = ws->lister_input_cursor.column-1; - } - String8 input = str8(ws->lister_input_buffer, ws->lister_input_size); - String8 query_word = rd_lister_query_word_from_input_string_off(input, input_cursor_off); - String8 query_path = rd_lister_query_path_from_input_string_off(input, input_cursor_off); - UI_Box *lister_anchor_box = ui_box_from_key(ws->lister_params.anchor_key); - DI_KeyList dbgi_keys_list = d_push_active_dbgi_key_list(scratch.arena); - DI_KeyArray dbgi_keys = di_key_array_from_list(scratch.arena, &dbgi_keys_list); + RD_Lister *lister = task->lister; + RD_ListerFlags flags = lister->regs->lister_flags; + lister->regs->string = str8(lister->input_buffer, lister->input_string_size); + lister->regs->cursor = lister->input_cursor; + lister->regs->mark = lister->input_mark; + UI_Box *anchor_box = ui_box_from_key(lister->regs->ui_key); ////////////////////////// - //- rjf: grab rdis + //- rjf: parameters -> lister items // - U64 rdis_count = dbgi_keys.count; - RDI_Parsed **rdis = push_array(scratch.arena, RDI_Parsed *, rdis_count); - { - for(U64 idx = 0; idx < rdis_count; idx += 1) - { - RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_keys.v[idx], 0); - RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); - rdis[idx] = rdi; - } - } - - ////////////////////////// - //- rjf: unpack lister params - // - CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_base_regs()->thread); - U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, rd_base_regs()->unwind_count); - CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); - CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); - U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); - DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); - - ////////////////////////// - //- rjf: gather lister items - // - RD_ListerItemChunkList item_list = {0}; - { - //////////////////////// - //- rjf: gather locals - // - if(ws->lister_params.flags & RD_ListerFlag_Locals) - { - E_String2NumMap *locals_map = d_query_cached_locals_map_from_dbgi_key_voff(&dbgi_key, thread_rip_voff); - E_String2NumMap *member_map = d_query_cached_member_map_from_dbgi_key_voff(&dbgi_key, thread_rip_voff); - for(E_String2NumMapNode *n = locals_map->first; n != 0; n = n->order_next) - { - FuzzyMatchRangeList display_name__matches = fuzzy_match_find(scratch.arena, query_word, n->string); - if(display_name__matches.count == display_name__matches.needle_part_count) - { - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = n->string, - .kind_name = str8_lit("Local"), - .display_name = n->string, - .display_name__matches = display_name__matches); - } - } - for(E_String2NumMapNode *n = member_map->first; n != 0; n = n->order_next) - { - FuzzyMatchRangeList display_name__matches = fuzzy_match_find(scratch.arena, query_word, n->string); - if(display_name__matches.count == display_name__matches.needle_part_count) - { - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = n->string, - .kind_name = str8_lit("Local (Member)"), - .display_name = n->string, - .display_name__matches = display_name__matches); - } - } - } - - //////////////////////// - //- rjf: gather registers - // - if(ws->lister_params.flags & RD_ListerFlag_Registers) - { - Arch arch = thread->arch; - U64 reg_names_count = regs_reg_code_count_from_arch(arch); - U64 alias_names_count = regs_alias_code_count_from_arch(arch); - String8 *reg_names = regs_reg_code_string_table_from_arch(arch); - String8 *alias_names = regs_alias_code_string_table_from_arch(arch); - for(U64 idx = 0; idx < reg_names_count; idx += 1) - { - if(reg_names[idx].size != 0) - { - String8 display_name = reg_names[idx]; - FuzzyMatchRangeList display_name__matches = fuzzy_match_find(scratch.arena, query_word, display_name); - if(display_name__matches.count == display_name__matches.needle_part_count) - { - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = display_name, - .kind_name = str8_lit("Register"), - .display_name = display_name, - .display_name__matches = display_name__matches); - } - } - } - for(U64 idx = 0; idx < alias_names_count; idx += 1) - { - if(alias_names[idx].size != 0) - { - String8 display_name = alias_names[idx]; - FuzzyMatchRangeList display_name__matches = fuzzy_match_find(scratch.arena, query_word, display_name); - if(display_name__matches.count == display_name__matches.needle_part_count) - { - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = display_name, - .kind_name = str8_lit("Reg. Alias"), - .display_name = display_name, - .display_name__matches = display_name__matches); - } - } - } - } - - //////////////////////// - //- rjf: gather view rules - // - if(ws->lister_params.flags & RD_ListerFlag_ViewRules) - { - for(U64 slot_idx = 0; slot_idx < d_state->view_rule_spec_table_size; slot_idx += 1) - { - for(D_ViewRuleSpec *spec = d_state->view_rule_spec_table[slot_idx]; spec != 0 && spec != &d_nil_core_view_rule_spec; spec = spec->hash_next) - { - String8 display_name = spec->info.string; - FuzzyMatchRangeList display_name__matches = fuzzy_match_find(scratch.arena, query_word, display_name); - String8 description = spec->info.description; - FuzzyMatchRangeList description__matches = fuzzy_match_find(scratch.arena, query_word, description); - if(display_name__matches.count == display_name__matches.needle_part_count || - description__matches.count == description__matches.needle_part_count) - { - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = display_name, - .kind_name = str8_lit("View Rule"), - .display_name = display_name, - .display_name__matches = display_name__matches, - .description = description, - .description__matches = description__matches); - } - } - } - } - - //////////////////////// - //- rjf: gather members - // - if(ws->lister_params.flags & RD_ListerFlag_Members) - { - // TODO(rjf) - } - - //////////////////////// - //- rjf: gather globals - // - if(ws->lister_params.flags & RD_ListerFlag_Globals && query_word.size != 0) - { - U128 search_key = {d_hash_from_string(str8_lit("autocomp_globals_search_key")), d_hash_from_string(str8_lit("autocomp_globals_search_key"))}; - DI_SearchParams search_params = - { - RDI_SectionKind_GlobalVariables, - dbgi_keys, - }; - B32 is_stale = 0; - DI_SearchItemArray items = di_search_items_from_key_params_query(di_scope, search_key, &search_params, query_word, 0, &is_stale); - for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) - { - // rjf: skip bad elements - if(items.v[idx].dbgi_idx >= rdis_count) - { - continue; - } - - // rjf: unpack info - RDI_Parsed *rdi = rdis[items.v[idx].dbgi_idx]; - String8 display_name = di_search_item_string_from_rdi_target_element_idx(rdi, search_params.target, items.v[idx].idx); - FuzzyMatchRangeList display_name__matches = items.v[idx].match_ranges; - - // rjf: push item - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = display_name, - .kind_name = str8_lit("Global"), - .display_name = display_name, - .display_name__matches = display_name__matches, - .group = 1); - } - } - - //////////////////////// - //- rjf: gather thread locals - // - if(ws->lister_params.flags & RD_ListerFlag_ThreadLocals && query_word.size != 0) - { - U128 search_key = {d_hash_from_string(str8_lit("autocomp_tvars_dis_key")), d_hash_from_string(str8_lit("autocomp_tvars_dis_key"))}; - DI_SearchParams search_params = - { - RDI_SectionKind_ThreadVariables, - dbgi_keys, - }; - B32 is_stale = 0; - DI_SearchItemArray items = di_search_items_from_key_params_query(di_scope, search_key, &search_params, query_word, 0, &is_stale); - for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) - { - // rjf: skip bad elements - if(items.v[idx].dbgi_idx >= rdis_count) - { - continue; - } - - // rjf: unpack info - RDI_Parsed *rdi = rdis[items.v[idx].dbgi_idx]; - String8 display_name = di_search_item_string_from_rdi_target_element_idx(rdi, search_params.target, items.v[idx].idx); - FuzzyMatchRangeList display_name__matches = items.v[idx].match_ranges; - - // rjf: push item - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = display_name, - .kind_name = str8_lit("Thread Local"), - .display_name = display_name, - .display_name__matches = display_name__matches, - .group = 1); - } - } - - //////////////////////// - //- rjf: gather procedures - // - if(ws->lister_params.flags & RD_ListerFlag_Procedures && query_word.size != 0) - { - U128 search_key = {d_hash_from_string(str8_lit("autocomp_procedures_search_key")), d_hash_from_string(str8_lit("autocomp_procedures_search_key"))}; - DI_SearchParams search_params = - { - RDI_SectionKind_Procedures, - dbgi_keys, - }; - B32 is_stale = 0; - DI_SearchItemArray items = di_search_items_from_key_params_query(di_scope, search_key, &search_params, query_word, 0, &is_stale); - for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) - { - // rjf: skip bad elements - if(items.v[idx].dbgi_idx >= rdis_count) - { - continue; - } - - // rjf: unpack info - RDI_Parsed *rdi = rdis[items.v[idx].dbgi_idx]; - String8 display_name = di_search_item_string_from_rdi_target_element_idx(rdi, search_params.target, items.v[idx].idx); - FuzzyMatchRangeList display_name__matches = items.v[idx].match_ranges; - - // rjf: push item - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = display_name, - .kind_name = str8_lit("Procedure"), - .display_name = display_name, - .display_name__matches = display_name__matches, - .group = 1); - } - } - - //////////////////////// - //- rjf: gather types - // - if(ws->lister_params.flags & RD_ListerFlag_Types && query_word.size != 0) - { - U128 search_key = {d_hash_from_string(str8_lit("autocomp_types_search_key")), d_hash_from_string(str8_lit("autocomp_types_search_key"))}; - DI_SearchParams search_params = - { - RDI_SectionKind_UDTs, - dbgi_keys, - }; - B32 is_stale = 0; - DI_SearchItemArray items = di_search_items_from_key_params_query(di_scope, search_key, &search_params, query_word, 0, &is_stale); - for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) - { - // rjf: skip bad elements - if(items.v[idx].dbgi_idx >= rdis_count) - { - continue; - } - - // rjf: unpack info - RDI_Parsed *rdi = rdis[items.v[idx].dbgi_idx]; - String8 display_name = di_search_item_string_from_rdi_target_element_idx(rdi, search_params.target, items.v[idx].idx); - FuzzyMatchRangeList display_name__matches = items.v[idx].match_ranges; - - // rjf: push item - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = display_name, - .kind_name = str8_lit("Type"), - .display_name = display_name, - .display_name__matches = display_name__matches, - .group = 1); - } - } - - //////////////////////// - //- rjf: gather languages - // - if(ws->lister_params.flags & RD_ListerFlag_Languages) - { - for EachNonZeroEnumVal(TXT_LangKind, lang) - { - String8 display_name = txt_extension_from_lang_kind(lang); - if(display_name.size != 0) - { - FuzzyMatchRangeList display_name__matches = fuzzy_match_find(scratch.arena, query_word, display_name); - if(display_name__matches.count == display_name__matches.needle_part_count) - { - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = display_name, - .kind_name = str8_lit("Language"), - .display_name = display_name, - .display_name__matches = display_name__matches); - } - } - } - } - - //////////////////////// - //- rjf: gather architectures - // - if(ws->lister_params.flags & RD_ListerFlag_Architectures) - { - for EachNonZeroEnumVal(Arch, arch) - { - String8 display_name = string_from_arch(arch); - FuzzyMatchRangeList display_name__matches = fuzzy_match_find(scratch.arena, query_word, display_name); - if(display_name__matches.count == display_name__matches.needle_part_count) - { - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = display_name, - .kind_name = str8_lit("Architecture"), - .display_name = display_name, - .display_name__matches = display_name__matches); - } - } - } - - //////////////////////// - //- rjf: gather tex2dformats - // - if(ws->lister_params.flags & RD_ListerFlag_Tex2DFormats) - { - for EachEnumVal(R_Tex2DFormat, fmt) - { - String8 display_name = lower_from_str8(scratch.arena, r_tex2d_format_display_string_table[fmt]); - FuzzyMatchRangeList display_name__matches = fuzzy_match_find(scratch.arena, query_word, display_name); - if(display_name__matches.count == display_name__matches.needle_part_count) - { - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = display_name, - .kind_name = str8_lit("2D Texture Format"), - .display_name = display_name, - .display_name__matches = display_name__matches); - } - } - } - - //////////////////////// - //- rjf: gather view rule params - // - if(ws->lister_params.flags & RD_ListerFlag_ViewRuleParams) - { - for(String8Node *n = ws->lister_params.strings.first; n != 0; n = n->next) - { - String8 display_name = n->string; - FuzzyMatchRangeList display_name__matches = fuzzy_match_find(scratch.arena, query_word, display_name); - if(display_name__matches.count == display_name__matches.needle_part_count) - { - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = display_name, - .kind_name = str8_lit("View Rule Parameter"), - .display_name = display_name, - .display_name__matches = display_name__matches); - } - } - } - - //////////////////////// - //- rjf: gather files - // - if(ws->lister_params.flags & RD_ListerFlag_Files) - { - // rjf: find containing directory in query_path - String8 dir_str_in_input = {0}; - for(U64 i = 0; i < query_path.size; i += 1) - { - String8 substr1 = str8_substr(query_path, r1u64(i, i+1)); - String8 substr2 = str8_substr(query_path, r1u64(i, i+2)); - String8 substr3 = str8_substr(query_path, r1u64(i, i+3)); - if(str8_match(substr1, str8_lit("/"), StringMatchFlag_SlashInsensitive)) - { - dir_str_in_input = str8_substr(query_path, r1u64(i, query_path.size)); - } - else if(i != 0 && str8_match(substr2, str8_lit(":/"), StringMatchFlag_SlashInsensitive)) - { - dir_str_in_input = str8_substr(query_path, r1u64(i-1, query_path.size)); - } - else if(str8_match(substr2, str8_lit("./"), StringMatchFlag_SlashInsensitive)) - { - dir_str_in_input = str8_substr(query_path, r1u64(i, query_path.size)); - } - else if(str8_match(substr3, str8_lit("../"), StringMatchFlag_SlashInsensitive)) - { - dir_str_in_input = str8_substr(query_path, r1u64(i, query_path.size)); - } - if(dir_str_in_input.size != 0) - { - break; - } - } - - // rjf: use query_path string to form various parts of search space - String8 prefix = {0}; - String8 path = {0}; - String8 search = {0}; - if(dir_str_in_input.size != 0) - { - String8 dir = dir_str_in_input; - U64 one_past_last_slash = dir.size; - for(U64 i = 0; i < dir_str_in_input.size; i += 1) - { - if(dir_str_in_input.str[i] == '/' || dir_str_in_input.str[i] == '\\') - { - one_past_last_slash = i+1; - } - } - dir.size = one_past_last_slash; - path = dir; - search = str8_substr(dir_str_in_input, r1u64(one_past_last_slash, dir_str_in_input.size)); - prefix = str8_substr(query_path, r1u64(0, path.str - query_path.str)); - } - - // rjf: get current files, filtered - B32 allow_dirs = 1; - OS_FileIter *it = os_file_iter_begin(scratch.arena, path, 0); - for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, it, &info);) - { - FuzzyMatchRangeList match_ranges = fuzzy_match_find(scratch.arena, search, info.name); - B32 fits_search = (match_ranges.count == match_ranges.needle_part_count); - B32 fits_dir_only = (allow_dirs || !(info.props.flags & FilePropertyFlag_IsFolder)); - if(fits_search && fits_dir_only) - { - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .string = info.name, - .kind_name = info.props.flags & FilePropertyFlag_IsFolder ? str8_lit("Folder") : str8_lit("File"), - .display_name = info.name, - .icon_kind = info.props.flags & FilePropertyFlag_IsFolder ? RD_IconKind_FolderClosedFilled : RD_IconKind_FileOutline, - .display_name__matches = match_ranges, - .is_non_code = 1); - } - } - os_file_iter_end(it); - } - - //////////////////////// - //- rjf: gather commands - // - if(ws->lister_params.flags & RD_ListerFlag_Commands) - { - for EachNonZeroEnumVal(RD_CmdKind, k) - { - RD_CmdKindInfo *info = &rd_cmd_kind_info_table[k]; - String8 cmd_display_name = info->display_name; - String8 cmd_desc = info->description; - String8 cmd_tags = info->search_tags; - FuzzyMatchRangeList name_matches = fuzzy_match_find(scratch.arena, query_word, cmd_display_name); - FuzzyMatchRangeList desc_matches = fuzzy_match_find(scratch.arena, query_word, cmd_desc); - FuzzyMatchRangeList tags_matches = fuzzy_match_find(scratch.arena, query_word, cmd_tags); - if(name_matches.count == name_matches.needle_part_count || - desc_matches.count == name_matches.needle_part_count || - tags_matches.count > 0 || - name_matches.needle_part_count == 0) - { - rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, - .icon_kind = info->icon_kind, - .string = info->string, - .kind_name = str8_lit("Command"), - .display_name = cmd_display_name, - .display_name__matches = name_matches, - .description = cmd_desc, - .description__matches = desc_matches, - .is_non_code = 1, - .can_have_bindings = 1); - } - } - } - } - - ////////////////////////// - //- rjf: lister item list -> sorted array - // - RD_ListerItemArray item_array = rd_lister_item_array_from_chunk_list(scratch.arena, &item_list); - rd_lister_item_array_sort__in_place(&item_array); + RD_ListerItemArray item_array = rd_lister_item_array_from_regs(scratch.arena, lister->regs); ////////////////////////// //- rjf: animate values @@ -4355,22 +3895,22 @@ rd_window_frame(void) F32 fast_rate = 1 - pow_f32(2, (-40.f * rd_state->frame_dt)); F32 lister_open_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "lister_open"), 1.f); F32 lister_num_of_rows_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "lister_num_of_rows"), (F32)item_array.count); - ws->lister_scroll_pt.off -= ws->lister_scroll_pt.off*fast_rate; + lister->scroll_pt.off -= lister->scroll_pt.off*fast_rate; ////////////////////////// //- rjf: unpack build parameters // - F32 squish = ((ws->lister_params.squish != 0.f) ? ws->lister_params.squish : (0.25f - 0.25f*lister_open_t)); - F32 transparency = ((ws->lister_params.transparency != 0.f) ? ws->lister_params.transparency : 1.f-lister_open_t); + F32 squish = (0.25f - 0.25f*lister_open_t); + F32 transparency = (1.f - lister_open_t); F32 row_height_px = floor_f32(ui_top_font_size()*2.5f); - if(ws->lister_params.flags & RD_ListerFlag_Descriptions) + if(lister->regs->lister_flags & RD_ListerFlag_Descriptions) { row_height_px += floor_f32(ui_top_font_size()*3.5f); } Vec2F32 content_rect_dim = dim_2f32(content_rect); Vec2F32 content_rect_center = center_2f32(content_rect); F32 line_edit_height_px = 0; - if(ws->lister_params.flags & RD_ListerFlag_LineEdit) + if(lister->regs->lister_flags & RD_ListerFlag_LineEdit) { line_edit_height_px = floor_f32(ui_top_font_size()*3.f); } @@ -4380,9 +3920,9 @@ rd_window_frame(void) content_rect_dim.x*0.5f, line_edit_height_px + lister_num_of_rows_t*row_height_px, }; - if(!ui_box_is_nil(lister_anchor_box)) + if(!ui_box_is_nil(anchor_box)) { - lister_dim_px.x = dim_2f32(lister_anchor_box->rect).x; + lister_dim_px.x = dim_2f32(anchor_box->rect).x; } lister_dim_px.x = Max(lister_dim_px.x, ui_top_font_size()*30.f); lister_dim_px.y = Min(lister_dim_px.y, lister_height_max); @@ -4391,10 +3931,10 @@ rd_window_frame(void) content_rect_center.x - lister_dim_px.x/2, content_rect_center.y - content_rect_dim.y*0.9f/2, }; - if(!ui_box_is_nil(lister_anchor_box)) + if(!ui_box_is_nil(anchor_box)) { - lister_pos_px = v2f32(lister_anchor_box->rect.x0 + ws->lister_params.anchor_off.x, - lister_anchor_box->rect.y0 + ws->lister_params.anchor_off.y); + lister_pos_px = v2f32(anchor_box->rect.x0 + lister->regs->off_px.x, + anchor_box->rect.y0 + lister->regs->off_px.y); } ////////////////////////// @@ -4412,21 +3952,21 @@ rd_window_frame(void) UI_Transparency(transparency) RD_Palette(RD_PaletteCode_Floating) { - lister_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - UI_BoxFlag_Clip| - UI_BoxFlag_RoundChildrenByParent| - UI_BoxFlag_DisableFocusOverlay| - UI_BoxFlag_DrawBorder| - UI_BoxFlag_DrawBackgroundBlur| - UI_BoxFlag_DrawDropShadow| - UI_BoxFlag_DrawBackground, - "lister_box"); + lister_box = ui_build_box_from_key(UI_BoxFlag_Clickable| + UI_BoxFlag_Clip| + UI_BoxFlag_RoundChildrenByParent| + UI_BoxFlag_DisableFocusOverlay| + UI_BoxFlag_DrawBorder| + UI_BoxFlag_DrawBackgroundBlur| + UI_BoxFlag_DrawDropShadow| + UI_BoxFlag_DrawBackground, + task->root_key); } ////////////////////////// //- rjf: build lister line edit // - if(ws->lister_params.flags & RD_ListerFlag_LineEdit) + if(flags & RD_ListerFlag_LineEdit) UI_WidthFill UI_Parent(lister_box) UI_Focus(UI_FocusKind_On) @@ -4436,13 +3976,13 @@ rd_window_frame(void) UI_Signal sig = rd_line_edit(RD_LineEditFlag_Border, 0, 0, - &ws->lister_input_cursor, - &ws->lister_input_mark, - ws->lister_input_buffer, - sizeof(ws->lister_input_buffer), - &ws->lister_input_size, + &lister->input_cursor, + &lister->input_mark, + lister->input_buffer, + sizeof(lister->input_buffer), + &lister->input_string_size, 0, - str8(ws->lister_input_buffer, ws->lister_input_size), + str8(lister->input_buffer, lister->input_string_size), str8_lit("###lister_text_input")); } } @@ -4464,7 +4004,7 @@ rd_window_frame(void) UI_ScrollListSignal scroll_list_signal = {0}; UI_WidthFill UI_HeightFill UI_Parent(lister_box) - UI_ScrollList(¶ms, &ws->lister_scroll_pt, &cursor, 0, &visible_row_range, &scroll_list_signal) + UI_ScrollList(¶ms, &lister->scroll_pt, &cursor, 0, &visible_row_range, &scroll_list_signal) RD_Palette(RD_PaletteCode_ImplicitButton) { UI_HoverCursor(OS_Cursor_HandPoint) @@ -4519,7 +4059,7 @@ rd_window_frame(void) } // rjf: description - if(ws->lister_params.flags & RD_ListerFlag_Descriptions) + if(flags & RD_ListerFlag_Descriptions) { if(item->description.size != 0) UI_WidthFill UI_Row UI_PrefWidth(ui_text_dim(1, 0)) UI_Flags(UI_BoxFlag_DrawTextWeak) { @@ -4548,6 +4088,7 @@ rd_window_frame(void) UI_Signal item_sig = ui_signal_from_box(item_box); if(ui_clicked(item_sig)) { +#if 0 // TODO(rjf): @cfg UI_Event move_back_evt = zero_struct; move_back_evt.kind = UI_EventKind_Navigate; move_back_evt.flags = UI_EventFlag_KeepMark; @@ -4558,6 +4099,7 @@ rd_window_frame(void) paste_evt.string = item->string; ui_event_list_push(ui_build_arena(), &ws->ui_events, &paste_evt); lister_box->default_nav_focus_hot_key = lister_box->default_nav_focus_active_key = lister_box->default_nav_focus_next_hot_key = lister_box->default_nav_focus_next_active_key = ui_key_zero(); +#endif } else if(item_box->flags & UI_BoxFlag_FocusHot && !(item_box->flags & UI_BoxFlag_FocusHotDisabled)) { @@ -4570,7 +4112,6 @@ rd_window_frame(void) } di_scope_close(di_scope); - scratch_end(scratch); } #if 0 // TODO(rjf): @cfg @@ -4778,7 +4319,7 @@ rd_window_frame(void) RD_RegsScope() { rd_regs_fill_slot_from_string(query->slot, str8(ws->query_input_buffer, ws->query_input_string_size)); - rd_cmd(RD_CmdKind_CompleteLister); + rd_cmd(RD_CmdKind_CompleteQuery); } scratch_end(scratch); } @@ -6522,7 +6063,7 @@ rd_window_frame(void) //- rjf: build if good if(!e_type_key_match(eval.type_key, e_type_key_zero()) && !ui_any_ctx_menu_is_open()) - UI_Focus((hover_eval_is_open && !ui_any_ctx_menu_is_open() && ws->hover_eval_focused && !lister_is_open) ? UI_FocusKind_Null : UI_FocusKind_Off) + UI_Focus((hover_eval_is_open && !ui_any_ctx_menu_is_open() && ws->hover_eval_focused && !query_is_open) ? UI_FocusKind_Null : UI_FocusKind_Off) { //- rjf: eval -> viz artifacts F32 row_height = floor_f32(ui_top_font_size()*2.8f); @@ -7137,14 +6678,15 @@ rd_window_frame(void) if(panel->first != &rd_nil_panel_node) {continue;} B32 panel_is_focused = (window_is_focused && !ws->menu_bar_focused && - !lister_is_open && + !query_is_open && !ui_any_ctx_menu_is_open() && !ws->hover_eval_focused && panel_tree.focused == panel); RD_Cfg *selected_tab = panel->selected_tab; RD_ViewState *selected_tab_view_state = rd_view_state_from_cfg(selected_tab); F32 selected_tab_is_filtering_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "###is_filtering_t_%p", selected_tab), (F32)!!selected_tab_view_state->is_filtering); - UI_Focus(panel_is_focused ? UI_FocusKind_Null : UI_FocusKind_Off) + ProfScope("leaf panel UI work - %.*s", str8_varg(selected_tab->string)) + UI_Focus(panel_is_focused ? UI_FocusKind_Null : UI_FocusKind_Off) RD_RegsScope(.panel = rd_handle_from_cfg(panel->cfg), .view = rd_handle_from_cfg(selected_tab)) { @@ -7491,16 +7033,18 @@ rd_window_frame(void) //- rjf: build empty view UI_Parent(view_container_box) if(selected_tab == &rd_nil_cfg) { - RD_VIEW_RULE_UI_FUNCTION_NAME(empty)(str8_zero(), content_rect); + RD_VIEW_RULE_UI_FUNCTION_NAME(empty)(str8_zero(), &md_nil_node, content_rect); } //- rjf: build tab view - UI_Parent(view_container_box) if(selected_tab != &rd_nil_cfg) + UI_Parent(view_container_box) if(selected_tab != &rd_nil_cfg) ProfScope("build tab view") { String8 view_expr = rd_view_expr_string(); + String8 params_string = rd_string_from_cfg_tree(scratch.arena, selected_tab); + MD_Node *params = md_tree_from_string(scratch.arena, params_string); RD_ViewRuleInfo *view_rule_info = rd_view_rule_info_from_string(selected_tab->string); RD_ViewRuleUIFunctionType *view_ui = view_rule_info->ui; - view_ui(view_expr, content_rect); + view_ui(view_expr, params, content_rect); } //- rjf: pop interaction registers; commit if this is the selected view @@ -7737,7 +7281,12 @@ rd_window_frame(void) } else if(ui_right_clicked(sig)) { - rd_open_ctx_menu(sig.box->key, v2f32(0, sig.box->rect.y1 - sig.box->rect.y0), RD_RegSlot_View); + // rd_open_ctx_menu(sig.box->key, v2f32(0, sig.box->rect.y1 - sig.box->rect.y0), RD_RegSlot_View); + rd_cmd(RD_CmdKind_PushQuery, + .ui_key = sig.box->key, + .off_px = v2f32(0, sig.box->rect.y1 - sig.box->rect.y0), + .lister_flags = RD_ListerFlag_LineEdit|RD_ListerFlag_Commands, + .reg_slot = RD_RegSlot_View); } else if(ui_middle_clicked(sig)) { @@ -8106,36 +7655,42 @@ rd_window_frame(void) } ////////////////////////////// - //- rjf: attach lister box to root, or hide if it has not been renewed + //- rjf: attach lister boxes to root, or hide if it has not been renewed // - if(!ui_box_is_nil(lister_box) && ws->lister_last_frame_idx+1 >= rd_state->frame_index+1) + for(ListerTask *task = first_lister_task; task != 0; task = task->next) { - UI_Box *lister_root_box = ui_box_from_key(ws->lister_params.anchor_key); - if(!ui_box_is_nil(lister_root_box)) + RD_Lister *lister = task->lister; + RD_Regs *regs = lister->regs; + UI_Box *lister_box = ui_box_from_key(task->root_key); + if(!ui_box_is_nil(lister_box) && (lister != ws->autocomp_lister || ws->autocomp_lister_last_frame_idx+1 >= rd_state->frame_index+1)) { - Vec2F32 size = lister_box->fixed_size; - lister_box->fixed_position = v2f32(lister_root_box->rect.x0 + ws->lister_params.anchor_off.x, - lister_root_box->rect.y0 + ws->lister_params.anchor_off.y); - lister_box->rect = r2f32(lister_box->fixed_position, add_2f32(lister_box->fixed_position, size)); - for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis + 1)) + UI_Box *anchor_box = ui_box_from_key(lister->regs->ui_key); + if(!ui_box_is_nil(anchor_box)) { - ui_calc_sizes_standalone__in_place_rec(lister_box, axis); - ui_calc_sizes_upwards_dependent__in_place_rec(lister_box, axis); - ui_calc_sizes_downwards_dependent__in_place_rec(lister_box, axis); - ui_layout_enforce_constraints__in_place_rec(lister_box, axis); - ui_layout_position__in_place_rec(lister_box, axis); + Vec2F32 size = lister_box->fixed_size; + lister_box->fixed_position = v2f32(anchor_box->rect.x0 + lister->regs->off_px.x, + anchor_box->rect.y0 + lister->regs->off_px.y); + lister_box->rect = r2f32(lister_box->fixed_position, add_2f32(lister_box->fixed_position, size)); + for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis + 1)) + { + ui_calc_sizes_standalone__in_place_rec(lister_box, axis); + ui_calc_sizes_upwards_dependent__in_place_rec(lister_box, axis); + ui_calc_sizes_downwards_dependent__in_place_rec(lister_box, axis); + ui_layout_enforce_constraints__in_place_rec(lister_box, axis); + ui_layout_position__in_place_rec(lister_box, axis); + } } } - } - else if(!ui_box_is_nil(lister_box) && ws->lister_last_frame_idx+1 < rd_state->frame_index+1) - { - UI_Box *lister_root_box = ui_box_from_key(ws->lister_params.anchor_key); - if(!ui_box_is_nil(lister_root_box)) + else if(!ui_box_is_nil(lister_box) && lister == ws->autocomp_lister && ws->autocomp_lister_last_frame_idx+1 < rd_state->frame_index+1) { - Vec2F32 size = lister_box->fixed_size; - Rng2F32 window_rect = os_client_rect_from_window(ws->os); - lister_box->fixed_position = v2f32(window_rect.x1, window_rect.y1); - lister_box->rect = r2f32(lister_box->fixed_position, add_2f32(lister_box->fixed_position, size)); + UI_Box *anchor_box = ui_box_from_key(lister->regs->ui_key); + if(!ui_box_is_nil(anchor_box)) + { + Vec2F32 size = lister_box->fixed_size; + Rng2F32 window_rect = os_client_rect_from_window(ws->os); + lister_box->fixed_position = v2f32(window_rect.x1, window_rect.y1); + lister_box->rect = r2f32(lister_box->fixed_position, add_2f32(lister_box->fixed_position, size)); + } } } @@ -9815,7 +9370,7 @@ rd_set_hover_eval(Vec2F32 pos, String8 file_path, TxtPt pt, U64 vaddr, String8 s } //////////////////////////////// -//~ rjf: Auto-Complete Lister +//~ rjf: Lister Functions internal void rd_lister_item_chunk_list_push(Arena *arena, RD_ListerItemChunkList *list, U64 cap, RD_ListerItem *item) @@ -9906,6 +9461,477 @@ rd_lister_item_array_sort__in_place(RD_ListerItemArray *array) quick_sort(array->v, array->count, sizeof(array->v[0]), rd_lister_item_qsort_compare); } +internal RD_ListerItemArray +rd_lister_item_array_from_regs(Arena *arena, RD_Regs *regs) +{ + Temp scratch = scratch_begin(&arena, 1); + DI_Scope *di_scope = di_scope_open(); + RD_ListerFlags flags = regs->lister_flags; + String8 needle = regs->string; + U64 cursor_off = regs->cursor.column-1; + cursor_off = Clamp(0, cursor_off, needle.size); + String8 needle_path = rd_lister_query_path_from_input_string_off(needle, cursor_off); + RD_ListerItemChunkList item_list = {0}; + DI_KeyList dbgi_keys_list = d_push_active_dbgi_key_list(scratch.arena); + DI_KeyArray dbgi_keys = di_key_array_from_list(scratch.arena, &dbgi_keys_list); + + ////////////////////////// + //- rjf: grab rdis + // + U64 rdis_count = dbgi_keys.count; + RDI_Parsed **rdis = push_array(scratch.arena, RDI_Parsed *, rdis_count); + { + for(U64 idx = 0; idx < rdis_count; idx += 1) + { + RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_keys.v[idx], 0); + RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0); + rdis[idx] = rdi; + } + } + + //- rjf: gather locals + if(flags & RD_ListerFlag_Locals) + { + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, rd_regs()->unwind_count); + CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); + CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr); + U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr); + DI_Key dbgi_key = ctrl_dbgi_key_from_module(module); + E_String2NumMap *locals_map = d_query_cached_locals_map_from_dbgi_key_voff(&dbgi_key, thread_rip_voff); + E_String2NumMap *member_map = d_query_cached_member_map_from_dbgi_key_voff(&dbgi_key, thread_rip_voff); + for(E_String2NumMapNode *n = locals_map->first; n != 0; n = n->order_next) + { + FuzzyMatchRangeList display_name__matches = fuzzy_match_find(arena, needle, n->string); + if(display_name__matches.count == display_name__matches.needle_part_count) + { + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = n->string, + .kind_name = str8_lit("Local"), + .display_name = n->string, + .display_name__matches = display_name__matches); + } + } + for(E_String2NumMapNode *n = member_map->first; n != 0; n = n->order_next) + { + FuzzyMatchRangeList display_name__matches = fuzzy_match_find(arena, needle, n->string); + if(display_name__matches.count == display_name__matches.needle_part_count) + { + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = n->string, + .kind_name = str8_lit("Local (Member)"), + .display_name = n->string, + .display_name__matches = display_name__matches); + } + } + } + + //- rjf: gather registers + if(flags & RD_ListerFlag_Registers) + { + CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); + Arch arch = thread->arch; + U64 reg_names_count = regs_reg_code_count_from_arch(arch); + U64 alias_names_count = regs_alias_code_count_from_arch(arch); + String8 *reg_names = regs_reg_code_string_table_from_arch(arch); + String8 *alias_names = regs_alias_code_string_table_from_arch(arch); + for(U64 idx = 0; idx < reg_names_count; idx += 1) + { + if(reg_names[idx].size != 0) + { + String8 display_name = reg_names[idx]; + FuzzyMatchRangeList display_name__matches = fuzzy_match_find(arena, needle, display_name); + if(display_name__matches.count == display_name__matches.needle_part_count) + { + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = display_name, + .kind_name = str8_lit("Register"), + .display_name = display_name, + .display_name__matches = display_name__matches); + } + } + } + for(U64 idx = 0; idx < alias_names_count; idx += 1) + { + if(alias_names[idx].size != 0) + { + String8 display_name = alias_names[idx]; + FuzzyMatchRangeList display_name__matches = fuzzy_match_find(arena, needle, display_name); + if(display_name__matches.count == display_name__matches.needle_part_count) + { + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = display_name, + .kind_name = str8_lit("Reg. Alias"), + .display_name = display_name, + .display_name__matches = display_name__matches); + } + } + } + } + + //- rjf: gather view rules + if(flags & RD_ListerFlag_ViewRules) + { + for(U64 slot_idx = 0; slot_idx < d_state->view_rule_spec_table_size; slot_idx += 1) + { + for(D_ViewRuleSpec *spec = d_state->view_rule_spec_table[slot_idx]; spec != 0 && spec != &d_nil_core_view_rule_spec; spec = spec->hash_next) + { + String8 display_name = spec->info.string; + FuzzyMatchRangeList display_name__matches = fuzzy_match_find(arena, needle, display_name); + String8 description = spec->info.description; + FuzzyMatchRangeList description__matches = fuzzy_match_find(arena, needle, description); + if(display_name__matches.count == display_name__matches.needle_part_count || + description__matches.count == description__matches.needle_part_count) + { + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = display_name, + .kind_name = str8_lit("View Rule"), + .display_name = display_name, + .display_name__matches = display_name__matches, + .description = description, + .description__matches = description__matches); + } + } + } + } + + //- rjf: gather members + if(flags & RD_ListerFlag_Members) + { + // TODO(rjf) + } + + //- rjf: gather globals + if(flags & RD_ListerFlag_Globals && needle.size != 0) + { + U128 search_key = {d_hash_from_string(str8_lit("autocomp_globals_search_key")), d_hash_from_string(str8_lit("autocomp_globals_search_key"))}; + DI_SearchParams search_params = + { + RDI_SectionKind_GlobalVariables, + dbgi_keys, + }; + B32 is_stale = 0; + DI_SearchItemArray items = di_search_items_from_key_params_query(di_scope, search_key, &search_params, needle, 0, &is_stale); + for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) + { + // rjf: skip bad elements + if(items.v[idx].dbgi_idx >= rdis_count) + { + continue; + } + + // rjf: unpack info + RDI_Parsed *rdi = rdis[items.v[idx].dbgi_idx]; + String8 display_name = di_search_item_string_from_rdi_target_element_idx(rdi, search_params.target, items.v[idx].idx); + FuzzyMatchRangeList display_name__matches = items.v[idx].match_ranges; + + // rjf: push item + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = display_name, + .kind_name = str8_lit("Global"), + .display_name = display_name, + .display_name__matches = display_name__matches, + .group = 1); + } + } + + //- rjf: gather thread locals + if(flags & RD_ListerFlag_ThreadLocals && needle.size != 0) + { + U128 search_key = {d_hash_from_string(str8_lit("autocomp_tvars_dis_key")), d_hash_from_string(str8_lit("autocomp_tvars_dis_key"))}; + DI_SearchParams search_params = + { + RDI_SectionKind_ThreadVariables, + dbgi_keys, + }; + B32 is_stale = 0; + DI_SearchItemArray items = di_search_items_from_key_params_query(di_scope, search_key, &search_params, needle, 0, &is_stale); + for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) + { + // rjf: skip bad elements + if(items.v[idx].dbgi_idx >= rdis_count) + { + continue; + } + + // rjf: unpack info + RDI_Parsed *rdi = rdis[items.v[idx].dbgi_idx]; + String8 display_name = di_search_item_string_from_rdi_target_element_idx(rdi, search_params.target, items.v[idx].idx); + FuzzyMatchRangeList display_name__matches = items.v[idx].match_ranges; + + // rjf: push item + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = display_name, + .kind_name = str8_lit("Thread Local"), + .display_name = display_name, + .display_name__matches = display_name__matches, + .group = 1); + } + } + + //- rjf: gather procedures + if(flags & RD_ListerFlag_Procedures && needle.size != 0) + { + U128 search_key = {d_hash_from_string(str8_lit("autocomp_procedures_search_key")), d_hash_from_string(str8_lit("autocomp_procedures_search_key"))}; + DI_SearchParams search_params = + { + RDI_SectionKind_Procedures, + dbgi_keys, + }; + B32 is_stale = 0; + DI_SearchItemArray items = di_search_items_from_key_params_query(di_scope, search_key, &search_params, needle, 0, &is_stale); + for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) + { + // rjf: skip bad elements + if(items.v[idx].dbgi_idx >= rdis_count) + { + continue; + } + + // rjf: unpack info + RDI_Parsed *rdi = rdis[items.v[idx].dbgi_idx]; + String8 display_name = di_search_item_string_from_rdi_target_element_idx(rdi, search_params.target, items.v[idx].idx); + FuzzyMatchRangeList display_name__matches = items.v[idx].match_ranges; + + // rjf: push item + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = display_name, + .kind_name = str8_lit("Procedure"), + .display_name = display_name, + .display_name__matches = display_name__matches, + .group = 1); + } + } + + //- rjf: gather types + if(flags & RD_ListerFlag_Types && needle.size != 0) + { + U128 search_key = {d_hash_from_string(str8_lit("autocomp_types_search_key")), d_hash_from_string(str8_lit("autocomp_types_search_key"))}; + DI_SearchParams search_params = + { + RDI_SectionKind_UDTs, + dbgi_keys, + }; + B32 is_stale = 0; + DI_SearchItemArray items = di_search_items_from_key_params_query(di_scope, search_key, &search_params, needle, 0, &is_stale); + for(U64 idx = 0; idx < 20 && idx < items.count; idx += 1) + { + // rjf: skip bad elements + if(items.v[idx].dbgi_idx >= rdis_count) + { + continue; + } + + // rjf: unpack info + RDI_Parsed *rdi = rdis[items.v[idx].dbgi_idx]; + String8 display_name = di_search_item_string_from_rdi_target_element_idx(rdi, search_params.target, items.v[idx].idx); + FuzzyMatchRangeList display_name__matches = items.v[idx].match_ranges; + + // rjf: push item + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = display_name, + .kind_name = str8_lit("Type"), + .display_name = display_name, + .display_name__matches = display_name__matches, + .group = 1); + } + } + + //- rjf: gather languages + if(flags & RD_ListerFlag_Languages) + { + for EachNonZeroEnumVal(TXT_LangKind, lang) + { + String8 display_name = txt_extension_from_lang_kind(lang); + if(display_name.size != 0) + { + FuzzyMatchRangeList display_name__matches = fuzzy_match_find(arena, needle, display_name); + if(display_name__matches.count == display_name__matches.needle_part_count) + { + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = display_name, + .kind_name = str8_lit("Language"), + .display_name = display_name, + .display_name__matches = display_name__matches); + } + } + } + } + + //- rjf: gather architectures + if(flags & RD_ListerFlag_Architectures) + { + for EachNonZeroEnumVal(Arch, arch) + { + String8 display_name = string_from_arch(arch); + FuzzyMatchRangeList display_name__matches = fuzzy_match_find(arena, needle, display_name); + if(display_name__matches.count == display_name__matches.needle_part_count) + { + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = display_name, + .kind_name = str8_lit("Architecture"), + .display_name = display_name, + .display_name__matches = display_name__matches); + } + } + } + + //- rjf: gather tex2dformats + if(flags & RD_ListerFlag_Tex2DFormats) + { + for EachEnumVal(R_Tex2DFormat, fmt) + { + String8 display_name = lower_from_str8(scratch.arena, r_tex2d_format_display_string_table[fmt]); + FuzzyMatchRangeList display_name__matches = fuzzy_match_find(arena, needle, display_name); + if(display_name__matches.count == display_name__matches.needle_part_count) + { + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = display_name, + .kind_name = str8_lit("2D Texture Format"), + .display_name = display_name, + .display_name__matches = display_name__matches); + } + } + } + + //- rjf: gather view rule params +#if 0 // TODO(rjf): @cfg + if(flags & RD_ListerFlag_ViewRuleParams) + { + for(String8Node *n = strings.first; n != 0; n = n->next) + { + String8 display_name = n->string; + FuzzyMatchRangeList display_name__matches = fuzzy_match_find(arena, needle, display_name); + if(display_name__matches.count == display_name__matches.needle_part_count) + { + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = display_name, + .kind_name = str8_lit("View Rule Parameter"), + .display_name = display_name, + .display_name__matches = display_name__matches); + } + } + } +#endif + + //- rjf: gather files + if(flags & RD_ListerFlag_Files) + { + // rjf: find containing directory in needle_path + String8 dir_str_in_input = {0}; + for(U64 i = 0; i < needle_path.size; i += 1) + { + String8 substr1 = str8_substr(needle_path, r1u64(i, i+1)); + String8 substr2 = str8_substr(needle_path, r1u64(i, i+2)); + String8 substr3 = str8_substr(needle_path, r1u64(i, i+3)); + if(str8_match(substr1, str8_lit("/"), StringMatchFlag_SlashInsensitive)) + { + dir_str_in_input = str8_substr(needle_path, r1u64(i, needle_path.size)); + } + else if(i != 0 && str8_match(substr2, str8_lit(":/"), StringMatchFlag_SlashInsensitive)) + { + dir_str_in_input = str8_substr(needle_path, r1u64(i-1, needle_path.size)); + } + else if(str8_match(substr2, str8_lit("./"), StringMatchFlag_SlashInsensitive)) + { + dir_str_in_input = str8_substr(needle_path, r1u64(i, needle_path.size)); + } + else if(str8_match(substr3, str8_lit("../"), StringMatchFlag_SlashInsensitive)) + { + dir_str_in_input = str8_substr(needle_path, r1u64(i, needle_path.size)); + } + if(dir_str_in_input.size != 0) + { + break; + } + } + + // rjf: use needle_path string to form various parts of search space + String8 prefix = {0}; + String8 path = {0}; + String8 search = {0}; + if(dir_str_in_input.size != 0) + { + String8 dir = dir_str_in_input; + U64 one_past_last_slash = dir.size; + for(U64 i = 0; i < dir_str_in_input.size; i += 1) + { + if(dir_str_in_input.str[i] == '/' || dir_str_in_input.str[i] == '\\') + { + one_past_last_slash = i+1; + } + } + dir.size = one_past_last_slash; + path = dir; + search = str8_substr(dir_str_in_input, r1u64(one_past_last_slash, dir_str_in_input.size)); + prefix = str8_substr(needle_path, r1u64(0, path.str - needle_path.str)); + } + + // rjf: get current files, filtered + B32 allow_dirs = 1; + OS_FileIter *it = os_file_iter_begin(scratch.arena, path, 0); + for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, it, &info);) + { + FuzzyMatchRangeList match_ranges = fuzzy_match_find(arena, search, info.name); + B32 fits_search = (match_ranges.count == match_ranges.needle_part_count); + B32 fits_dir_only = (allow_dirs || !(info.props.flags & FilePropertyFlag_IsFolder)); + if(fits_search && fits_dir_only) + { + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .string = info.name, + .kind_name = info.props.flags & FilePropertyFlag_IsFolder ? str8_lit("Folder") : str8_lit("File"), + .display_name = info.name, + .icon_kind = info.props.flags & FilePropertyFlag_IsFolder ? RD_IconKind_FolderClosedFilled : RD_IconKind_FileOutline, + .display_name__matches = match_ranges, + .is_non_code = 1); + } + } + os_file_iter_end(it); + } + + //- rjf: gather commands + if(flags & RD_ListerFlag_Commands) + { + for EachNonZeroEnumVal(RD_CmdKind, k) + { + RD_CmdKindInfo *info = &rd_cmd_kind_info_table[k]; + if(info->query.slot == regs->reg_slot || regs->reg_slot == RD_RegSlot_Null) + { + String8 cmd_display_name = info->display_name; + String8 cmd_desc = info->description; + String8 cmd_tags = info->search_tags; + FuzzyMatchRangeList name_matches = fuzzy_match_find(arena, needle, cmd_display_name); + FuzzyMatchRangeList desc_matches = fuzzy_match_find(arena, needle, cmd_desc); + FuzzyMatchRangeList tags_matches = fuzzy_match_find(arena, needle, cmd_tags); + if(name_matches.count == name_matches.needle_part_count || + desc_matches.count == name_matches.needle_part_count || + tags_matches.count > 0 || + name_matches.needle_part_count == 0) + { + rd_lister_item_chunk_list_push_new(scratch.arena, &item_list, 256, + .icon_kind = info->icon_kind, + .string = info->string, + .kind_name = str8_lit("Command"), + .display_name = cmd_display_name, + .display_name__matches = name_matches, + .description = cmd_desc, + .description__matches = desc_matches, + .is_non_code = 1, + .can_have_bindings = 1); + } + } + } + } + + //- rjf: lister item list -> sorted array + RD_ListerItemArray item_array = rd_lister_item_array_from_chunk_list(arena, &item_list); + rd_lister_item_array_sort__in_place(&item_array); + + di_scope_close(di_scope); + scratch_end(scratch); + return item_array; +} + internal String8 rd_lister_query_word_from_input_string_off(String8 input, U64 cursor_off) { @@ -9955,6 +9981,8 @@ rd_lister_query_path_from_input_string_off(String8 input, U64 cursor_off) return path; } +#if 0 // TODO(rjf): @cfg + internal RD_ListerParams rd_view_rule_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off) { @@ -10114,6 +10142,31 @@ rd_set_autocomp_lister_query_(RD_ListerParams *params) ws->lister_last_frame_idx = rd_state->frame_index; } +#endif + +internal void +rd_set_autocomp_lister_query_(RD_Regs *regs) +{ + RD_Cfg *window_cfg = rd_cfg_from_handle(regs->window); + RD_WindowState *ws = rd_window_state_from_cfg(window_cfg); + if(ws->autocomp_lister == 0) + { + Arena *arena = arena_alloc(); + ws->autocomp_lister = push_array(arena, RD_Lister, 1); + ws->autocomp_lister->arena = arena; + } + Arena *arena = ws->autocomp_lister->arena; + arena_clear(arena); + ws->autocomp_lister = push_array(arena, RD_Lister, 1); + ws->autocomp_lister->arena = arena; + ws->autocomp_lister->regs = rd_regs_copy(arena, regs); + ws->autocomp_lister->input_string_size = Min(regs->string.size, sizeof(ws->autocomp_lister->input_buffer)); + MemoryCopy(ws->autocomp_lister->input_buffer, regs->string.str, ws->autocomp_lister->input_string_size); + ws->autocomp_lister->input_cursor = regs->cursor; + ws->autocomp_lister->input_mark = regs->mark; + ws->autocomp_lister_last_frame_idx = rd_state->frame_index; +} + //////////////////////////////// //~ rjf: Search Strings @@ -10595,7 +10648,7 @@ rd_cfg_strings_from_gfx(Arena *arena, String8 root_path, RD_CfgSrc source) if(source == RD_CfgSrc_User) { B32 first = 1; - for(RD_WindowState *window = rd_state->first_window_state; window != 0; window = window->order_next) + for(RD_WindowState *window = rd_state->first_window_state; window != &rd_nil_window_state; window = window->order_next) { if(first) { @@ -11684,11 +11737,17 @@ rd_frame(void) ui_state_release(ws->ui); r_window_unequip(ws->os, ws->r); os_window_close(ws->os); - arena_release(ws->query_cmd_arena); + if(ws->autocomp_lister != 0) + { + arena_release(ws->autocomp_lister->arena); + } + for(RD_Lister *lister = ws->top_query_lister; lister != 0; lister = lister->next) + { + arena_release(lister->arena); + } arena_release(ws->ctx_menu_arena); arena_release(ws->drop_completion_arena); arena_release(ws->hover_eval_arena); - arena_release(ws->lister_arena); arena_release(ws->arena); DLLRemove_NPZ(&rd_nil_window_state, rd_state->first_window_state, rd_state->last_window_state, ws, order_next, order_prev); DLLRemove_NP(rd_state->window_state_slots[slot_idx].first, rd_state->window_state_slots[slot_idx].last, ws, hash_next, hash_prev); @@ -11722,6 +11781,48 @@ rd_frame(void) } } + ////////////////////////////// + //- rjf: animate all views + // + if(depth == 0) + { + F32 slow_rate = 1 - pow_f32(2, (-10.f * rd_state->frame_dt)); + F32 fast_rate = 1 - pow_f32(2, (-40.f * rd_state->frame_dt)); + for EachIndex(slot_idx, rd_state->view_state_slots_count) + { + for(RD_ViewState *vs = rd_state->view_state_slots[slot_idx].first; + vs != 0; + vs = vs->hash_next) + { + F32 scroll_x_diff = (-vs->scroll_pos.x.off); + F32 scroll_y_diff = (-vs->scroll_pos.y.off); + F32 loading_t_diff = (vs->loading_t_target - vs->loading_t); + vs->scroll_pos.x.off += scroll_x_diff*fast_rate; + vs->scroll_pos.y.off += scroll_y_diff*fast_rate; + vs->loading_t += loading_t_diff * slow_rate; + if(abs_f32(loading_t_diff) > 0.01f || + abs_f32(scroll_x_diff) > 0.01f || + abs_f32(scroll_y_diff) > 0.01f) + { + rd_request_frame(); + } + if(abs_f32(scroll_x_diff) <= 0.01f) + { + vs->scroll_pos.x.off = 0; + } + if(abs_f32(scroll_y_diff) <= 0.01f) + { + vs->scroll_pos.y.off = 0; + } + RD_Cfg *vcfg = rd_cfg_from_handle(vs->cfg_handle); + if(rd_cfg_child_from_string(vcfg, str8_lit("selected")) != &rd_nil_cfg) + { + vs->loading_t_target = 0; + } + } + } + } + ////////////////////////////// //- rjf: build key map from config // @@ -12471,6 +12572,12 @@ rd_frame(void) } }break; + //- rjf: top-level lister + case RD_CmdKind_OpenLister: + { + rd_cmd(RD_CmdKind_PushQuery, .lister_flags = 0xffffffff); + }break; + //- rjf: command fast path case RD_CmdKind_RunCommand: { @@ -12485,15 +12592,7 @@ rd_frame(void) // rjf: command has required query -> prep query else { - RD_Cfg *wcfg = rd_cfg_from_handle(rd_regs()->window); - RD_WindowState *ws = rd_window_state_from_cfg(wcfg); - if(ws != 0) - { - arena_clear(ws->query_cmd_arena); - ws->query_cmd_name = push_str8_copy(ws->query_cmd_arena, cmd->regs->cmd_name); - ws->query_cmd_regs = rd_regs_copy(ws->query_cmd_arena, rd_regs()); - MemoryZeroArray(ws->query_cmd_regs_mask); - } + rd_cmd(RD_CmdKind_PushQuery, .lister_flags = rd_regs()->lister_flags|RD_ListerFlag_LineEdit|RD_ListerFlag_Commands|RD_ListerFlag_Descriptions); } }break; @@ -14984,7 +15083,7 @@ X(getting_started) //- rjf: thread finding case RD_CmdKind_FindThread: - for(RD_WindowState *ws = rd_state->first_window_state; ws != 0; ws = ws->order_next) + for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next) { DI_Scope *scope = di_scope_open(); CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); @@ -15056,7 +15155,7 @@ X(getting_started) di_scope_close(scope); }break; case RD_CmdKind_FindSelectedThread: - for(RD_WindowState *ws = rd_state->first_window_state; ws != 0; ws = ws->order_next) + for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next) { CTRL_Entity *selected_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_base_regs()->thread); rd_cmd(RD_CmdKind_FindThread, @@ -15260,7 +15359,7 @@ X(getting_started) } // rjf: first, try to find panel/view pair that already has the src file open - RD_Cfg *panel_w_this_src_code = &rd_nil_cfg; + RD_PanelNode *panel_w_this_src_code = &rd_nil_panel_node; RD_Cfg *view_w_this_src_code = &rd_nil_cfg; for(RD_PanelNode *panel = panel_tree.root; panel != &rd_nil_panel_node; @@ -15274,42 +15373,46 @@ X(getting_started) { RD_Cfg *tab = tab_n->v; if(rd_cfg_is_project_filtered(tab)) { continue; } -#if 0 // TODO(rjf): @cfg - String8 view_file_path = rd_file_path_from_eval_string(scratch.arena, str8(view->query_buffer, view->query_string_size)); - RD_ViewRuleKind view_kind = rd_view_rule_kind_from_string(view->spec->string); - if((view_kind == RD_ViewRuleKind_Text || view_kind == RD_ViewRuleKind_PendingFile) && - path_match_normalized(view_file_path, file_path)) + RD_RegsScope(.view = rd_handle_from_cfg(tab)) { - panel_w_this_src_code = panel; - view_w_this_src_code = view; - if(view == rd_selected_tab_from_panel(panel)) + String8 tab_expr = rd_view_expr_string(); + String8 tab_file_path = rd_file_path_from_eval_string(scratch.arena, tab_expr); + RD_ViewRuleKind tab_view_kind = rd_view_rule_kind_from_string(tab->string); + if((tab_view_kind == RD_ViewRuleKind_Text || tab_view_kind == RD_ViewRuleKind_PendingFile) && + path_match_normalized(tab_file_path, file_path)) { - break; + panel_w_this_src_code = panel; + view_w_this_src_code = tab; + if(tab == panel->selected_tab) + { + break; + } } } -#endif } } // rjf: find a panel that already has *any* code open (prioritize largest) RD_PanelNode *panel_w_any_src_code = &rd_nil_panel_node; -#if 0 // TODO(rjf): @cfg { - Rng2F32 root_rect = os_client_rect_from_window(ws->os); + Rng2F32 root_rect = r2f32(v2f32(0, 0), v2f32(1000, 1000)); F32 best_panel_area = 0; - for(RD_PanelNode *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + for(RD_PanelNode *panel = panel_tree.root; + panel != &rd_nil_panel_node; + panel = rd_panel_node_rec__depth_first_pre(panel_tree.root, panel).next) { - if(!rd_panel_is_nil(panel->first)) + if(panel->first != &rd_nil_panel_node) { continue; } - Rng2F32 panel_rect = rd_target_rect_from_panel(root_rect, ws->root_panel, panel); + Rng2F32 panel_rect = rd_target_rect_from_panel_node(root_rect, panel_tree.root, panel); Vec2F32 panel_rect_dim = dim_2f32(panel_rect); F32 panel_area = panel_rect_dim.x*panel_rect_dim.y; - for(RD_View *view = panel->first_tab_view; !rd_view_is_nil(view); view = view->order_next) + for(RD_CfgNode *tab_n = panel->tabs.first; tab_n != 0; tab_n = tab_n->next) { - if(rd_view_is_project_filtered(view)) { continue; } - RD_ViewRuleKind view_kind = rd_view_rule_kind_from_string(view->spec->string); + RD_Cfg *tab = tab_n->v; + if(rd_cfg_is_project_filtered(tab)) { continue; } + RD_ViewRuleKind view_kind = rd_view_rule_kind_from_string(tab->string); if(view_kind == RD_ViewRuleKind_Text && panel_area > best_panel_area) { panel_w_any_src_code = panel; @@ -15319,227 +15422,208 @@ X(getting_started) } } } -#endif // rjf: try to find panel/view pair that has disassembly open (prioritize largest) -#if 0 // TODO(rjf): @cfg - RD_Panel *panel_w_disasm = &rd_nil_panel; - RD_View *view_w_disasm = &rd_nil_view; + RD_PanelNode *panel_w_disasm = &rd_nil_panel_node; + RD_Cfg *view_w_disasm = &rd_nil_cfg; { - Rng2F32 root_rect = os_client_rect_from_window(ws->os); + Rng2F32 root_rect = r2f32(v2f32(0, 0), v2f32(1000, 1000)); F32 best_panel_area = 0; - for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + for(RD_PanelNode *panel = panel_tree.root; + panel != &rd_nil_panel_node; + panel = rd_panel_node_rec__depth_first_pre(panel_tree.root, panel).next) { - if(!rd_panel_is_nil(panel->first)) + if(panel->first != &rd_nil_panel_node) { continue; } - Rng2F32 panel_rect = rd_target_rect_from_panel(root_rect, ws->root_panel, panel); + Rng2F32 panel_rect = rd_target_rect_from_panel_node(root_rect, panel_tree.root, panel); Vec2F32 panel_rect_dim = dim_2f32(panel_rect); F32 panel_area = panel_rect_dim.x*panel_rect_dim.y; - RD_View *panel_selected_tab = rd_selected_tab_from_panel(panel); - for(RD_View *view = panel->first_tab_view; !rd_view_is_nil(view); view = view->order_next) + for(RD_CfgNode *tab_n = panel->tabs.first; tab_n != 0; tab_n = tab_n->next) { - if(rd_view_is_project_filtered(view)) { continue; } - RD_ViewRuleKind view_kind = rd_view_rule_kind_from_string(view->spec->string); - B32 view_is_selected = (view == panel_selected_tab); - if(view_kind == RD_ViewRuleKind_Disasm && view->query_string_size == 0 && panel_area > best_panel_area) + RD_Cfg *tab = tab_n->v; + if(rd_cfg_is_project_filtered(tab)) { continue; } + RD_RegsScope(.view = rd_handle_from_cfg(tab)) { - panel_w_disasm = panel; - view_w_disasm = view; - best_panel_area = panel_area; - if(view_is_selected) + B32 tab_is_selected = (tab == panel->selected_tab); + RD_ViewRuleKind view_kind = rd_view_rule_kind_from_string(tab->string); + String8 expr_string = rd_view_expr_string(); + if(view_kind == RD_ViewRuleKind_Disasm && expr_string.size == 0 && panel_area > best_panel_area) { - break; + panel_w_disasm = panel; + view_w_disasm = tab; + best_panel_area = panel_area; + if(tab_is_selected) + { + break; + } } } } } } -#endif // rjf: find the biggest panel -#if 0 // TODO(rjf): @cfg - RD_Panel *biggest_panel = &rd_nil_panel; + RD_PanelNode *biggest_panel = &rd_nil_panel_node; { - Rng2F32 root_rect = os_client_rect_from_window(ws->os); + Rng2F32 root_rect = r2f32(v2f32(0, 0), v2f32(1000, 1000)); F32 best_panel_area = 0; - for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + for(RD_PanelNode *panel = panel_tree.root; + panel != &rd_nil_panel_node; + panel = rd_panel_node_rec__depth_first_pre(panel_tree.root, panel).next) { - if(!rd_panel_is_nil(panel->first)) + if(panel->first != &rd_nil_panel_node) { continue; } - Rng2F32 panel_rect = rd_target_rect_from_panel(root_rect, ws->root_panel, panel); + Rng2F32 panel_rect = rd_target_rect_from_panel_node(root_rect, panel_tree.root, panel); Vec2F32 panel_rect_dim = dim_2f32(panel_rect); - F32 area = panel_rect_dim.x * panel_rect_dim.y; - if((best_panel_area == 0 || area > best_panel_area)) + F32 panel_area = panel_rect_dim.x*panel_rect_dim.y; + if((best_panel_area == 0 || panel_area > best_panel_area)) { - best_panel_area = area; + best_panel_area = panel_area; biggest_panel = panel; } } } -#endif // rjf: find the biggest empty panel -#if 0 // TODO(rjf): @cfg - RD_Panel *biggest_empty_panel = &rd_nil_panel; + RD_PanelNode *biggest_empty_panel = &rd_nil_panel_node; { - Rng2F32 root_rect = os_client_rect_from_window(ws->os); + Rng2F32 root_rect = r2f32(v2f32(0, 0), v2f32(1000, 1000)); F32 best_panel_area = 0; - for(RD_Panel *panel = ws->root_panel; !rd_panel_is_nil(panel); panel = rd_panel_rec_depth_first_pre(panel).next) + for(RD_PanelNode *panel = panel_tree.root; + panel != &rd_nil_panel_node; + panel = rd_panel_node_rec__depth_first_pre(panel_tree.root, panel).next) { - if(!rd_panel_is_nil(panel->first)) + if(panel->first != &rd_nil_panel_node) { continue; } - Rng2F32 panel_rect = rd_target_rect_from_panel(root_rect, ws->root_panel, panel); + Rng2F32 panel_rect = rd_target_rect_from_panel_node(root_rect, panel_tree.root, panel); Vec2F32 panel_rect_dim = dim_2f32(panel_rect); - F32 area = panel_rect_dim.x * panel_rect_dim.y; + F32 panel_area = panel_rect_dim.x*panel_rect_dim.y; B32 panel_is_empty = 1; - for(RD_View *v = panel->first_tab_view; !rd_view_is_nil(v); v = v->order_next) + for(RD_CfgNode *n = panel->tabs.first; n != 0; n = n->next) { - if(!rd_view_is_project_filtered(v)) + RD_Cfg *tab = n->v; + if(!rd_cfg_is_project_filtered(tab)) { panel_is_empty = 0; break; } } - if(panel_is_empty && (best_panel_area == 0 || area > best_panel_area)) + if(panel_is_empty && (best_panel_area == 0 || panel_area > best_panel_area)) { - best_panel_area = area; + best_panel_area = panel_area; biggest_empty_panel = panel; } } } -#endif // rjf: choose panel for source code -#if 0 // TODO(rjf): @cfg - RD_Panel *src_code_dst_panel = &rd_nil_panel; + RD_PanelNode *src_code_dst_panel = &rd_nil_panel_node; { - if(rd_panel_is_nil(src_code_dst_panel)) { src_code_dst_panel = panel_w_this_src_code; } - if(rd_panel_is_nil(src_code_dst_panel)) { src_code_dst_panel = panel_w_any_src_code; } - if(rd_panel_is_nil(src_code_dst_panel)) { src_code_dst_panel = biggest_empty_panel; } - if(rd_panel_is_nil(src_code_dst_panel)) { src_code_dst_panel = biggest_panel; } + if(src_code_dst_panel == &rd_nil_panel_node) { src_code_dst_panel = panel_w_this_src_code; } + if(src_code_dst_panel == &rd_nil_panel_node) { src_code_dst_panel = panel_w_any_src_code; } + if(src_code_dst_panel == &rd_nil_panel_node) { src_code_dst_panel = biggest_empty_panel; } + if(src_code_dst_panel == &rd_nil_panel_node) { src_code_dst_panel = biggest_panel; } } -#endif // rjf: choose panel for disassembly -#if 0 // TODO(rjf): @cfg - RD_Panel *disasm_dst_panel = &rd_nil_panel; + RD_PanelNode *disasm_dst_panel = &rd_nil_panel_node; { - if(rd_panel_is_nil(disasm_dst_panel)) { disasm_dst_panel = panel_w_disasm; } - if(rd_panel_is_nil(disasm_dst_panel)) { disasm_dst_panel = biggest_empty_panel; } - if(rd_panel_is_nil(disasm_dst_panel)) { disasm_dst_panel = biggest_panel; } + if(disasm_dst_panel == &rd_nil_panel_node) { disasm_dst_panel = panel_w_disasm; } + if(disasm_dst_panel == &rd_nil_panel_node) { disasm_dst_panel = biggest_empty_panel; } + if(disasm_dst_panel == &rd_nil_panel_node) { disasm_dst_panel = biggest_panel; } } -#endif // rjf: if disasm and source code match: // if disasm preferred, cancel source // if source preferred, cancel disasm -#if 0 // TODO(rjf): @cfg if(disasm_dst_panel == src_code_dst_panel) { if(rd_regs()->prefer_disasm) { - src_code_dst_panel = &rd_nil_panel; + src_code_dst_panel = &rd_nil_panel_node; } else { - disasm_dst_panel = &rd_nil_panel; + disasm_dst_panel = &rd_nil_panel_node; } } -#endif // rjf: if disasm is not preferred, and we have no disassembly view // open at all, cancel disasm, so that it doesn't open if the user // doesn't want it. -#if 0 // TODO(rjf): @cfg - if(!rd_regs()->prefer_disasm && panel_w_disasm == &rd_nil_panel) + if(!rd_regs()->prefer_disasm && panel_w_disasm == &rd_nil_panel_node) { - disasm_dst_panel = &rd_nil_panel; + disasm_dst_panel = &rd_nil_panel_node; } -#endif // rjf: given the above, find source code location. -#if 0 // TODO(rjf): @cfg - if(file_path.size != 0 && src_code_dst_panel != &rd_nil_panel) + if(file_path.size != 0 && src_code_dst_panel != &rd_nil_panel_node) { - RD_Panel *dst_panel = src_code_dst_panel; + RD_PanelNode *dst_panel = src_code_dst_panel; // rjf: construct new view if needed - RD_View *dst_view = view_w_this_src_code; - if(!rd_panel_is_nil(dst_panel) && rd_view_is_nil(view_w_this_src_code)) + RD_Cfg *dst_tab = view_w_this_src_code; + if(dst_panel != &rd_nil_panel_node && dst_tab == &rd_nil_cfg) { - RD_View *view = rd_view_alloc(); - String8 file_path_query = rd_eval_string_from_file_path(scratch.arena, file_path); - rd_view_equip_spec(view, rd_view_rule_info_from_kind(RD_ViewRuleKind_Text), file_path_query, &md_nil_node); - rd_panel_insert_tab_view(dst_panel, dst_panel->last_tab_view, view); - dst_view = view; + dst_tab = rd_cfg_new(dst_panel->cfg, str8_lit("text")); + RD_Cfg *expr = rd_cfg_new(dst_tab, str8_lit("query")); + rd_cfg_new(expr, rd_eval_string_from_file_path(scratch.arena, file_path)); } // rjf: determine if we need a contain or center RD_CmdKind cursor_snap_kind = RD_CmdKind_CenterCursor; - if(!rd_panel_is_nil(dst_panel) && dst_view == view_w_this_src_code && rd_selected_tab_from_panel(dst_panel) == dst_view) + if(dst_panel != &rd_nil_panel_node && dst_tab == view_w_this_src_code && dst_panel->selected_tab == dst_tab) { cursor_snap_kind = RD_CmdKind_ContainCursor; } // rjf: move cursor & snap-to-cursor - if(!rd_panel_is_nil(dst_panel)) + if(dst_panel != &rd_nil_panel_node) RD_RegsScope(.panel = rd_handle_from_cfg(dst_panel->cfg), + .view = rd_handle_from_cfg(dst_tab)) { - dst_panel->selected_tab_view = rd_handle_from_view(dst_view); - rd_cmd(RD_CmdKind_GoToLine, - .panel = rd_handle_from_panel(dst_panel), - .view = rd_handle_from_view(dst_view), - .cursor = point); - rd_cmd(cursor_snap_kind, - .panel = rd_handle_from_panel(dst_panel), - .view = rd_handle_from_view(dst_view)); + rd_cmd(RD_CmdKind_FocusTab); + rd_cmd(RD_CmdKind_GoToLine, .cursor = point); + rd_cmd(cursor_snap_kind); } // rjf: record rd_cmd(RD_CmdKind_RecordFileInProject, .file_path = file_path); } -#endif // rjf: given the above, find disassembly location. -#if 0 // TODO(rjf): @cfg - if(process != &ctrl_entity_nil && vaddr != 0 && disasm_dst_panel != &rd_nil_panel) + if(process != &ctrl_entity_nil && vaddr != 0 && disasm_dst_panel != &rd_nil_panel_node) { - RD_Panel *dst_panel = disasm_dst_panel; + RD_PanelNode *dst_panel = disasm_dst_panel; - // rjf: construct new view if needed - RD_View *dst_view = view_w_disasm; - if(!rd_panel_is_nil(dst_panel) && rd_view_is_nil(view_w_disasm)) + // rjf: construct new tab if needed + RD_Cfg *dst_tab = view_w_disasm; + if(dst_panel != &rd_nil_panel_node && view_w_disasm == &rd_nil_cfg) { - RD_View *view = rd_view_alloc(); - rd_view_equip_spec(view, rd_view_rule_info_from_kind(RD_ViewRuleKind_Disasm), str8_zero(), &md_nil_node); - rd_panel_insert_tab_view(dst_panel, dst_panel->last_tab_view, view); - dst_view = view; + dst_tab = rd_cfg_new(dst_panel->cfg, str8_lit("disasm")); } // rjf: determine if we need a contain or center RD_CmdKind cursor_snap_kind = RD_CmdKind_CenterCursor; - if(dst_view == view_w_disasm && rd_selected_tab_from_panel(dst_panel) == dst_view) + if(dst_tab == view_w_disasm && dst_panel->selected_tab == dst_tab) { cursor_snap_kind = RD_CmdKind_ContainCursor; } // rjf: move cursor & snap-to-cursor - if(!rd_panel_is_nil(dst_panel)) + if(dst_panel != &rd_nil_panel_node) RD_RegsScope(.panel = rd_handle_from_cfg(dst_panel->cfg), + .view = rd_handle_from_cfg(dst_tab)) { - dst_panel->selected_tab_view = rd_handle_from_view(dst_view); - rd_cmd(RD_CmdKind_GoToAddress, - .process = process->handle, .vaddr = vaddr, - .panel = rd_handle_from_panel(dst_panel), - .view = rd_handle_from_view(dst_view)); + rd_cmd(RD_CmdKind_FocusTab); + rd_cmd(RD_CmdKind_GoToAddress, .process = process->handle, .vaddr = vaddr); rd_cmd(cursor_snap_kind); } } -#endif }break; //- rjf: filtering @@ -15589,21 +15673,24 @@ X(getting_started) #endif }break; - //- rjf: lister stack - case RD_CmdKind_PushLister: + //- rjf: query stack + case RD_CmdKind_PushQuery: { RD_Cfg *wcfg = rd_cfg_from_handle(rd_regs()->window); - RD_WindowState *ws = rd_window_state_from_cfg(cfg); + RD_WindowState *ws = rd_window_state_from_cfg(wcfg); if(ws != &rd_nil_window_state) { Arena *arena = arena_alloc(); RD_Lister *lister = push_array(arena, RD_Lister, 1); - SLLStackPush(ws->top_lister.next, lister); lister->arena = arena; lister->regs = rd_regs_copy(lister->arena, rd_regs()); + lister->input_string_size = Min(rd_regs()->string.size, sizeof(lister->input_buffer)); + lister->input_cursor = lister->input_mark = txt_pt(1, lister->input_string_size+1); + MemoryCopy(lister->input_buffer, rd_regs()->string.str, lister->input_string_size); + SLLStackPush(ws->top_query_lister, lister); } }break; - case RD_CmdKind_CompleteLister: + case RD_CmdKind_CompleteQuery: { #if 0 // TODO(rjf): @cfg RD_Window *ws = rd_window_from_handle(rd_regs()->window); @@ -15649,13 +15736,16 @@ X(getting_started) } #endif }break; - case RD_CmdKind_CancelLister: + case RD_CmdKind_CancelQuery: { RD_Cfg *window = rd_cfg_from_handle(rd_regs()->window); RD_WindowState *ws = rd_window_state_from_cfg(window); - arena_clear(ws->query_cmd_arena); - MemoryZeroStruct(&ws->query_cmd_name); - ws->query_cmd_regs = 0; + RD_Lister *top_lister = ws->top_query_lister; + if(top_lister != 0) + { + SLLStackPop(ws->top_query_lister); + arena_release(top_lister->arena); + } }break; //- rjf: developer commands diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 97f65a5f..5670d3c3 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -142,7 +142,7 @@ enum RD_ViewRuleInfoFlag_ProjectFiltered = (1<<7), }; -#define RD_VIEW_RULE_UI_FUNCTION_SIG(name) void name(String8 string, Rng2F32 rect) +#define RD_VIEW_RULE_UI_FUNCTION_SIG(name) void name(String8 string, MD_Node *params, Rng2F32 rect) #define RD_VIEW_RULE_UI_FUNCTION_NAME(name) rd_view_rule_ui_##name #define RD_VIEW_RULE_UI_FUNCTION_DEF(name) internal RD_VIEW_RULE_UI_FUNCTION_SIG(RD_VIEW_RULE_UI_FUNCTION_NAME(name)) typedef RD_VIEW_RULE_UI_FUNCTION_SIG(RD_ViewRuleUIFunctionType); @@ -169,6 +169,7 @@ struct RD_ViewState U64 last_frame_index_touched; // rjf: loading indicator info + F32 loading_t; F32 loading_t_target; U64 loading_progress_v; U64 loading_progress_v_target; @@ -230,6 +231,35 @@ enum RD_CmdKindFlag_ListInIPCDocs = (1<<1), }; +//////////////////////////////// +//~ rjf: Lister Flags + +typedef U32 RD_ListerFlags; +enum +{ + //- rjf: lister visual settings + RD_ListerFlag_LineEdit = (1<<0), // determines whether or not the lister has its own line edit, or if the filtering string is sourced by a user + RD_ListerFlag_Descriptions = (1<<1), // determines whether or not the lister items have descriptions (taller & bigger buttons) + + //- rjf: lister item sources + RD_ListerFlag_Locals = (1<<2), + RD_ListerFlag_Registers = (1<<3), + RD_ListerFlag_ViewRules = (1<<4), + RD_ListerFlag_ViewRuleParams = (1<<5), + RD_ListerFlag_Members = (1<<6), + RD_ListerFlag_Globals = (1<<7), + RD_ListerFlag_ThreadLocals = (1<<8), + RD_ListerFlag_Procedures = (1<<9), + RD_ListerFlag_Types = (1<<10), + RD_ListerFlag_Languages = (1<<11), + RD_ListerFlag_Architectures = (1<<12), + RD_ListerFlag_Tex2DFormats = (1<<13), + RD_ListerFlag_Files = (1<<14), + RD_ListerFlag_Commands = (1<<15), + RD_ListerFlag_Settings = (1<<16), + RD_ListerFlag_SystemProcesses= (1<<17), +}; + //////////////////////////////// //~ rjf: Generated Code @@ -538,32 +568,6 @@ RD_PaletteCode; //////////////////////////////// //~ rjf: Lister Types -typedef U32 RD_ListerFlags; -enum -{ - //- rjf: lister visual settings - RD_ListerFlag_LineEdit = (1<<0), // determines whether or not the lister has its own line edit, or if the filtering string is sourced by a user - RD_ListerFlag_Descriptions = (1<<1), // determines whether or not the lister items have descriptions (taller & bigger buttons) - - //- rjf: lister item sources - RD_ListerFlag_Locals = (1<<2), - RD_ListerFlag_Registers = (1<<3), - RD_ListerFlag_ViewRules = (1<<4), - RD_ListerFlag_ViewRuleParams = (1<<5), - RD_ListerFlag_Members = (1<<6), - RD_ListerFlag_Globals = (1<<7), - RD_ListerFlag_ThreadLocals = (1<<8), - RD_ListerFlag_Procedures = (1<<9), - RD_ListerFlag_Types = (1<<10), - RD_ListerFlag_Languages = (1<<11), - RD_ListerFlag_Architectures = (1<<12), - RD_ListerFlag_Tex2DFormats = (1<<13), - RD_ListerFlag_Files = (1<<14), - RD_ListerFlag_Commands = (1<<15), - RD_ListerFlag_Settings = (1<<16), - RD_ListerFlag_SystemProcesses= (1<<17), -}; - typedef struct RD_ListerItem RD_ListerItem; struct RD_ListerItem { @@ -606,26 +610,12 @@ struct RD_ListerItemArray U64 count; }; -typedef struct RD_ListerParams RD_ListerParams; -struct RD_ListerParams -{ - UI_Key anchor_key; - Vec2F32 anchor_off; - RD_ListerFlags flags; - String8List strings; - String8 input; - U64 cursor_off; - F32 squish; - F32 transparency; -}; - typedef struct RD_Lister RD_Lister; struct RD_Lister { RD_Lister *next; Arena *arena; RD_Regs *regs; - RD_ListerParams params; UI_ScrollPt scroll_pt; U8 input_buffer[1024]; U64 input_string_size; @@ -669,8 +659,9 @@ struct RD_WindowState B32 menu_bar_key_held; B32 menu_bar_focus_press_started; - // rjf: lister stack state - RD_Lister top_lister; // points to chain of stateful listers + // rjf: lister state + RD_Lister *top_query_lister; + RD_Lister *autocomp_lister; U64 autocomp_lister_last_frame_idx; // rjf: context menu state @@ -687,22 +678,13 @@ struct RD_WindowState Arena *drop_completion_arena; String8List drop_completion_paths; - // rjf: lister state - U64 lister_last_frame_idx; - Arena *lister_arena; - RD_Regs *lister_regs; - RD_ListerParams lister_params; - UI_ScrollPt lister_scroll_pt; - U8 lister_input_buffer[1024]; - U64 lister_input_size; - TxtPt lister_input_cursor; - TxtPt lister_input_mark; - // rjf: query view stack +#if 0 Arena *query_cmd_arena; String8 query_cmd_name; RD_Regs *query_cmd_regs; U64 query_cmd_regs_mask[(RD_RegSlot_COUNT + 63) / 64]; +#endif // rjf: hover eval state B32 hover_eval_focused; @@ -1324,19 +1306,24 @@ internal String8 rd_value_string_from_eval(Arena *arena, EV_StringFlags flags, U internal void rd_set_hover_eval(Vec2F32 pos, String8 file_path, TxtPt pt, U64 vaddr, String8 string); //////////////////////////////// -//~ rjf: Lister +//~ rjf: Lister Functions internal void rd_lister_item_chunk_list_push(Arena *arena, RD_ListerItemChunkList *list, U64 cap, RD_ListerItem *item); #define rd_lister_item_chunk_list_push_new(arena, list, cap, ...) rd_lister_item_chunk_list_push((arena), (list), (cap), &(RD_ListerItem){.string = {0}, __VA_ARGS__}) internal RD_ListerItemArray rd_lister_item_array_from_chunk_list(Arena *arena, RD_ListerItemChunkList *list); internal int rd_lister_item_qsort_compare(RD_ListerItem *a, RD_ListerItem *b); internal void rd_lister_item_array_sort__in_place(RD_ListerItemArray *array); +internal RD_ListerItemArray rd_lister_item_array_from_regs(Arena *arena, RD_Regs *regs); internal String8 rd_lister_query_word_from_input_string_off(String8 input, U64 cursor_off); internal String8 rd_lister_query_path_from_input_string_off(String8 input, U64 cursor_off); +#if 0 // TODO(rjf): @cfg internal RD_ListerParams rd_view_rule_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off); internal void rd_set_autocomp_lister_query_(RD_ListerParams *params); #define rd_set_autocomp_lister_query(...) rd_set_autocomp_lister_query_(&(RD_ListerParams){.flags = 0, __VA_ARGS__}) +#endif +internal void rd_set_autocomp_lister_query_(RD_Regs *regs); +#define rd_set_autocomp_lister_query(...) rd_set_autocomp_lister_query_(&(RD_Regs){rd_regs_lit_init_top __VA_ARGS__}) //////////////////////////////// //~ rjf: Search Strings diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 625d7be6..eaa496e1 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -7,6 +7,7 @@ internal void rd_code_view_init(RD_CodeViewState *cv) { + ProfBeginFunction(); if(cv->initialized == 0) { cv->initialized = 1; @@ -15,6 +16,7 @@ rd_code_view_init(RD_CodeViewState *cv) cv->center_cursor = 1; rd_store_view_loading_info(1, 0, 0); } + ProfEnd(); } internal RD_CodeViewBuildResult @@ -3122,7 +3124,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo UI_Parent(box) { String8 row_expr = e_string_from_expr(scratch.arena, row->expr); - cell_ui_hook(row_expr, r2f32p(x_px, 0, x_px + col->pct*dim_2f32(rect).x, row_height_px)); + cell_ui_hook(row_expr, cell_ui_params, r2f32p(x_px, 0, x_px + col->pct*dim_2f32(rect).x, row_height_px)); } sig = ui_signal_from_box(box); } @@ -3158,20 +3160,11 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo txt_pt_match(cell_edit_state->cursor, cell_edit_state->mark)) { String8 input = str8(cell_edit_state->input_buffer, cell_edit_state->input_size); - RD_ListerParams params = {cell_autocomp_flags}; - if(col->kind == RD_WatchViewColumnKind_ViewRule) - { - params = rd_view_rule_lister_params_from_input_cursor(scratch.arena, input, cell_edit_state->cursor.column-1); - if(params.flags == 0) - { - params.flags = cell_autocomp_flags; - } - } - params.anchor_key = sig.box->key; - params.anchor_off = v2f32(0, dim_2f32(sig.box->rect).y); - params.input = input; - params.cursor_off = cell_edit_state->cursor.column-1; - rd_set_autocomp_lister_query_(¶ms); + rd_set_autocomp_lister_query(.ui_key = sig.box->key, + .off_px = v2f32(0, dim_2f32(sig.box->rect).y), + .string = input, + .cursor = cell_edit_state->cursor, + .lister_flags = cell_autocomp_flags); } } } @@ -3762,7 +3755,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(commands) //- rjf: submit best match when hitting enter w/ no selection if(cv->selected_cmd_hash == 0 && ui_slot_press(UI_EventActionSlot_Accept)) { - rd_cmd(RD_CmdKind_CompleteLister, .cmd_name = (cmd_array.count > 0 ? cmd_array.v[0].cmd_name : str8_zero())); + rd_cmd(RD_CmdKind_CompleteQuery, .cmd_name = (cmd_array.count > 0 ? cmd_array.v[0].cmd_name : str8_zero())); } //- rjf: selected kind -> cursor @@ -3875,7 +3868,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(commands) UI_Signal sig = ui_signal_from_box(box); if(ui_clicked(sig)) { - rd_cmd(RD_CmdKind_CompleteLister, .cmd_name = item->cmd_name); + rd_cmd(RD_CmdKind_CompleteQuery, .cmd_name = item->cmd_name); } } } @@ -4227,7 +4220,7 @@ RD_VIEW_RULE_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) { - rd_cmd(RD_CmdKind_CompleteLister, .file_path = query_normalized_with_opt_slash); + rd_cmd(RD_CmdKind_CompleteQuery, .file_path = query_normalized_with_opt_slash); } // rjf: command argument exactly matches some file: @@ -4243,14 +4236,14 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(file_system) // rjf: is a file -> complete view else { - rd_cmd(RD_CmdKind_CompleteLister, .file_path = query_normalized_with_opt_slash); + rd_cmd(RD_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) { - rd_cmd(RD_CmdKind_CompleteLister, .file_path = path_query.path); + rd_cmd(RD_CmdKind_CompleteQuery, .file_path = path_query.path); } // rjf: command argument does not exactly match any file, but lister results are in: @@ -4266,14 +4259,14 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(file_system) else { String8 file_path = push_str8f(scratch.arena, "%S%S", path_query.path, filename); - rd_cmd(RD_CmdKind_CompleteLister, .file_path = file_path); + rd_cmd(RD_CmdKind_CompleteQuery, .file_path = file_path); } } // rjf: command argument does not match any file, and lister is empty (new file) else { - rd_cmd(RD_CmdKind_CompleteLister, .file_path = query); + rd_cmd(RD_CmdKind_CompleteQuery, .file_path = query); } } @@ -4472,7 +4465,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(file_system) } else { - rd_cmd(RD_CmdKind_CompleteLister, .file_path = new_path); + rd_cmd(RD_CmdKind_CompleteQuery, .file_path = new_path); } } } @@ -4693,7 +4686,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(system_processes) if(sp->selected_pid == 0 && process_info_array.count > 0 && ui_slot_press(UI_EventActionSlot_Accept)) { RD_ProcessInfo *info = &process_info_array.v[0]; - rd_cmd(RD_CmdKind_CompleteLister, .pid = info->info.pid); + rd_cmd(RD_CmdKind_CompleteQuery, .pid = info->info.pid); } //- rjf: selected PID -> cursor @@ -4781,7 +4774,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(system_processes) // rjf: click => activate this specific process if(ui_clicked(sig)) { - rd_cmd(RD_CmdKind_CompleteLister, .pid = info->info.pid); + rd_cmd(RD_CmdKind_CompleteQuery, .pid = info->info.pid); } } } @@ -4932,7 +4925,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(entity_lister) if(rd_entity_is_nil(rd_entity_from_handle(fev->selected_entity_handle)) && ent_arr.count != 0 && ui_slot_press(UI_EventActionSlot_Accept)) { RD_Entity *ent = ent_arr.v[0].entity; - rd_cmd(RD_CmdKind_CompleteLister, .entity = rd_handle_from_entity(ent)); + rd_cmd(RD_CmdKind_CompleteQuery, .entity = rd_handle_from_entity(ent)); } //- rjf: selected entity -> cursor @@ -4997,7 +4990,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(entity_lister) } if(ui_clicked(ui_signal_from_box(box))) { - rd_cmd(RD_CmdKind_CompleteLister, .entity = rd_handle_from_entity(ent)); + rd_cmd(RD_CmdKind_CompleteQuery, .entity = rd_handle_from_entity(ent)); } } } @@ -5148,7 +5141,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(ctrl_entity_lister) case CTRL_EntityKind_Thread: {rd_regs()->thread = ent->handle;}break; case CTRL_EntityKind_Module: {rd_regs()->module = ent->handle;}break; } - rd_cmd(RD_CmdKind_CompleteLister, .ctrl_entity = ent->handle); + rd_cmd(RD_CmdKind_CompleteQuery, .ctrl_entity = ent->handle); } } @@ -5224,7 +5217,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(ctrl_entity_lister) case CTRL_EntityKind_Thread: {rd_regs()->thread = ent->handle;}break; case CTRL_EntityKind_Module: {rd_regs()->module = ent->handle;}break; } - rd_cmd(RD_CmdKind_CompleteLister, .ctrl_entity = ent->handle); + rd_cmd(RD_CmdKind_CompleteQuery, .ctrl_entity = ent->handle); } } } @@ -5301,7 +5294,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(symbol_lister) String8 name = str8(name_base, name_size); if(name.size != 0) { - rd_cmd(RD_CmdKind_CompleteLister, .string = name); + rd_cmd(RD_CmdKind_CompleteQuery, .string = name); } } } @@ -5373,7 +5366,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(symbol_lister) UI_Signal sig = ui_signal_from_box(box); if(ui_clicked(sig)) { - rd_cmd(RD_CmdKind_CompleteLister, .string = name); + rd_cmd(RD_CmdKind_CompleteQuery, .string = name); } if(ui_hovering(sig)) UI_Tooltip { @@ -5840,7 +5833,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(text) ////////////////////////////// //- rjf: process code-file commands // - for(RD_Cmd *cmd = 0; rd_next_cmd(&cmd);) + ProfScope("process code-file commands") for(RD_Cmd *cmd = 0; rd_next_cmd(&cmd);) { // rjf: mismatched window/panel => skip if(!rd_handle_match(rd_regs()->view, cmd->regs->view)) @@ -5874,29 +5867,33 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(text) ////////////////////////////// //- rjf: unpack parameterization info // + ProfBegin("unpack parameterization info"); String8 path = rd_file_path_from_eval_string(rd_frame_arena(), string); rd_regs()->file_path = path; rd_regs()->vaddr = 0; rd_regs()->prefer_disasm = 0; -#if 0 // TODO(rjf): @cfg rd_regs()->cursor.line = rd_value_from_params_key(params, str8_lit("cursor_line")).s64; rd_regs()->cursor.column = rd_value_from_params_key(params, str8_lit("cursor_column")).s64; rd_regs()->mark.line = rd_value_from_params_key(params, str8_lit("mark_line")).s64; rd_regs()->mark.column = rd_value_from_params_key(params, str8_lit("mark_column")).s64; -#endif if(rd_regs()->cursor.line == 0) { rd_regs()->cursor.line = 1; } if(rd_regs()->cursor.column == 0) { rd_regs()->cursor.column = 1; } if(rd_regs()->mark.line == 0) { rd_regs()->mark.line = 1; } if(rd_regs()->mark.column == 0) { rd_regs()->mark.column = 1; } E_Eval eval = e_eval_from_string(scratch.arena, string); - Rng1U64 range = {0}; // TODO(rjf): @cfg rd_range_from_eval_params(eval, params); + Rng1U64 range = rd_range_from_eval_params(eval, params); rd_regs()->text_key = rd_key_from_eval_space_range(eval.space, range, 1); - rd_regs()->lang_kind = TXT_LangKind_Null; // TODO(rjf): @cfg rd_lang_kind_from_eval_params(eval, params); + rd_regs()->lang_kind = rd_lang_kind_from_eval_params(eval, params); + if(rd_regs()->lang_kind == TXT_LangKind_Null && path.size != 0) + { + rd_regs()->lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(path)); + } U128 hash = {0}; TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, rd_regs()->text_key, rd_regs()->lang_kind, &hash); String8 data = hs_data_from_hash(hs_scope, hash); B32 file_is_missing = (path.size != 0 && os_properties_from_file_path(path).modified == 0); B32 key_has_data = !u128_match(hash, u128_zero()) && info.lines_count; + ProfEnd(); ////////////////////////////// //- rjf: build missing file interface