auto view rules

This commit is contained in:
Ryan Fleury
2024-10-14 08:19:42 -07:00
parent 8a1dd578a7
commit 1c269286df
7 changed files with 192 additions and 79 deletions
+17 -8
View File
@@ -91,6 +91,8 @@ Y(String8, type(CTRL_CodeString8), function_location, "Function Location")\
Y(String8, type(CTRL_CodeString8), address_location, "Address Location")\
Y(String8, type(CTRL_PathString8), source_path, "Source Path")\
Y(String8, type(CTRL_PathString8), destination_path, "Destination Path")\
Y(String8, type(CTRL_CodeString8), type, "Type")\
Y(String8, type(CTRL_CodeString8), view_rule, "View Rule")\
Y(String8, type(CTRL_CodeString8), condition, "Condition")\
X(CTRL_MetaEvalFrameArray, callstack, "Call Stack")
#define X(T, name, pretty_name) T name;
@@ -146,6 +148,12 @@ struct_members(CTRL_FilePathMapMetaEval)
member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), destination_path, .pretty_name = str8_lit_comp("Destination Path")),
};
struct_members(CTRL_AutoViewRuleMetaEval)
{
member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), type, .pretty_name = str8_lit_comp("Type")),
member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), view_rule, .pretty_name = str8_lit_comp("View Rule")),
};
struct_members(CTRL_MachineMetaEval)
{
member_lit_comp(CTRL_MetaEval, type(B32), frozen, .pretty_name = str8_lit_comp("Frozen")),
@@ -179,14 +187,15 @@ struct_members(CTRL_ThreadMetaEval)
member_lit_comp(CTRL_MetaEval, type(CTRL_MetaEvalFrameArray), callstack, .pretty_name = str8_lit_comp("Call Stack")),
};
named_struct_type(CTRL_BreakpointMetaEval, CTRL_MetaEval, .name = str8_lit_comp("breakpoint"));
named_struct_type(CTRL_TargetMetaEval, CTRL_MetaEval, .name = str8_lit_comp("target"));
named_struct_type(CTRL_PinMetaEval, CTRL_MetaEval, .name = str8_lit_comp("pin"));
named_struct_type(CTRL_FilePathMapMetaEval,CTRL_MetaEval, .name = str8_lit_comp("file_path_map"));
named_struct_type(CTRL_MachineMetaEval, CTRL_MetaEval, .name = str8_lit_comp("machine"));
named_struct_type(CTRL_ProcessMetaEval, CTRL_MetaEval, .name = str8_lit_comp("process"));
named_struct_type(CTRL_ModuleMetaEval, CTRL_MetaEval, .name = str8_lit_comp("module"));
named_struct_type(CTRL_ThreadMetaEval, CTRL_MetaEval, .name = str8_lit_comp("thread"));
named_struct_type(CTRL_BreakpointMetaEval, CTRL_MetaEval, .name = str8_lit_comp("breakpoint"));
named_struct_type(CTRL_TargetMetaEval, CTRL_MetaEval, .name = str8_lit_comp("target"));
named_struct_type(CTRL_PinMetaEval, CTRL_MetaEval, .name = str8_lit_comp("pin"));
named_struct_type(CTRL_FilePathMapMetaEval, CTRL_MetaEval, .name = str8_lit_comp("file_path_map"));
named_struct_type(CTRL_AutoViewRuleMetaEval,CTRL_MetaEval, .name = str8_lit_comp("auto_view_rule"));
named_struct_type(CTRL_MachineMetaEval, CTRL_MetaEval, .name = str8_lit_comp("machine"));
named_struct_type(CTRL_ProcessMetaEval, CTRL_MetaEval, .name = str8_lit_comp("process"));
named_struct_type(CTRL_ModuleMetaEval, CTRL_MetaEval, .name = str8_lit_comp("module"));
named_struct_type(CTRL_ThreadMetaEval, CTRL_MetaEval, .name = str8_lit_comp("thread"));
//- rjf: meta evaluation array
+14 -7
View File
@@ -672,13 +672,14 @@ str8_lit_comp("5"),
str8_lit_comp("c"),
};
String8 rd_collection_name_table[17] =
String8 rd_collection_name_table[18] =
{
str8_lit_comp("watches"),
str8_lit_comp("targets"),
str8_lit_comp("breakpoints"),
str8_lit_comp("watch_pins"),
str8_lit_comp("file_path_maps"),
str8_lit_comp("auto_view_rules"),
str8_lit_comp("machines"),
str8_lit_comp("processes"),
str8_lit_comp("threads"),
@@ -693,13 +694,14 @@ str8_lit_comp("types"),
str8_lit_comp("procedures"),
};
RD_EntityKind rd_collection_entity_kind_table[17] =
RD_EntityKind rd_collection_entity_kind_table[18] =
{
RD_EntityKind_Watch,
RD_EntityKind_Target,
RD_EntityKind_Breakpoint,
RD_EntityKind_WatchPin,
RD_EntityKind_FilePathMap,
RD_EntityKind_AutoViewRule,
RD_EntityKind_Nil,
RD_EntityKind_Nil,
RD_EntityKind_Nil,
@@ -714,13 +716,14 @@ RD_EntityKind_Nil,
RD_EntityKind_Nil,
};
CTRL_EntityKind rd_collection_ctrl_entity_kind_table[17] =
CTRL_EntityKind rd_collection_ctrl_entity_kind_table[18] =
{
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
CTRL_EntityKind_Machine,
CTRL_EntityKind_Process,
CTRL_EntityKind_Thread,
@@ -735,13 +738,14 @@ CTRL_EntityKind_Null,
CTRL_EntityKind_Null,
};
EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[17] =
EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[18] =
{
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(watches),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(targets),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(breakpoints),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(watch_pins),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(file_path_maps),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(auto_view_rules),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(machines),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(processes),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(threads),
@@ -756,13 +760,14 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(types),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(procedures),
};
EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[17] =
EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[18] =
{
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(watches),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(targets),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(breakpoints),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(watch_pins),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(file_path_maps),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(auto_view_rules),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(machines),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(processes),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(threads),
@@ -777,13 +782,14 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(types),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(procedures),
};
EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[17] =
EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[18] =
{
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(file_path_maps),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(auto_view_rules),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(machines),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(processes),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(threads),
@@ -798,13 +804,14 @@ EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(types),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(procedures),
};
EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[17] =
EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[18] =
{
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(file_path_maps),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(auto_view_rules),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(machines),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(processes),
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(threads),
+11 -7
View File
@@ -653,6 +653,7 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(targets);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(breakpoints);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watch_pins);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(file_path_maps);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(auto_view_rules);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(machines);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(processes);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(threads);
@@ -670,6 +671,7 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(targets);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(breakpoints);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watch_pins);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(file_path_maps);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(auto_view_rules);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(machines);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(processes);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(threads);
@@ -687,6 +689,7 @@ 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(file_path_maps);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(auto_view_rules);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(machines);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(processes);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(threads);
@@ -702,6 +705,7 @@ 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(file_path_maps);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(auto_view_rules);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(machines);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(processes);
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(threads);
@@ -767,13 +771,13 @@ extern RD_StringBindingPair rd_default_binding_table[110];
extern String8 rd_binding_version_remap_old_name_table[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[17];
extern RD_EntityKind rd_collection_entity_kind_table[17];
extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[17];
extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[17];
extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[17];
extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[17];
extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[17];
extern String8 rd_collection_name_table[18];
extern RD_EntityKind rd_collection_entity_kind_table[18];
extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[18];
extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[18];
extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[18];
extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[18];
extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[18];
extern RD_ViewRuleInfo rd_view_rule_kind_info_table[34];
extern RD_IconKind rd_entity_kind_icon_kind_table[30];
extern String8 rd_theme_preset_display_string_table[9];
+1
View File
@@ -829,6 +829,7 @@ RD_CollectionTable:
{breakpoints Breakpoint Null x}
{watch_pins WatchPin Null x}
{file_path_maps FilePathMap Null x}
{auto_view_rules AutoViewRule Null x}
//- rjf: control entity groups
{machines Nil Machine x}
+112 -43
View File
@@ -1910,12 +1910,12 @@ rd_title_fstrs_from_entity(Arena *arena, RD_Entity *entity, Vec4F32 secondary_co
Vec4F32 dst_color = color;
if(src_string.size == 0)
{
src_string = str8_lit("no path");
src_string = str8_lit("(source path)");
src_color = secondary_color;
}
if(dst_string.size == 0)
{
dst_string = str8_lit("no path");
dst_string = str8_lit("(destination path)");
dst_color = secondary_color;
}
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size, src_color, src_string);
@@ -1924,6 +1924,40 @@ rd_title_fstrs_from_entity(Arena *arena, RD_Entity *entity, Vec4F32 secondary_co
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" "));
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size, dst_color, dst_string);
}
if(entity->kind == RD_EntityKind_AutoViewRule)
{
String8 src_string = src->string;
Vec4F32 src_color = color;
String8 dst_string = dst->string;
Vec4F32 dst_color = color;
DR_FancyStringList src_fstrs = {0};
DR_FancyStringList dst_fstrs = {0};
if(src_string.size == 0)
{
src_string = str8_lit("(type)");
src_color = secondary_color;
dr_fancy_string_list_push_new(arena, &src_fstrs, rd_font_from_slot(RD_FontSlot_Main), size, color_extrafied, src_string);
}
else RD_Font(RD_FontSlot_Code)
{
src_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0, src_color, src_string);
}
if(dst_string.size == 0)
{
dst_string = str8_lit("(view rule)");
dst_color = secondary_color;
dr_fancy_string_list_push_new(arena, &dst_fstrs, rd_font_from_slot(RD_FontSlot_Main), size, color_extrafied, dst_string);
}
else RD_Font(RD_FontSlot_Code)
{
dst_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0, dst_color, dst_string);
}
dr_fancy_string_list_concat_in_place(&result, &src_fstrs);
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" "));
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[RD_IconKind_RightArrow]);
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" "));
dr_fancy_string_list_concat_in_place(&result, &dst_fstrs);
}
if((entity->kind == RD_EntityKind_Target || entity->kind == RD_EntityKind_Breakpoint) && entity->disabled)
{
dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" "));
@@ -2184,9 +2218,21 @@ rd_ctrl_meta_eval_from_entity(Arena *arena, RD_Entity *entity)
meval->source_location = src_loc_string;
meval->address_location = vaddr_loc_string;
meval->function_location = function_loc_string;
meval->source_path = src->string;
meval->destination_path = dst->string;
meval->condition = cnd_string;
switch(entity->kind)
{
default:{}break;
case RD_EntityKind_FilePathMap:
{
meval->source_path = src->string;
meval->destination_path = dst->string;
}break;
case RD_EntityKind_AutoViewRule:
{
meval->type = src->string;
meval->view_rule = dst->string;
}break;
}
ProfEnd();
return meval;
}
@@ -2441,6 +2487,8 @@ rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range)
StringMemberCase(entry_point) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_EntryPoint), str8_cstring_capped(in, (U8 *)in + 4096));}
StringMemberCase(source_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Source), str8_cstring_capped(in, (U8 *)in + 4096));}
StringMemberCase(destination_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Dest), str8_cstring_capped(in, (U8 *)in + 4096));}
StringMemberCase(type) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Source), str8_cstring_capped(in, (U8 *)in + 4096));}
StringMemberCase(view_rule) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Dest), str8_cstring_capped(in, (U8 *)in + 4096));}
StringMemberCase(condition) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Condition), str8_cstring_capped(in, (U8 *)in + 4096));}
StringMemberCase(source_location)
{
@@ -4098,14 +4146,14 @@ rd_window_frame(RD_Window *ws)
// rjf: filter controls
if(view->spec->flags & RD_ViewRuleInfoFlag_CanFilter)
{
if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_Filter].display_name)))
if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_Filter].string)))
{
rd_cmd(RD_CmdKind_Filter, .view = rd_handle_from_view(view));
rd_cmd(RD_CmdKind_Filter, .panel = rd_handle_from_panel(panel), .view = rd_handle_from_view(view));
ui_ctx_menu_close();
}
if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_ClearFilter].display_name)))
if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_ClearFilter].string)))
{
rd_cmd(RD_CmdKind_ClearFilter, .view = rd_handle_from_view(view));
rd_cmd(RD_CmdKind_ClearFilter, .panel = rd_handle_from_panel(panel), .view = rd_handle_from_view(view));
ui_ctx_menu_close();
}
}
@@ -4199,45 +4247,12 @@ rd_window_frame(RD_Window *ws)
}
// rjf: copy name
if(ctrl_entity->kind == CTRL_EntityKind_Thread &&
ui_clicked(rd_icon_buttonf(RD_IconKind_Clipboard, 0, "Copy Name")))
if(ui_clicked(rd_icon_buttonf(RD_IconKind_Clipboard, 0, "Copy Name")))
{
os_set_clipboard_text(ctrl_entity->string);
ui_ctx_menu_close();
}
// rjf: selection
if(ctrl_entity->kind == CTRL_EntityKind_Thread)
{
B32 is_selected = ctrl_handle_match(rd_base_regs()->thread, ctrl_entity->handle);
if(is_selected)
{
rd_icon_buttonf(RD_IconKind_Thread, 0, "[Selected]###select_entity");
}
else if(ui_clicked(rd_icon_buttonf(RD_IconKind_Thread, 0, "Select###select_entity")))
{
rd_cmd(RD_CmdKind_SelectThread, .thread = ctrl_entity->handle);
ui_ctx_menu_close();
}
}
// rjf: freezing
if(ctrl_entity->kind == CTRL_EntityKind_Thread ||
ctrl_entity->kind == CTRL_EntityKind_Process ||
ctrl_entity->kind == CTRL_EntityKind_Machine)
{
B32 is_frozen = ctrl_entity_tree_is_frozen(ctrl_entity);
ui_set_next_palette(rd_palette_from_code(is_frozen ? RD_PaletteCode_NegativePopButton : RD_PaletteCode_PositivePopButton));
if(is_frozen && ui_clicked(rd_icon_buttonf(RD_IconKind_Locked, 0, "Thaw###freeze_thaw")))
{
rd_cmd(RD_CmdKind_ThawThread, .ctrl_entity = ctrl_entity->handle);
}
if(!is_frozen && ui_clicked(rd_icon_buttonf(RD_IconKind_Unlocked, 0, "Freeze###freeze_thaw")))
{
rd_cmd(RD_CmdKind_FreezeThread, .ctrl_entity = ctrl_entity->handle);
}
}
// rjf: copy ID
if((ctrl_entity->kind == CTRL_EntityKind_Thread ||
ctrl_entity->kind == CTRL_EntityKind_Process) &&
@@ -4308,9 +4323,41 @@ rd_window_frame(RD_Window *ws)
}
}
RD_Palette(RD_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f));
// rjf: selection
if(ctrl_entity->kind == CTRL_EntityKind_Thread)
{
B32 is_selected = ctrl_handle_match(rd_base_regs()->thread, ctrl_entity->handle);
if(is_selected)
{
rd_icon_buttonf(RD_IconKind_Thread, 0, "[Selected]###select_entity");
}
else if(ui_clicked(rd_icon_buttonf(RD_IconKind_Thread, 0, "Select###select_entity")))
{
rd_cmd(RD_CmdKind_SelectThread, .thread = ctrl_entity->handle);
ui_ctx_menu_close();
}
}
// rjf: freezing
if(ctrl_entity->kind == CTRL_EntityKind_Thread ||
ctrl_entity->kind == CTRL_EntityKind_Process ||
ctrl_entity->kind == CTRL_EntityKind_Machine)
{
B32 is_frozen = ctrl_entity_tree_is_frozen(ctrl_entity);
ui_set_next_palette(rd_palette_from_code(is_frozen ? RD_PaletteCode_NegativePopButton : RD_PaletteCode_PositivePopButton));
if(is_frozen && ui_clicked(rd_icon_buttonf(RD_IconKind_Locked, 0, "Thaw###freeze_thaw")))
{
rd_cmd(RD_CmdKind_ThawThread, .ctrl_entity = ctrl_entity->handle);
}
if(!is_frozen && ui_clicked(rd_icon_buttonf(RD_IconKind_Unlocked, 0, "Freeze###freeze_thaw")))
{
rd_cmd(RD_CmdKind_FreezeThread, .ctrl_entity = ctrl_entity->handle);
}
}
// rjf: callstack
#if 0
RD_Palette(RD_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f));
if(ctrl_entity->kind == CTRL_EntityKind_Thread) UI_TextPadding(ui_top_font_size()*1.5f)
{
DI_Scope *di_scope = di_scope_open();
@@ -4375,6 +4422,7 @@ rd_window_frame(RD_Window *ws)
}
di_scope_close(di_scope);
}
#endif
// rjf: color editor
#if 0
@@ -5387,6 +5435,7 @@ rd_window_frame(RD_Window *ws)
rd_cmd_kind_info_table[RD_CmdKind_Breakpoints].string,
rd_cmd_kind_info_table[RD_CmdKind_WatchPins].string,
rd_cmd_kind_info_table[RD_CmdKind_FilePathMap].string,
rd_cmd_kind_info_table[RD_CmdKind_AutoViewRules].string,
rd_cmd_kind_info_table[RD_CmdKind_Settings].string,
rd_cmd_kind_info_table[RD_CmdKind_ExceptionFilters].string,
rd_cmd_kind_info_table[RD_CmdKind_GettingStarted].string,
@@ -5410,6 +5459,7 @@ rd_window_frame(RD_Window *ws)
'b',
'h',
'p',
'v',
'e',
'g',
0,
@@ -8552,6 +8602,10 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(file_path_maps) { return rd_ev
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_FilePathMap, 1); }
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_FilePathMap, 1); }
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_FilePathMap, 1); }
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(auto_view_rules) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_AutoViewRule); }
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(auto_view_rules) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_AutoViewRule, 1); }
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(auto_view_rules){ return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_AutoViewRule, 1); }
EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(auto_view_rules){ return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_AutoViewRule, 1); }
//- rjf: control entity groups
@@ -11756,6 +11810,7 @@ rd_frame(void)
RD_EntityKind_WatchPin,
RD_EntityKind_Target,
RD_EntityKind_FilePathMap,
RD_EntityKind_AutoViewRule,
};
E_TypeKey evallable_kind_types[] =
{
@@ -11763,6 +11818,7 @@ rd_frame(void)
e_type_key_cons_base(type(CTRL_PinMetaEval)),
e_type_key_cons_base(type(CTRL_TargetMetaEval)),
e_type_key_cons_base(type(CTRL_FilePathMapMetaEval)),
e_type_key_cons_base(type(CTRL_AutoViewRuleMetaEval)),
};
for EachElement(idx, evallable_kinds)
{
@@ -11921,6 +11977,19 @@ rd_frame(void)
{
ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, collection_type_keys[idx], rd_collection_name_table[idx], 1);
}
RD_EntityList auto_view_rules = rd_query_cached_entity_list_with_kind(RD_EntityKind_AutoViewRule);
for(RD_EntityNode *n = auto_view_rules.first; n != 0; n = n->next)
{
RD_Entity *rule = n->entity;
RD_Entity *src = rd_entity_child_from_kind(rule, RD_EntityKind_Source);
RD_Entity *dst = rd_entity_child_from_kind(rule, RD_EntityKind_Dest);
String8 type_string = src->string;
String8 view_rule_string = dst->string;
E_TokenArray tokens = e_token_array_from_text(scratch.arena, type_string);
E_Parse type_parse = e_parse_type_from_text_tokens(scratch.arena, type_string, &tokens);
E_TypeKey type_key = e_type_from_expr(type_parse.expr);
ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, type_key, view_rule_string, 0);
}
}
ev_select_auto_view_rule_table(auto_view_rule_table);
+5 -6
View File
@@ -17,8 +17,6 @@
// [ ] empty user file causing failure to launch
// [ ] decay arrays to pointers in pointer/value comparison
// [ ] debugger readme pass
// [x] global evaluation across DLL boundaries
// [x] mohit-reported callstack-frame-selection bug (with inlines)
////////////////////////////////
//~ rjf: post-0.9.12 TODO notes
@@ -36,7 +34,6 @@
// [ ] rich hover coverage; bitmap <-> geo <-> memory <-> disassembly <-> text; etc.
// [ ] save view column pcts; generalize to being a first-class thing in
// RD_View, e.g. by just having a string -> f32 store
// [ ] auto-scroll output window
// [ ] visualize all breakpoints everywhere - source view should show up in
// disasm, disasm should show up in source view, function should show up in
// both, etc.
@@ -200,7 +197,6 @@
// [ ] @feature processor/data breakpoints
// [ ] @feature automatically snap to search matches when searching source files
// [ ] automatically start search query with selected text
// [ ] @feature entity views: filtering & reordering
////////////////////////////////
//~ rjf: Cold, Clean-up Tasks That Probably Only Ryan Notices
@@ -221,8 +217,6 @@
// [ ] @feature types -> auto view rules (don't statefully fill view rules
// given types, just query if no other view rule is present, & autofill
// when editing)
// [ ] @feature eval system -> somehow evaluate breakpoint hit counts? "meta"
// variables?
//
// [ ] @feature disasm view improvement features
// [ ] visualize jump destinations in disasm
@@ -523,6 +517,11 @@
// overrides, e.g. C:/devel/ -> D:/devel/, but also C:/devel/foo ->
// C:/devel/bar, etc.
// [x] fix memory view
// [x] global evaluation across DLL boundaries
// [x] mohit-reported callstack-frame-selection bug (with inlines)
// [x] @feature entity views: filtering & reordering
// [x] @feature eval system -> somehow evaluate breakpoint hit counts? "meta"
// variables?
////////////////////////////////
//~ rjf: Build Options
+32 -8
View File
@@ -1261,13 +1261,14 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
}
RD_WatchViewRowCtrl row_ctrls_[] =
{
{RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndRun },
{RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndInit },
{RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_SelectEntity },
{RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity },
{RD_EntityKind_Breakpoint, CTRL_EntityKind_Null, RD_CmdKind_EnableEntity },
{RD_EntityKind_Breakpoint, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity },
{RD_EntityKind_FilePathMap,CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity },
{RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndRun },
{RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndInit },
{RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_SelectEntity },
{RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity },
{RD_EntityKind_Breakpoint, CTRL_EntityKind_Null, RD_CmdKind_EnableEntity },
{RD_EntityKind_Breakpoint, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity },
{RD_EntityKind_FilePathMap, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity },
{RD_EntityKind_AutoViewRule,CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity },
{RD_EntityKind_Nil, CTRL_EntityKind_Machine, RD_CmdKind_FreezeEntity },
{RD_EntityKind_Nil, CTRL_EntityKind_Process, RD_CmdKind_Kill },
{RD_EntityKind_Nil, CTRL_EntityKind_Process, RD_CmdKind_FreezeEntity },
@@ -2577,6 +2578,15 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
rd_entity_alloc(rd_entity_root(), RD_EntityKind_FilePathMap);
}
}
if(rd_entity_is_nil(entity) && collection_entity_kind == RD_EntityKind_AutoViewRule)
UI_Palette(palette)
{
ui_set_next_focus_hot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off);
if(ui_clicked(rd_icon_buttonf(RD_IconKind_Binoculars, 0, "Add Auto View Rule")))
{
rd_entity_alloc(rd_entity_root(), RD_EntityKind_AutoViewRule);
}
}
//- rjf: build entity box
if(!rd_entity_is_nil(entity) || ctrl_entity != &ctrl_entity_nil)
@@ -2630,6 +2640,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo
switch(ctrl_entity->kind)
{
default:{}break;
case CTRL_EntityKind_Machine:{slot = RD_RegSlot_Machine; rd_regs()->machine = ctrl_entity->handle;}break;
case CTRL_EntityKind_Thread: {slot = RD_RegSlot_Thread; rd_regs()->thread = ctrl_entity->handle;}break;
case CTRL_EntityKind_Process:{slot = RD_RegSlot_Process; rd_regs()->process = ctrl_entity->handle;}break;
case CTRL_EntityKind_Module: {slot = RD_RegSlot_Module; rd_regs()->module = ctrl_entity->handle;}break;
@@ -5151,7 +5162,20 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(file_path_map)
////////////////////////////////
//~ rjf: auto_view_rules @view_hook_impl
RD_VIEW_RULE_UI_FUNCTION_DEF(auto_view_rules){}
RD_VIEW_RULE_UI_FUNCTION_DEF(auto_view_rules)
{
ProfBeginFunction();
RD_WatchViewState *wv = rd_view_state(RD_WatchViewState);
if(!wv->initialized)
{
rd_watch_view_init(wv);
rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f);
rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.75f, .dequote_string = 1, .is_non_code = 0);
}
rd_watch_view_build(wv, RD_WatchViewFlag_NoHeader|RD_WatchViewFlag_PrettyNameMembers|RD_WatchViewFlag_PrettyEntityRows|RD_WatchViewFlag_DisableCacheLines,
str8_lit("auto_view_rules"), str8_lit("only: type view_rule str"), 1, 10, rect);
ProfEnd();
}
////////////////////////////////
//~ rjf: breakpoints @view_hook_impl