diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index f0cb14d2..a80721cc 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1400,6 +1400,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_Handle process, Rng1U64 range, B3 //- rjf: try to read from cache B32 is_good = 0; + B32 process_node_exists = 0; B32 is_stale = 1; OS_MutexScopeR(process_stripe->rw_mutex) { @@ -1407,6 +1408,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_Handle process, Rng1U64 range, B3 { if(ctrl_handle_match(n->handle, process)) { + process_node_exists = 1; U64 range_slot_idx = range_hash%n->range_hash_slots_count; CTRL_ProcessMemoryRangeHashSlot *range_slot = &n->range_hash_slots[range_slot_idx]; for(CTRL_ProcessMemoryRangeHashNode *range_n = range_slot->first; range_n != 0; range_n = range_n->next) @@ -1425,7 +1427,7 @@ ctrl_stored_hash_from_process_vaddr_range(CTRL_Handle process, Rng1U64 range, B3 } //- rjf: not good -> create process cache node if necessary - if(!is_good) + if(!is_good && !process_node_exists) { OS_MutexScopeW(process_stripe->rw_mutex) { diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index db9b2325..fbda345d 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -4,7 +4,7 @@ //- GENERATED CODE C_LINKAGE_BEGIN -RD_VocabInfo rd_vocab_info_table[294] = +RD_VocabInfo rd_vocab_info_table[296] = { {str8_lit_comp("auto_view_rule"), str8_lit_comp("auto_view_rules"), str8_lit_comp("Auto View Rule"), str8_lit_comp("Auto View Rules"), RD_IconKind_Binoculars}, {str8_lit_comp("file_path_map"), str8_lit_comp("file_path_maps"), str8_lit_comp("File Path Map"), str8_lit_comp("File Path Maps"), RD_IconKind_FileOutline}, @@ -125,10 +125,12 @@ RD_VocabInfo rd_vocab_info_table[294] = {str8_lit_comp("open_lister"), str8_lit_comp(""), str8_lit_comp("Open Lister"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("run_command"), str8_lit_comp(""), str8_lit_comp("Run Command"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp("OS Event"), str8_lit_comp(""), RD_IconKind_Null}, -{str8_lit_comp("select_thread"), str8_lit_comp(""), str8_lit_comp("Select Thread"), str8_lit_comp(""), RD_IconKind_Null}, +{str8_lit_comp("select_thread"), str8_lit_comp(""), str8_lit_comp("Select Thread"), str8_lit_comp(""), RD_IconKind_Thread}, {str8_lit_comp("select_unwind"), str8_lit_comp(""), str8_lit_comp("Select Unwind"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("up_one_frame"), str8_lit_comp(""), str8_lit_comp("Up One Frame"), str8_lit_comp(""), RD_IconKind_UpArrow}, {str8_lit_comp("down_one_frame"), str8_lit_comp(""), str8_lit_comp("Down One Frame"), str8_lit_comp(""), RD_IconKind_DownArrow}, +{str8_lit_comp("select_entity"), str8_lit_comp(""), str8_lit_comp("Select Entity"), str8_lit_comp(""), RD_IconKind_RadioHollow}, +{str8_lit_comp("deselect_entity"), str8_lit_comp(""), str8_lit_comp("Deselect Entity"), str8_lit_comp(""), RD_IconKind_RadioFilled}, {str8_lit_comp("inc_ui_font_scale"), str8_lit_comp(""), str8_lit_comp("Increase UI Font Scale"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("dec_ui_font_scale"), str8_lit_comp(""), str8_lit_comp("Decrease UI Font Scale"), str8_lit_comp(""), RD_IconKind_Null}, {str8_lit_comp("inc_code_font_scale"), str8_lit_comp(""), str8_lit_comp("Increase Code Font Scale"), str8_lit_comp(""), RD_IconKind_Null}, @@ -362,7 +364,7 @@ Rng1U64 rd_reg_slot_range_table[40] = {OffsetOf(RD_Regs, os_event), OffsetOf(RD_Regs, os_event) + sizeof(OS_Event *)}, }; -RD_CmdKindInfo rd_cmd_kind_info_table[212] = +RD_CmdKindInfo rd_cmd_kind_info_table[214] = { {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(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp("query:targets"), str8_lit_comp(""), CTRL_EntityKind_Null}}, @@ -401,10 +403,12 @@ RD_CmdKindInfo rd_cmd_kind_info_table[212] = { str8_lit_comp("open_lister"), str8_lit_comp("Opens the lister."), str8_lit_comp("help,cmd"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:lister"), str8_lit_comp(""), 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(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp("query:commands"), str8_lit_comp("commands"), CTRL_EntityKind_Null}}, { str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (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_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), CTRL_EntityKind_Thread}}, -{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), CTRL_EntityKind_Null}}, +{ str8_lit_comp("select_thread"), str8_lit_comp("Selects a thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp("query:threads"), str8_lit_comp(""), CTRL_EntityKind_Thread}}, +{ str8_lit_comp("select_unwind"), str8_lit_comp("Selects an unwind frame number for the selected thread."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp("query:call_stack"), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("up_one_frame"), str8_lit_comp("Selects the call stack frame above the currently selected."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("down_one_frame"), str8_lit_comp("Selects the call stack frame below the currently selected."), str8_lit_comp("callstack,unwind"), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, +{ str8_lit_comp("select_entity"), str8_lit_comp("Selects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (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_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, +{ str8_lit_comp("deselect_entity"), str8_lit_comp("Deselects a control entity."), str8_lit_comp(""), str8_lit_comp(""), (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_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("inc_ui_font_scale"), str8_lit_comp("Increases the font size used for UI."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("dec_ui_font_scale"), str8_lit_comp("Decreases the font size used for UI."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("inc_code_font_scale"), str8_lit_comp("Increases the font size used for code."), str8_lit_comp(""), str8_lit_comp(""), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, @@ -522,7 +526,7 @@ RD_CmdKindInfo rd_cmd_kind_info_table[212] = { str8_lit_comp("enable_cfg"), str8_lit_comp("Enables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (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_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("disable_cfg"), str8_lit_comp("Disables a config tree."), str8_lit_comp(""), str8_lit_comp(""), (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_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("select_cfg"), str8_lit_comp("Selects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (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_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, -{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree, disabling all others of the same kind."), str8_lit_comp(""), str8_lit_comp(""), (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_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, +{ str8_lit_comp("deselect_cfg"), str8_lit_comp("Deselects a config tree."), str8_lit_comp(""), str8_lit_comp(""), (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_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("remove_cfg"), str8_lit_comp("Removes a config tree."), str8_lit_comp(""), str8_lit_comp(""), (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_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("name_cfg"), str8_lit_comp("Equips a config tree with a label."), str8_lit_comp(""), str8_lit_comp(""), (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_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, { str8_lit_comp("condition_cfg"), str8_lit_comp("Equips a config tree with a condition string."), str8_lit_comp(""), str8_lit_comp(""), (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_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(""), str8_lit_comp(""), CTRL_EntityKind_Null}}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 5f3daa04..3261a8da 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -94,6 +94,8 @@ RD_CmdKind_SelectThread, RD_CmdKind_SelectUnwind, RD_CmdKind_UpOneFrame, RD_CmdKind_DownOneFrame, +RD_CmdKind_SelectEntity, +RD_CmdKind_DeselectEntity, RD_CmdKind_IncUIFontScale, RD_CmdKind_DecUIFontScale, RD_CmdKind_IncCodeFontScale, @@ -630,7 +632,7 @@ RD_Query query; .os_event = rd_regs()->os_event,\ C_LINKAGE_BEGIN -extern RD_VocabInfo rd_vocab_info_table[294]; +extern RD_VocabInfo rd_vocab_info_table[296]; extern RD_NameSchemaInfo rd_name_schema_info_table[12]; extern Rng1U64 rd_reg_slot_range_table[40]; extern String8 rd_binding_version_remap_old_name_table[8]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index e1b57e48..58e3e47c 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -368,10 +368,12 @@ RD_CmdTable: // | | | | {OSEvent 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "os_event" "OS Event" "" "" "" } //- rjf: thread/frame selection - {SelectThread 1 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Null "select_thread" "Select Thread" "Selects a thread." "" "" } - {SelectUnwind 1 1 "query:call_stack" Null null Nil Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } + {SelectThread 0 1 "query:threads" Thread null Nil Thread 0 0 0 0 0 1 1 Thread "select_thread" "Select Thread" "Selects a thread." "" "" } + {SelectUnwind 0 1 "query:call_stack" Null null Nil Null 0 0 0 0 0 0 0 Null "select_unwind" "Select Unwind" "Selects an unwind frame number for the selected thread." "" "" } {UpOneFrame 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 UpArrow "up_one_frame" "Up One Frame" "Selects the call stack frame above the currently selected." "" "" } {DownOneFrame 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 DownArrow "down_one_frame" "Down One Frame" "Selects the call stack frame below the currently selected." "callstack,unwind" "" } + {SelectEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_entity" "Select Entity" "Selects a control entity." "" "" } + {DeselectEntity 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_entity" "Deselect Entity" "Deselects a control entity." "" "" } //- rjf: font sizes {IncUIFontScale 1 1 "" Null null Nil Null 0 0 0 0 0 0 0 Null "inc_ui_font_scale" "Increase UI Font Scale" "Increases the font size used for UI." "" "" } @@ -537,7 +539,7 @@ RD_CmdTable: // | | | | {EnableCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckHollow "enable_cfg" "Enable Config Tree" "Enables a config tree." "" "" } {DisableCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 CheckFilled "disable_cfg" "Disable Config Tree" "Disables a config tree." "" "" } {SelectCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioHollow "select_cfg" "Select Config Tree" "Selects a config tree, disabling all others of the same kind." "" "" } - {DeselectCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect Config Tree" "Deselects a config tree, disabling all others of the same kind." "" "" } + {DeselectCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 RadioFilled "deselect_cfg" "Deselect Config Tree" "Deselects a config tree." "" "" } {RemoveCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Trash "remove_cfg" "Remove Config Tree" "Removes a config tree." "" "" } {NameCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "name_cfg" "Name Config Tree" "Equips a config tree with a label." "" "" } {ConditionCfg 0 0 "" Null null Nil Null 0 0 0 0 0 0 0 Null "condition_cfg" "Condition Config Tree" "Equips a config tree with a condition string." "" "" } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 21c435f8..8b9c90d1 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -396,7 +396,9 @@ E_LOOKUP_RANGE_FUNCTION_DEF(cfg) U64 read_count = dim_1u64(read_range); for(U64 idx = 0; idx < read_count; idx += 1, dst_idx += 1) { - exprs[dst_idx] = e_expr_irext_array_index(arena, lhs, &lhs_irtree, idx + read_range.min - cfgs_idx_range.min); + RD_Cfg *cfg = accel->cfgs.v[idx + read_range.min - cfgs_idx_range.min]; + exprs[dst_idx] = e_push_expr(arena, E_ExprKind_LeafIdent, 0); + exprs[dst_idx]->string = push_str8f(arena, "$%I64d", cfg->id); } } } @@ -836,6 +838,20 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(ctrl_entities) return result; } +E_LOOKUP_RANGE_FUNCTION_DEF(ctrl_entities) +{ + CTRL_EntityArray *entities = (CTRL_EntityArray *)user_data; + Rng1U64 legal_range = r1u64(0, entities->count); + Rng1U64 read_range = intersect_1u64(legal_range, idx_range); + U64 read_count = dim_1u64(read_range); + for(U64 out_idx = 0; out_idx < read_count; out_idx += 1) + { + CTRL_Entity *entity = entities->v[out_idx + read_range.min]; + exprs[out_idx] = e_push_expr(arena, E_ExprKind_LeafIdent, 0); + exprs[out_idx]->string = ctrl_string_from_handle(arena, entity->handle); + } +} + //////////////////////////////// //~ rjf: Debug Info Tables Eval Hooks @@ -3314,7 +3330,6 @@ rd_view_state_from_cfg(RD_Cfg *cfg) view_state->arena = arena_alloc(); view_state->arena_reset_pos = arena_pos(view_state->arena); view_state->ev_view = ev_view_alloc(); - view_state->search_arena = arena_alloc(); } if(view_state != &rd_nil_view_state) { @@ -3333,21 +3348,29 @@ rd_view_ui(Rng2F32 rect) String8 expr_string = rd_expr_from_cfg(view); ////////////////////////////// - //- rjf: searching extension + //- rjf: query extension // - B32 search_row_is_open = (vs->is_searching || vs->search_string_size != 0); + RD_Cfg *query_root = rd_cfg_child_from_string(view, str8_lit("query")); + RD_Cfg *input_root = rd_cfg_child_from_string(query_root, str8_lit("input")); + RD_Cfg *cmd_root = rd_cfg_child_from_string(query_root, str8_lit("cmd")); + String8 current_input = input_root->first->string; + B32 search_row_is_open = (vs->query_is_selected || current_input.size != 0); F32 search_row_open_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "search_row_open_%p", view), (F32)!!search_row_is_open, .initial = (F32)!!search_row_is_open); if(search_row_open_t > 0.001f) { - String8 cmd_name = vs->search_cmd_name; + String8 cmd_name = cmd_root->first->string; RD_IconKind icon = rd_icon_kind_from_code_name(cmd_name); RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name); + //- rjf: store cfg's string into view's + vs->query_string_size = Min(sizeof(vs->query_buffer), current_input.size); + MemoryCopy(vs->query_buffer, current_input.str, vs->query_string_size); + //- rjf: clamp cursor - if(vs->search_cursor.column == 0) + if(vs->query_cursor.column == 0) { - vs->search_mark = txt_pt(1, 1); - vs->search_cursor = txt_pt(1, vs->search_string_size+1); + vs->query_mark = txt_pt(1, 1); + vs->query_cursor = txt_pt(1, vs->query_string_size+1); } //- rjf: determine dimensions @@ -3365,7 +3388,7 @@ rd_view_ui(Rng2F32 rect) } //- rjf: build contents - UI_Parent(search_row) UI_WidthFill UI_HeightFill UI_Focus(vs->is_searching ? UI_FocusKind_On : UI_FocusKind_Off) + UI_Parent(search_row) UI_WidthFill UI_HeightFill UI_Focus(vs->query_is_selected ? UI_FocusKind_On : UI_FocusKind_Off) RD_Font(cmd_kind_info->query.flags & RD_QueryFlag_CodeInput ? RD_FontSlot_Code : RD_FontSlot_Main) { UI_TextAlignment(UI_TextAlign_Center) @@ -3382,23 +3405,27 @@ rd_view_ui(Rng2F32 rect) { params.flags |= !!(cmd_kind_info->query.flags & RD_QueryFlag_CodeInput) * RD_LineEditFlag_CodeContents; params.flags |= RD_LineEditFlag_Border; - params.cursor = &vs->search_cursor; - params.mark = &vs->search_mark; - params.edit_buffer = vs->search_buffer; - params.edit_string_size_out = &vs->search_string_size; - params.edit_buffer_size = sizeof(vs->search_buffer); - params.pre_edit_value = str8(vs->search_buffer, vs->search_string_size); + params.cursor = &vs->query_cursor; + params.mark = &vs->query_mark; + params.edit_buffer = vs->query_buffer; + params.edit_string_size_out = &vs->query_string_size; + params.edit_buffer_size = sizeof(vs->query_buffer); + params.pre_edit_value = current_input; } UI_Signal sig = rd_line_editf(¶ms, "###search"); if(ui_pressed(sig)) { - vs->is_searching = 1; + vs->query_is_selected = 1; + rd_cmd(RD_CmdKind_FocusPanel); } } //- rjf: commit string to view - RD_Cfg *search = rd_cfg_child_from_string_or_alloc(view, str8_lit("search")); - rd_cfg_new_replace(search, str8(vs->search_buffer, vs->search_string_size)); + if(input_root == &rd_nil_cfg) + { + input_root = rd_cfg_child_from_string_or_alloc(query_root, str8_lit("input")); + } + rd_cfg_new_replace(input_root, str8(vs->query_buffer, vs->query_string_size)); } ////////////////////////////// @@ -3691,7 +3718,7 @@ rd_view_ui(Rng2F32 rect) S64 num_possible_visible_rows = (S64)(dim_2f32(rect).y/row_height_px); F32 row_string_max_size_px = dim_2f32(rect).x; EV_StringFlags string_flags = EV_StringFlag_ReadOnlyDisplayRules; - String8 filter = rd_view_search(); + String8 filter = rd_view_query_input(); Vec4F32 pop_background_rgba = {0}; UI_TagF("pop") pop_background_rgba = ui_color_from_name(str8_lit("background")); @@ -3720,16 +3747,35 @@ rd_view_ui(Rng2F32 rect) } } + ////////////////////////////// + //- rjf: process commands + // + for(RD_Cmd *cmd = 0; rd_next_view_cmd(&cmd);) + { + RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name); + switch(kind) + { + default:{}break; + case RD_CmdKind_Search: + case RD_CmdKind_SearchBackwards: + { + vs->query_is_selected = 0; + }break; + } + } + ////////////////////////////// //- rjf: consume query-completion events, if this view is being used as a query // - if(vs->is_searching && +#if 0 + if(vs->query_is_selected && ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Accept)) { // TODO(rjf): // TODO(rjf): // TODO(rjf): // TODO(rjf): // TODO(rjf): // TODO(rjf): // TODO(rjf): // TODO(rjf): // TODO(rjf): // TODO(rjf): } +#endif ////////////////////////////// //- rjf: consume events & perform navigations/edits - calculate state @@ -5159,7 +5205,7 @@ rd_view_ui(Rng2F32 rect) { searched_string = dr_string_from_fstrs(scratch.arena, &cell_info.fstrs); } - String8 search_query = rd_view_search(); + String8 search_query = rd_view_query_input(); FuzzyMatchRangeList fuzzy_matches = fuzzy_match_find(scratch.arena, search_query, searched_string); if(fuzzy_matches.count == 0) { @@ -5582,12 +5628,12 @@ rd_view_ui(Rng2F32 rect) //////////////////////////// //- rjf: catchall query completion controls // - if(vs->is_searching) UI_Focus(UI_FocusKind_On) + if(vs->query_is_selected) UI_Focus(UI_FocusKind_On) { if(ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Cancel)) { - vs->is_searching = 0; - vs->search_string_size = 0; + vs->query_is_selected = 0; + vs->query_string_size = 0; } if(ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Accept)) { @@ -5629,12 +5675,23 @@ rd_view_eval_view(void) } internal String8 -rd_view_search(void) +rd_view_query_cmd(void) { RD_Cfg *view = rd_cfg_from_id(rd_regs()->view); - RD_Cfg *search = rd_cfg_child_from_string(view, str8_lit("search")); - String8 search_string = search->first->string; - return search_string; + RD_Cfg *query = rd_cfg_child_from_string(view, str8_lit("query")); + RD_Cfg *cmd = rd_cfg_child_from_string(query, str8_lit("cmd")); + String8 string = cmd->first->string; + return string; +} + +internal String8 +rd_view_query_input(void) +{ + RD_Cfg *view = rd_cfg_from_id(rd_regs()->view); + RD_Cfg *query = rd_cfg_child_from_string(view, str8_lit("query")); + RD_Cfg *input = rd_cfg_child_from_string(query, str8_lit("input")); + String8 string = input->first->string; + return string; } internal RD_Cfg * @@ -7258,19 +7315,19 @@ rd_window_frame(void) B32 size_query_by_expr_eval = (cmd_kind_info->query.expr.size == 0); //- rjf: build & prepare view for query ui - RD_Cfg *query = rd_immediate_cfg_from_keyf("window_query_%p", window); - RD_Cfg *view = rd_cfg_child_from_string_or_alloc(query, str8_lit("watch")); + RD_Cfg *window_query = rd_immediate_cfg_from_keyf("window_query_%p", window); + RD_Cfg *view = rd_cfg_child_from_string_or_alloc(window_query, str8_lit("watch")); RD_Cfg *expr = rd_cfg_child_from_string_or_alloc(view, str8_lit("expression")); + RD_Cfg *query = rd_cfg_child_from_string_or_alloc(view, str8_lit("query")); + RD_Cfg *cmd = rd_cfg_child_from_string_or_alloc(query, str8_lit("cmd")); + rd_cfg_new_replace(cmd, cmd_name); rd_cfg_child_from_string_or_alloc(view, str8_lit("lister")); RD_ViewState *vs = rd_view_state_from_cfg(view); - vs->is_searching = 1; - arena_clear(vs->search_arena); - vs->search_cmd_name = push_str8_copy(vs->search_arena, cmd_name); - vs->search_regs = rd_regs_copy(vs->search_arena, ws->query_regs); + vs->query_is_selected = 1; String8 query_expression = cmd_kind_info->query.expr; if(query_expression.size == 0) { - query_expression = str8(vs->search_buffer, vs->search_string_size); + query_expression = str8(vs->query_buffer, vs->query_string_size); RD_Cfg *explicit_root = rd_cfg_child_from_string_or_alloc(view, str8_lit("explicit_root")); rd_cfg_new(explicit_root, str8_lit("1")); } @@ -7281,7 +7338,7 @@ rd_window_frame(void) { String8 pre_insertion = str8_prefix(query_expression, input_insertion_pos); String8 post_insertion = str8_skip(query_expression, input_insertion_pos + 6); - query_expression = push_str8f(scratch.arena, "%S%S%S", pre_insertion, str8(vs->search_buffer, vs->search_string_size), post_insertion); + query_expression = push_str8f(scratch.arena, "%S%S%S", pre_insertion, str8(vs->query_buffer, vs->query_string_size), post_insertion); } rd_cfg_release(rd_cfg_child_from_string(view, str8_lit("explicit_root"))); } @@ -7300,7 +7357,7 @@ rd_window_frame(void) { Vec2F32 content_rect_center = center_2f32(content_rect); Vec2F32 content_rect_dim = dim_2f32(content_rect); - EV_BlockTree predicted_block_tree = ev_block_tree_from_exprs(scratch.arena, rd_view_eval_view(), rd_view_search(), query_eval.exprs); + EV_BlockTree predicted_block_tree = ev_block_tree_from_exprs(scratch.arena, rd_view_eval_view(), rd_view_query_input(), query_eval.exprs); F32 query_open_t = ui_anim(ui_key_from_string(ui_key_zero(), str8_lit("query_open_t")), 1.f); F32 query_width_px = floor_f32(dim_2f32(content_rect).x * 0.35f); F32 max_query_height_px = content_rect_dim.y*0.8f; @@ -12535,7 +12592,6 @@ rd_frame(void) { arena_release(ext->arena); } - arena_release(vs->search_arena); arena_release(vs->arena); DLLRemove_NP(rd_state->view_state_slots[slot_idx].first, rd_state->view_state_slots[slot_idx].last, vs, hash_next, hash_prev); SLLStackPush_N(rd_state->free_view_state, vs, hash_next); @@ -13462,7 +13518,8 @@ rd_frame(void) e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name, .info = E_LOOKUP_INFO_FUNCTION_NAME(ctrl_entities), - .access = E_LOOKUP_ACCESS_FUNCTION_NAME(ctrl_entities)); + .access = E_LOOKUP_ACCESS_FUNCTION_NAME(ctrl_entities), + .range = E_LOOKUP_RANGE_FUNCTION_NAME(ctrl_entities)); } //- rjf: add macro / lookup rules for unattached processes @@ -15795,6 +15852,8 @@ Z(getting_started) { String8 cmd_name = rd_regs()->cmd_name; RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name); + + // rjf: floating queries -> set up window to build immediate-mode top-level query if(cmd_kind_info->query.flags & RD_QueryFlag_Floating) { RD_Cfg *window = rd_cfg_from_id(rd_regs()->window); @@ -15807,38 +15866,40 @@ Z(getting_started) ws->query_regs = rd_regs_copy(ws->query_arena, rd_regs()); } } + + // rjf: non-floating -> embed in tab parameter else { RD_Cfg *view = rd_cfg_from_id(rd_regs()->view); + RD_Cfg *query = rd_cfg_child_from_string_or_alloc(view, str8_lit("query")); + RD_Cfg *cmd = rd_cfg_child_from_string_or_alloc(query, str8_lit("cmd")); + RD_Cfg *input = rd_cfg_child_from_string_or_alloc(query, str8_lit("input")); + String8 current_query_cmd_name = cmd->first->string; RD_ViewState *vs = rd_view_state_from_cfg(view); - if(!str8_match(vs->search_cmd_name, cmd_name, 0)) + if(!str8_match(current_query_cmd_name, cmd_name, 0)) { - arena_clear(vs->search_arena); - vs->search_regs = rd_regs_copy(vs->search_arena, rd_regs()); - vs->search_cmd_name = push_str8_copy(vs->search_arena, cmd_name); - if(!vs->is_searching) + rd_cfg_new_replace(cmd, cmd_name); + if(!vs->query_is_selected) { - vs->search_cursor = txt_pt(1, 1+vs->search_string_size); - vs->search_mark = txt_pt(1, 1); + vs->query_cursor = txt_pt(1, 1+input->first->string.size); + vs->query_mark = txt_pt(1, 1); } - vs->is_searching = 1; + vs->query_is_selected = 1; } else { - vs->is_searching ^= 1; + vs->query_is_selected ^= 1; } } }break; case RD_CmdKind_CompleteQuery: { - RD_Cfg *view = rd_cfg_from_id(rd_regs()->view); - RD_ViewState *vs = rd_view_state_from_cfg(view); - String8 cmd_name = vs->search_cmd_name; + String8 cmd_name = rd_view_query_cmd(); + String8 input = rd_view_query_input(); RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name); RD_RegsScope() { - rd_regs_copy_contents(vs->search_arena, rd_regs(), vs->search_regs); - rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, str8(vs->search_buffer, vs->search_string_size)); + rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, input); rd_push_cmd(cmd_name, rd_regs()); } if(cmd_kind_info->query.flags & RD_QueryFlag_Floating) @@ -15849,53 +15910,12 @@ Z(getting_started) } else if(!(cmd_kind_info->query.flags & RD_QueryFlag_KeepOldInput)) { - vs->is_searching = 0; - vs->search_string_size = 0; + RD_Cfg *view = rd_cfg_from_id(rd_regs()->view); + RD_ViewState *vs = rd_view_state_from_cfg(view); + vs->query_is_selected = 0; + vs->query_string_size = 0; + rd_cfg_release(rd_cfg_child_from_string(view, str8_lit("query"))); } - -#if 0 // TODO(rjf): @cfg (query completion) - RD_Window *ws = rd_window_from_handle(rd_regs()->window); - String8 query_cmd_name = ws->query_cmd_name; - RD_CmdKindInfo *info = rd_cmd_kind_info_from_string(query_cmd_name); - RD_RegSlot slot = info->query.slot; - - // rjf: compound command parameters - if(slot != RD_RegSlot_Null && !(ws->query_cmd_regs_mask[slot/64] & (1ull<<(slot%64)))) - { - RD_Regs *regs_copy = rd_regs_copy(ws->query_cmd_arena, rd_regs()); - Rng1U64 offset_range_in_regs = rd_reg_slot_range_table[slot]; - MemoryCopy((U8 *)(ws->query_cmd_regs) + offset_range_in_regs.min, - (U8 *)(regs_copy) + offset_range_in_regs.min, - dim_1u64(offset_range_in_regs)); - ws->query_cmd_regs_mask[slot/64] |= (1ull<<(slot%64)); - } - - // rjf: determine if command is ready to run - B32 command_ready = 1; - if(slot != RD_RegSlot_Null && !(ws->query_cmd_regs_mask[slot/64] & (1ull<<(slot%64)))) - { - command_ready = 0; - } - - // rjf: end this query - if(!(info->query.flags & RD_QueryFlag_KeepOldInput)) - { - rd_cmd(RD_CmdKind_CancelQuery); - } - - // rjf: unset command register slot, if we keep old input (and thus need - // to re-query user) - if(info->query.flags & RD_QueryFlag_KeepOldInput) - { - ws->query_cmd_regs_mask[slot/64] &= ~(1ull<<(slot%64)); - } - - // rjf: push command if possible - if(command_ready) - { - rd_push_cmd(ws->query_cmd_name, ws->query_cmd_regs); - } -#endif }break; case RD_CmdKind_CancelQuery: { @@ -16068,7 +16088,7 @@ Z(getting_started) case RD_CmdKind_AddAddressBreakpoint: case RD_CmdKind_AddFunctionBreakpoint: { - rd_cmd(RD_CmdKind_AddBreakpoint); + rd_cmd(RD_CmdKind_AddBreakpoint, .file_path = str8_zero()); }break; //- rjf: watch pins @@ -16293,6 +16313,10 @@ Z(getting_started) }break; //- rjf: debug control context management operations + case RD_CmdKind_SelectEntity: + { + rd_cmd(RD_CmdKind_SelectThread, .thread = rd_regs()->ctrl_entity); + }break; case RD_CmdKind_SelectThread: { CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 3a2d8608..33fc8eaa 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -235,15 +235,12 @@ struct RD_ViewState RD_ArenaExt *last_arena_ext; void *user_data; - // rjf: search editing controls - B32 is_searching; - Arena *search_arena; - RD_Regs *search_regs; - String8 search_cmd_name; - TxtPt search_cursor; - TxtPt search_mark; - U8 search_buffer[KB(1)]; - U64 search_string_size; + // rjf: query state + B32 query_is_selected; + TxtPt query_cursor; + TxtPt query_mark; + U8 query_buffer[KB(1)]; + U64 query_string_size; }; typedef struct RD_ViewStateSlot RD_ViewStateSlot; @@ -1079,7 +1076,8 @@ internal void rd_view_ui(Rng2F32 rect); internal Arena *rd_view_arena(void); internal UI_ScrollPt2 rd_view_scroll_pos(void); internal EV_View *rd_view_eval_view(void); -internal String8 rd_view_search(void); +internal String8 rd_view_query_cmd(void); +internal String8 rd_view_query_input(void); internal RD_Cfg *rd_view_cfg_from_string(String8 string); internal E_Value rd_view_cfg_value_from_string(String8 string); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 810bc207..4b07362c 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -139,7 +139,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla ////////////////////////////// //- rjf: get active search query // - String8 search_query = rd_view_search(); + String8 search_query = rd_view_query_input(); B32 search_query_is_active = 0; ////////////////////////////// @@ -832,7 +832,7 @@ rd_watch_pt_from_tbl(EV_BlockRangeList *block_ranges, Vec2S64 tbl) RD_WatchPt pt = zero_struct; { Temp scratch = scratch_begin(0, 0); - EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), rd_view_search(), block_ranges, (U64)tbl.y); + EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), rd_view_query_input(), block_ranges, (U64)tbl.y); RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row); { S64 x = 0; @@ -859,7 +859,7 @@ rd_tbl_from_watch_pt(EV_BlockRangeList *block_ranges, RD_WatchPt pt) { Temp scratch = scratch_begin(0, 0); U64 num = ev_num_from_key(block_ranges, pt.key); - EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), rd_view_search(), block_ranges, num); + EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), rd_view_query_input(), block_ranges, num); RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row); tbl.x = 0; { @@ -1091,6 +1091,16 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) String8 cmd_name = rd_cmd_kind_info_table[cmd_kind].string; rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .flags = RD_WatchCellFlag_ActivateWithSingleClick|RD_WatchCellFlag_Button, .px = floor_f32(ui_top_font_size()*4.f), .string = push_str8f(arena, "query:commands.%S", cmd_name)); } + if(entity->kind == CTRL_EntityKind_Thread) + { + RD_CmdKind cmd_kind = RD_CmdKind_SelectEntity; + if(ctrl_handle_match(entity->handle, rd_base_regs()->thread)) + { + cmd_kind = RD_CmdKind_DeselectEntity; + } + String8 cmd_name = rd_cmd_kind_info_table[cmd_kind].string; + rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, .flags = RD_WatchCellFlag_ActivateWithSingleClick|RD_WatchCellFlag_Button, .px = floor_f32(ui_top_font_size()*4.f), .string = push_str8f(arena, "query:commands.%S", cmd_name)); + } } // rjf: singular button for unattached processes @@ -1408,7 +1418,7 @@ rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_fla } //- rjf: generate strings/flags based on that expression & fill - result.string = rd_value_string_from_eval(arena, rd_view_search(), string_flags, default_radix, font, font_size, max_size_px, result.eval); + result.string = rd_value_string_from_eval(arena, rd_view_query_input(), string_flags, default_radix, font, font_size, max_size_px, result.eval); result.flags |= !!(ev_type_key_is_editable(result.eval.irtree.type_key) && result.eval.irtree.mode == E_Mode_Offset) * RD_WatchCellFlag_CanEdit; E_Type *type = e_type_from_key__cached(result.eval.irtree.type_key); if(type->flags & (E_TypeFlag_IsPlainText|E_TypeFlag_IsPathText)) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 3bfbaa19..b2c11429 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -438,7 +438,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_e Vec4F32 process_color = rd_color_from_ctrl_entity(process); if(process_color.w == 0) { - process_color = color; + process_color = ui_color_from_name(str8_lit("text")); } if(process_name.size != 0) {