work on ctrl entity buttons in watch views

This commit is contained in:
Ryan Fleury
2024-09-30 17:07:50 -07:00
parent 57d01355a1
commit 152cc709ce
7 changed files with 193 additions and 44 deletions
+20 -4
View File
@@ -702,6 +702,22 @@ RD_EntityKind_Nil,
RD_EntityKind_Nil,
};
CTRL_EntityKind rd_collection_ctrl_entity_kind_table[12] =
{
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Thread,
CTRL_EntityKind_Module,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
};
EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[12] =
{
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(watches),
@@ -740,8 +756,8 @@ EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(targets),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(breakpoints),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watch_pins),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(threads),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(modules),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(globals),
@@ -756,8 +772,8 @@ EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watches),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(targets),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(breakpoints),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watch_pins),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(threads),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(modules),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(globals),
+5
View File
@@ -672,6 +672,8 @@ EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watches);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(targets);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(breakpoints);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watch_pins);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(threads);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(modules);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(globals);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(thread_locals);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(types);
@@ -680,6 +682,8 @@ EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watches);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(targets);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(breakpoints);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watch_pins);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(threads);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(modules);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(globals);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(thread_locals);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(types);
@@ -753,6 +757,7 @@ extern String8 rd_binding_version_remap_new_name_table[7];
extern String8 rd_icon_kind_text_table[69];
extern String8 rd_collection_name_table[12];
extern RD_EntityKind rd_collection_entity_kind_table[12];
extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[12];
extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[12];
extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[12];
extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[12];
+18 -13
View File
@@ -818,21 +818,21 @@ RD_IconTable:
////////////////////////////////
//~ rjf: Collections
@table(name entity_kind id_space)
@table(name entity_kind ctrl_entity_kind id_space)
RD_CollectionTable:
{
{watches Watch x}
{targets Target x}
{breakpoints Breakpoint x}
{watch_pins WatchPin x}
{threads Nil -}
{modules Nil -}
{locals Nil -}
{registers Nil -}
{globals Nil x}
{thread_locals Nil x}
{types Nil x}
{procedures Nil x}
{watches Watch Null x}
{targets Target Null x}
{breakpoints Breakpoint Null x}
{watch_pins WatchPin Null x}
{threads Nil Thread x}
{modules Nil Module x}
{locals Nil Null -}
{registers Nil Null -}
{globals Nil Null x}
{thread_locals Nil Null x}
{types Nil Null x}
{procedures Nil Null x}
}
@gen
@@ -854,6 +854,11 @@ RD_CollectionTable:
@expand(RD_CollectionTable a) `RD_EntityKind_$(a.entity_kind)`,
}
@data(CTRL_EntityKind) rd_collection_ctrl_entity_kind_table:
{
@expand(RD_CollectionTable a) `CTRL_EntityKind_$(a.ctrl_entity_kind)`,
}
@data(`EV_ViewRuleExprExpandInfoHookFunctionType *`) rd_collection_expr_expand_info_hook_function_table:
{
@expand(RD_CollectionTable a) `EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME($(a.name))`
+64 -2
View File
@@ -1876,6 +1876,44 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, Vec4F32 secon
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" "));
String8 name = rd_name_from_ctrl_entity(arena, entity);
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, color, name);
if(entity->kind == CTRL_EntityKind_Thread)
{
F32 ext_size = size*0.95f;
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, secondary_color, str8_lit(" "));
DI_Scope *di_scope = di_scope_open();
CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process);
Arch arch = entity->arch;
CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity);
for(U64 idx = 0, limit = 6; idx < unwind.frames.count && idx < limit; idx += 1)
{
CTRL_UnwindFrame *f = &unwind.frames.v[unwind.frames.count - 1 - idx];
U64 rip_vaddr = regs_rip_from_arch_block(arch, f->regs);
CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr);
U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr);
DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);
RDI_Parsed *rdi = di_rdi_from_key(di_scope, &dbgi_key, 0);
if(rdi != &di_rdi_parsed_nil)
{
RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, rip_voff);
String8 name = {0};
name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &name.size);
name = push_str8_copy(arena, name);
if(name.size != 0)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), ext_size, rd_rgba_from_theme_color(RD_ThemeColor_CodeSymbol), name);
if(idx+1 < unwind.frames.count)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), ext_size, secondary_color, str8_lit(" > "));
if(idx+1 == limit)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), ext_size, secondary_color, str8_lit("..."));
}
}
}
}
}
di_scope_close(di_scope);
}
return result;
}
@@ -7955,8 +7993,12 @@ EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watch_pins) { return rd_ev_vie
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(threads) { return rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(arena, view, filter, expr, params, CTRL_EntityKind_Thread); }
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(threads) { return rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(arena, view, filter, expr, params, idx_range, user_data, CTRL_EntityKind_Thread); }
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(threads) { return rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(num, user_data, CTRL_EntityKind_Thread); }
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(threads) { return rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(id, user_data, CTRL_EntityKind_Thread); }
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(modules) { return rd_ev_view_rule_expr_expand_info__meta_ctrl_entities(arena, view, filter, expr, params, CTRL_EntityKind_Module); }
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(modules) { return rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(arena, view, filter, expr, params, idx_range, user_data, CTRL_EntityKind_Module); }
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(modules) { return rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(num, user_data, CTRL_EntityKind_Module); }
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(modules) { return rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(id, user_data, CTRL_EntityKind_Module); }
//- rjf: locals
@@ -8224,13 +8266,33 @@ rd_ev_view_rule_expr_expand_range_info__meta_ctrl_entities(Arena *arena, EV_View
internal U64
rd_ev_view_rule_expr_id_from_num__meta_ctrl_entities(U64 num, void *user_data, CTRL_EntityKind kind)
{
RD_CtrlEntityExpandAccel *accel = (RD_CtrlEntityExpandAccel *)user_data;
U64 id = 0;
if(1 <= num && num <= accel->entities.count)
{
id = d_hash_from_string(str8_struct(&accel->entities.v[num-1]->handle));
}
return id;
}
internal U64
rd_ev_view_rule_expr_num_from_id__meta_ctrl_entities(U64 id, void *user_data, CTRL_EntityKind kind)
{
RD_CtrlEntityExpandAccel *accel = (RD_CtrlEntityExpandAccel *)user_data;
U64 num = 0;
if(id != 0)
{
for EachIndex(idx, accel->entities.count)
{
U64 idx_id = d_hash_from_string(str8_struct(&accel->entities.v[idx]->handle));
if(idx_id == id)
{
num = idx+1;
break;
}
}
}
return num;
}
typedef struct RD_DebugInfoTableExpandAccel RD_DebugInfoTableExpandAccel;
+84 -25
View File
@@ -831,18 +831,35 @@ rd_watch_view_row_info_from_row(EV_Row *row)
// rjf: determine collection entity kind, if any
RD_EntityKind collection_entity_kind = RD_EntityKind_Nil;
CTRL_EntityKind collection_ctrl_entity_kind = CTRL_EntityKind_Null;
for EachElement(idx, rd_collection_name_table)
{
if(str8_match(type->name, rd_collection_name_table[idx], 0))
{
collection_entity_kind = rd_collection_entity_kind_table[idx];
collection_ctrl_entity_kind = rd_collection_ctrl_entity_kind_table[idx];
break;
}
}
// rjf: extract collection entities, if any
RD_Entity *entity = rd_entity_from_id(key.child_id);
// rjf: extract collection entity, if any
RD_Entity *entity = &d_nil_entity;
if(collection_entity_kind != RD_EntityKind_Nil)
{
entity = rd_entity_from_id(key.child_id);
}
// rjf: extract collection
CTRL_Entity *ctrl_entity = &ctrl_entity_nil;
if(collection_ctrl_entity_kind != CTRL_EntityKind_Null && block->expand_view_rule_info_user_data != 0)
{
U64 block_relative_num = block->expand_view_rule_info->expr_expand_num_from_id(key.child_id, block->expand_view_rule_info_user_data);
RD_CtrlEntityExpandAccel *accel = block->expand_view_rule_info_user_data;
if(1 <= block_relative_num && block_relative_num <= accel->entities.count)
{
ctrl_entity = accel->entities.v[block_relative_num-1];
}
}
// rjf: extract callstack thread, if any
CTRL_Entity *thread = &ctrl_entity_nil;
@@ -892,12 +909,13 @@ rd_watch_view_row_info_from_row(EV_Row *row)
}
// rjf: fill
info.collection_entity_kind = collection_entity_kind;
info.collection_entity = entity;
info.collection_ctrl_entity = ctrl_entity;
info.callstack_thread = thread;
info.callstack_unwind_index = unwind_count;
info.callstack_inline_depth = inline_depth;
info.collection_entity_kind = collection_entity_kind;
info.collection_entity = entity;
info.collection_ctrl_entity_kind = collection_ctrl_entity_kind;
info.collection_ctrl_entity = ctrl_entity;
info.callstack_thread = thread;
info.callstack_unwind_index = unwind_count;
info.callstack_inline_depth = inline_depth;
di_scope_close(di_scope);
scratch_end(scratch);
@@ -931,6 +949,10 @@ rd_watch_view_row_kind_from_flags_row_info(RD_WatchViewFlags flags, EV_Row *row,
{
row_kind = RD_WatchViewRowKind_PrettyEntityControls;
}
else if(flags & RD_WatchViewFlag_PrettyEntityRows && info->collection_ctrl_entity_kind != CTRL_EntityKind_Null)
{
row_kind = RD_WatchViewRowKind_PrettyEntityControls;
}
scratch_end(scratch);
return row_kind;
}
@@ -2401,7 +2423,9 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
{
//- rjf: unpack
RD_EntityKind collection_entity_kind = row_info.collection_entity_kind;
CTRL_EntityKind collection_ctrl_entity_kind = row_info.collection_ctrl_entity_kind;
RD_Entity *entity = row_info.collection_entity;
CTRL_Entity *ctrl_entity = row_info.collection_ctrl_entity;
B32 entity_box_selected = (row_selected && selection_tbl.min.x <= 1 && 1 <= selection_tbl.max.x);
//- rjf: pick palette
@@ -2439,25 +2463,21 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
{
UI_Parent(entity_box)
{
// rjf: build expander, title
if(!rd_entity_is_nil(entity))
UI_PrefWidth(ui_em(2.f, 1.f)) if(ui_pressed(ui_expander(row_expanded, str8_lit("###expanded"))))
{
UI_PrefWidth(ui_em(2.f, 1.f)) if(ui_pressed(ui_expander(row_expanded, str8_lit("###expanded"))))
next_row_expanded = !row_expanded;
}
DR_FancyStringList fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, ui_top_palette()->text_weak, ui_top_font_size());
UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());
ui_box_equip_display_fancy_strings(title_box, &fstrs);
UI_Signal sig = ui_signal_from_box(entity_box);
if(ui_clicked(sig))
{
if(entity->kind == RD_EntityKind_Target)
{
next_row_expanded = !row_expanded;
}
DR_FancyStringList fstrs = rd_title_fstrs_from_entity(scratch.arena, entity, ui_top_palette()->text_weak, ui_top_font_size());
UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());
ui_box_equip_display_fancy_strings(title_box, &fstrs);
UI_Signal sig = ui_signal_from_box(entity_box);
if(ui_clicked(sig))
{
if(entity->kind == RD_EntityKind_Target)
{
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));
}
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));
}
}
}
@@ -2499,6 +2519,45 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
}
}
}
//- rjf: build ctrl entity box
if(ctrl_entity != &ctrl_entity_nil)
{
ui_set_next_hover_cursor(OS_Cursor_HandPoint);
UI_Box *entity_box = &ui_nil_box;
UI_FocusHot(entity_box_selected ? UI_FocusKind_On : UI_FocusKind_Off) UI_Palette(palette)
{
entity_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|
UI_BoxFlag_DrawBorder|
UI_BoxFlag_DrawBackground|
UI_BoxFlag_DrawHotEffects|
UI_BoxFlag_DrawActiveEffects,
"###entity_%p", ctrl_entity);
}
{
UI_Parent(entity_box)
{
// rjf: build expander, title
UI_PrefWidth(ui_em(2.f, 1.f)) if(ui_pressed(ui_expander(row_expanded, str8_lit("###expanded"))))
{
next_row_expanded = !row_expanded;
}
DR_FancyStringList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, ui_top_palette()->text_weak, ui_top_font_size());
UI_Box *title_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());
ui_box_equip_display_fancy_strings(title_box, &fstrs);
UI_Signal sig = ui_signal_from_box(entity_box);
if(ui_clicked(sig))
{
if(entity->kind == RD_EntityKind_Target)
{
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));
}
}
}
}
}
}break;
////////////////////
+1
View File
@@ -122,6 +122,7 @@ struct RD_WatchViewRowInfo
{
RD_EntityKind collection_entity_kind;
RD_Entity *collection_entity;
CTRL_EntityKind collection_ctrl_entity_kind;
CTRL_Entity *collection_ctrl_entity;
CTRL_Entity *callstack_thread;
U64 callstack_unwind_index;
+1
View File
@@ -318,6 +318,7 @@ rd_cmd_spec_button(String8 name)
ui_set_next_flags(UI_BoxFlag_Clickable);
ui_set_next_group_key(ui_key_zero());
UI_PrefWidth(ui_children_sum(1))
UI_Column UI_Padding(ui_em(0.5f, 1.f)) UI_FontSize(ui_top_font_size()*0.95f) UI_HeightFill
UI_NamedRow(str8_lit("###bindings"))
UI_FlagsAdd(UI_BoxFlag_DrawTextWeak)
UI_FastpathCodepoint(0)