From ecb4e0d28224e2ee3bd1d689e17072f87bcb4564 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 14 Feb 2025 09:43:19 -0800 Subject: [PATCH] rich hover for thread-hover editors --- src/ctrl/ctrl_core.c | 7 +++++++ src/ctrl/ctrl_core.h | 1 + src/raddbg/generated/raddbg.meta.c | 2 +- src/raddbg/raddbg.mdesk | 2 +- src/raddbg/raddbg_core.c | 1 + src/raddbg/raddbg_views.c | 28 ++++++++++++++++++++++------ src/raddbg/raddbg_widgets.c | 3 ++- 7 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index 4ab0d345..2c0d0086 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -151,6 +151,13 @@ ctrl_handle_list_copy(Arena *arena, CTRL_HandleList *src) return dst; } +internal String8 +ctrl_string_from_handle(Arena *arena, CTRL_Handle handle) +{ + String8 result = push_str8f(arena, "$%I64x_%I64x", handle.machine_id, handle.dmn_handle.u64[0]); + return result; +} + //////////////////////////////// //~ rjf: Trap Type Functions diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 071748d4..024304aa 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -726,6 +726,7 @@ internal CTRL_Handle ctrl_handle_make(CTRL_MachineID machine_id, DMN_Handle dmn_ internal B32 ctrl_handle_match(CTRL_Handle a, CTRL_Handle b); internal void ctrl_handle_list_push(Arena *arena, CTRL_HandleList *list, CTRL_Handle *pair); internal CTRL_HandleList ctrl_handle_list_copy(Arena *arena, CTRL_HandleList *src); +internal String8 ctrl_string_from_handle(Arena *arena, CTRL_Handle handle); //////////////////////////////// //~ rjf: Trap Type Functions diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 2ae34d4b..098160e1 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -867,7 +867,7 @@ rgba_from_u32_lit_comp(0xffffffff), rgba_from_u32_lit_comp(0x0000007f), rgba_from_u32_lit_comp(0x0000003f), rgba_from_u32_lit_comp(0xffffff0c), -rgba_from_u32_lit_comp(0x0000003f), +rgba_from_u32_lit_comp(0x0000002f), rgba_from_u32_lit_comp(0x99ccff4c), rgba_from_u32_lit_comp(0xffffff1e), rgba_from_u32_lit_comp(0x5f12005f), diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 6382d4ec..b67689d1 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -1010,7 +1010,7 @@ RD_ThemeColorTable: {DropShadow "Drop Shadow" drop_shadow 0x0000007f 0x0000004c 0x0000007f 0xa3a3a37e 0x0000007f 0xc9bfa394 0x0000007f 0x0000007f 0x0000007f ""} {DisabledOverlay "Disabled Overlay" disabled_overlay 0x0000003f 0xa6a6a63f 0x0000003f 0x0000003f 0x0000003f 0xe4dac090 0x0000003f 0x0000003f 0x0000003f ""} {DropSiteOverlay "Drop Site Overlay" drop_site_overlay 0xffffff0c 0x4848480c 0xffffff0c 0x0000000c 0xffffff0c 0xffffff0c 0xffffff0c 0xffffff0c 0xffffff0c ""} - {InactivePanelOverlay "Inactive Panel Overlay" inactive_panel_overlay 0x0000003f 0xa4a4a43f 0x0000003f 0xfefefe53 0x0000003f 0x0000001c 0x0000003f 0x0000003f 0x0000003f ""} + {InactivePanelOverlay "Inactive Panel Overlay" inactive_panel_overlay 0x0000002f 0xa4a4a43f 0x0000003f 0xfefefe53 0x0000003f 0x0000001c 0x0000003f 0x0000003f 0x0000003f ""} {SelectionOverlay "Selection Overlay" selection_overlay 0x99ccff4c 0x003d7a48 0x99ccff4c 0x3d74ab4b 0x99ccff4c 0x678cb24c 0x99ccff4c 0x99ccff4c 0x99ccff4c ""} {HighlightOverlay "Highlight Overlay" highlight_overlay 0xffffff1e 0xffffff1e 0xffffff1e 0x0000001e 0xffffff1e 0xffffff1e 0xffffff1e 0xffffff1e 0xffffff1e ""} {HighlightOverlayError "Error Highlight Overlay" error_highlight_overlay 0x5f12005f 0xff30005f 0x5f12005f 0x5f12005f 0x5f12005f 0x5f12005f 0x5f12005f 0x5f12005f 0x5f12005f ""} diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index a0bb5170..fb335dd4 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12589,6 +12589,7 @@ rd_frame(void) expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = type_key; + e_string2expr_map_insert(scratch.arena, ctx->macro_map, ctrl_string_from_handle(scratch.arena, entity->handle), expr); if(entity->string.size != 0) { e_string2expr_map_insert(scratch.arena, ctx->macro_map, entity->string, expr); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 99297be1..5618a379 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -995,10 +995,13 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) // but does not evaluate them, from e.g. "targets", which uses the group of target // cfgs, and the evaluations are of the targets themselves. // - B32 row_eval_matches_group = 0; + B32 row_cfg_eval_matches_group = 0; RD_Cfg *evalled_cfg = rd_cfg_from_eval_space(info.eval.space); + B32 row_entity_eval_matches_group = 0; + CTRL_Entity *evalled_entity = (info.eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ? rd_ctrl_entity_from_eval_space(info.eval.space) : &ctrl_entity_nil); { - row_eval_matches_group = (evalled_cfg == info.group_cfg_child); + row_cfg_eval_matches_group = (evalled_cfg == info.group_cfg_child); + row_entity_eval_matches_group = (evalled_entity == info.group_entity); } // rjf: determine view ui rule @@ -1013,7 +1016,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) if(0){} // rjf: cfg rows - else if((info.eval.space.kind == RD_EvalSpaceKind_MetaCfg && row_eval_matches_group && info.group_cfg_parent == &rd_nil_cfg) || + else if((info.eval.space.kind == RD_EvalSpaceKind_MetaCfg && row_cfg_eval_matches_group && info.group_cfg_parent == &rd_nil_cfg) || (row->block->parent == &ev_nil_block && evalled_cfg != &rd_nil_cfg)) { RD_Cfg *cfg = evalled_cfg; @@ -1052,16 +1055,18 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) } // rjf: entity rows - else if(info.eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity && info.group_entity != &ctrl_entity_nil) + else if((info.eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity && row_entity_eval_matches_group && info.group_entity != &ctrl_entity_nil) || + (row->block->parent == &ev_nil_block && evalled_entity != &ctrl_entity_nil)) { - rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = RD_WatchCellFlag_Button, .pct = 1.f, .fstrs = rd_title_fstrs_from_ctrl_entity(arena, info.group_entity, ui_top_palette()->text_weak, ui_top_font_size(), 1)); + CTRL_Entity *entity = evalled_entity; + rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Expr, .flags = RD_WatchCellFlag_Button, .pct = 1.f, .fstrs = rd_title_fstrs_from_ctrl_entity(arena, entity, ui_top_palette()->text_weak, ui_top_font_size(), 1)); } // rjf: singular button for commands else if((block_eval.space.kind == RD_EvalSpaceKind_MetaCmdCollection || block_eval.space.kind == RD_EvalSpaceKind_MetaCfgCollection) && info.eval.space.kind == RD_EvalSpaceKind_MetaCmd && - row_eval_matches_group) + row_cfg_eval_matches_group) { RD_CmdKind cmd_kind = e_value_eval_from_eval(info.eval).value.u64; RD_CmdKindInfo *cmd_kind_info = &rd_cmd_kind_info_table[cmd_kind]; @@ -2944,6 +2949,17 @@ RD_VIEW_UI_FUNCTION_DEF(watch) { RD_RegsScope(.cfg = cell_info.cfg->id) rd_drag_begin(RD_RegSlot_Cfg); } + else if(cell_info.entity != &ctrl_entity_nil) + { + RD_RegsScope(.ctrl_entity = cell_info.entity->handle) switch(cell_info.entity->kind) + { + default:{rd_drag_begin(RD_RegSlot_CtrlEntity);}break; + case CTRL_EntityKind_Machine:{RD_RegsScope(.machine = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Machine);}break; + case CTRL_EntityKind_Process:{RD_RegsScope(.process = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Process);}break; + case CTRL_EntityKind_Module:{RD_RegsScope(.module = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Module);}break; + case CTRL_EntityKind_Thread:{RD_RegsScope(.thread = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Thread);}break; + } + } } // rjf: (normally) single-click -> move selection here diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index b3b01423..0e1921ef 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -792,7 +792,8 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // rjf: interactions if(ui_hovering(thread_sig) && !rd_drag_is_active()) { - RD_RegsScope(.thread = thread->handle) rd_set_hover_regs(RD_RegSlot_Thread); + rd_set_hover_eval(v2f32(thread_box->rect.x0, thread_box->rect.y1-2.f), str8_zero(), txt_pt(0, 0), 0, ctrl_string_from_handle(scratch.arena, thread->handle)); + RD_RegsScope(.ctrl_entity = thread->handle) rd_set_hover_regs(RD_RegSlot_CtrlEntity); } if(ui_right_clicked(thread_sig)) {