From 5d76b58acd4752b7b871c93330408b172c363465 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 30 Sep 2024 09:40:39 -0700 Subject: [PATCH] targets view: ensure ctrl+click for selection, ensure proper target parameterization of engine commands --- src/raddbg/raddbg_core.c | 33 +++++++++++++++++++++++---------- src/raddbg/raddbg_core.h | 1 + src/raddbg/raddbg_views.c | 14 ++++++++++++-- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index de2702df..2b21cca5 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1708,6 +1708,21 @@ rd_entity_from_name_and_kind(String8 string, RD_EntityKind kind) //////////////////////////////// //~ rjf: Frontend Entity Info Extraction +internal D_Target +rd_d_target_from_entity(RD_Entity *entity) +{ + RD_Entity *src_target_exe = rd_entity_child_from_kind(entity, RD_EntityKind_Executable); + RD_Entity *src_target_args = rd_entity_child_from_kind(entity, RD_EntityKind_Arguments); + RD_Entity *src_target_wdir = rd_entity_child_from_kind(entity, RD_EntityKind_WorkingDirectory); + RD_Entity *src_target_entry = rd_entity_child_from_kind(entity, RD_EntityKind_EntryPoint); + D_Target target = {0}; + target.exe = src_target_exe->string; + target.args = src_target_args->string; + target.working_directory = src_target_wdir->string; + target.custom_entry_point_name = src_target_entry->string; + return target; +} + internal DR_FancyStringList rd_title_fstrs_from_entity(Arena *arena, RD_Entity *entity, Vec4F32 secondary_color, F32 size) { @@ -11085,6 +11100,7 @@ rd_frame(void) // rjf: try to run engine command if(D_CmdKind_Null < (D_CmdKind)kind && (D_CmdKind)kind < D_CmdKind_COUNT) { + RD_Entity *entity = rd_entity_from_handle(rd_regs()->entity); D_CmdParams params = {0}; params.machine = rd_regs()->machine; params.thread = rd_regs()->thread; @@ -11096,7 +11112,12 @@ rd_frame(void) params.vaddr = rd_regs()->vaddr; params.prefer_disasm = rd_regs()->prefer_disasm; params.pid = rd_regs()->pid; - // TODO(rjf): @msgs params.targets = ???; + if(entity->kind == RD_EntityKind_Target) + { + params.targets.count = 1; + params.targets.v = push_array(scratch.arena, D_Target, params.targets.count); + params.targets.v[0] = rd_d_target_from_entity(entity); + } // TODO(rjf): @msgs #if 0 params.window = rd_regs()->window; @@ -14890,15 +14911,7 @@ rd_frame(void) targets.count -= 1; continue; } - RD_Entity *src_target_exe = rd_entity_child_from_kind(src_target, RD_EntityKind_Executable); - RD_Entity *src_target_args = rd_entity_child_from_kind(src_target, RD_EntityKind_Arguments); - RD_Entity *src_target_wdir = rd_entity_child_from_kind(src_target, RD_EntityKind_WorkingDirectory); - RD_Entity *src_target_entry = rd_entity_child_from_kind(src_target, RD_EntityKind_EntryPoint); - D_Target *dst_target = &targets.v[idx]; - dst_target->exe = src_target_exe->string; - dst_target->args = src_target_args->string; - dst_target->working_directory = src_target_wdir->string; - dst_target->custom_entry_point_name = src_target_entry->string; + targets.v[idx] = rd_d_target_from_entity(src_target); idx += 1; } } diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 9fd0a7a8..b27bd41e 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -1168,6 +1168,7 @@ internal RD_Entity *rd_entity_from_name_and_kind(String8 string, RD_EntityKind k //////////////////////////////// //~ rjf: Frontend Entity Info Extraction +internal D_Target rd_d_target_from_entity(RD_Entity *entity); internal DR_FancyStringList rd_title_fstrs_from_entity(Arena *arena, RD_Entity *entity, Vec4F32 secondary_color, F32 size); //////////////////////////////// diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 9aa68107..1315ff76 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2555,9 +2555,19 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { icon_kind = entity->disabled ? RD_IconKind_CheckHollow : RD_IconKind_CheckFilled; } - if(ui_clicked(rd_icon_buttonf(icon_kind, 0, "###row_ctrl_%I64x", idx))) + UI_Signal sig = rd_icon_buttonf(icon_kind, 0, "###row_ctrl_%I64x", idx); + if(ui_clicked(sig)) { - rd_cmd(ctrl->kind, .entity = rd_handle_from_entity(entity)); + if(ctrl->kind == RD_CmdKind_SelectEntity) + { + rd_cmd(sig.event_flags & OS_Modifier_Ctrl && entity->disabled ? RD_CmdKind_EnableEntity : + sig.event_flags & OS_Modifier_Ctrl && !entity->disabled ? RD_CmdKind_DisableEntity : + RD_CmdKind_SelectEntity, .entity = rd_handle_from_entity(entity)); + } + else + { + rd_cmd(ctrl->kind, .entity = rd_handle_from_entity(entity)); + } } } ctrl_idx += 1;