more progress on entity simplification; df -> rd; eliminate dbg_frontend distinction from raddbg layer

This commit is contained in:
Ryan Fleury
2024-09-13 15:55:58 -07:00
parent 48ae9b6973
commit 8ffc9f4a9b
22 changed files with 9832 additions and 10000 deletions
+2 -2
View File
@@ -78,8 +78,8 @@ main_thread_base_entry_point(void (*entry_point)(CmdLine *cmdline), char **argum
#if defined(DBG_ENGINE_CORE_H) && !defined(D_INIT_MANUAL)
d_init();
#endif
#if defined(DBG_FRONTEND_CORE_H) && !defined(DF_INIT_MANUAL)
df_init(&cmdline);
#if defined(RADDBG_CORE_H) && !defined(RD_INIT_MANUAL)
rd_init(&cmdline);
#endif
//- rjf: call into entry point
+3 -3
View File
@@ -101,7 +101,7 @@ D_ViewRuleTable:
//~ rjf: Developer Toggles
@table(name)
DF_DevToggleTable:
D_DevToggleTable:
{
{telemetry_capture}
{simulate_lag}
@@ -117,13 +117,13 @@ DF_DevToggleTable:
@gen
{
@expand(DF_DevToggleTable a) `global B32 DEV_$(a.name) = 0;`
@expand(D_DevToggleTable a) `global B32 DEV_$(a.name) = 0;`
}
@gen
{
`struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] =`;
`{`;
@expand(DF_DevToggleTable a) `{&DEV_$(a.name), str8_lit_comp("$(a.name)")},`
@expand(D_DevToggleTable a) `{&DEV_$(a.name), str8_lit_comp("$(a.name)")},`
`};`;
}
+96 -96
View File
@@ -951,7 +951,7 @@ d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64
Temp scratch = scratch_begin(&arena, 1);
DI_Scope *scope = di_scope_open();
DI_KeyList dbgi_keys = d_push_active_dbgi_key_list(scratch.arena);
String8List overrides = d_possible_overrides_from_file_path(scratch.arena, file_path);
String8List overrides = rd_possible_overrides_from_file_path(scratch.arena, file_path);
for(String8Node *override_n = overrides.first;
override_n != 0;
override_n = override_n->next)
@@ -1536,7 +1536,7 @@ d_init(void)
d_state = push_array(arena, D_State, 1);
d_state->arena = arena;
d_state->cmds_arena = arena_alloc();
d_state->output_log_key = hs_hash_from_data(str8_lit("df_output_log_key"));
d_state->output_log_key = hs_hash_from_data(str8_lit("output_log_key"));
d_state->ctrl_entity_store = ctrl_entity_store_alloc();
d_state->ctrl_stop_arena = arena_alloc();
d_state->view_rule_spec_table_size = 1024;
@@ -1632,16 +1632,16 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
// rjf: kill all entities which are marked to die on stop
{
DF_Entity *request = df_entity_from_id(event->msg_id);
if(df_entity_is_nil(request))
RD_Entity *request = rd_entity_from_id(event->msg_id);
if(rd_entity_is_nil(request))
{
for(DF_Entity *entity = df_entity_root();
!df_entity_is_nil(entity);
entity = df_entity_rec_depth_first_pre(entity, df_entity_root()).next)
for(RD_Entity *entity = rd_entity_root();
!rd_entity_is_nil(entity);
entity = rd_entity_rec_depth_first_pre(entity, rd_entity_root()).next)
{
if(entity->flags & DF_EntityFlag_DiesOnRunStop)
if(entity->flags & RD_EntityFlag_DiesOnRunStop)
{
df_entity_mark_for_deletion(entity);
rd_entity_mark_for_deletion(entity);
}
}
}
@@ -1685,8 +1685,8 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("[new session]\n")};
mtx_push_op(d_state->output_log_key, op);
#if 0 // TODO(rjf): @msgs
DF_EntityList bps = d_query_cached_entity_list_with_kind(DF_EntityKind_Breakpoint);
for(DF_EntityNode *n = bps.first; n != 0; n = n->next)
RD_EntityList bps = d_query_cached_entity_list_with_kind(RD_EntityKind_Breakpoint);
for(RD_EntityNode *n = bps.first; n != 0; n = n->next)
{
n->entity->u64 = 0;
}
@@ -1694,39 +1694,39 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
}
// rjf: create entity
DF_Entity *machine = df_machine_entity_from_machine_id(event->entity.machine_id);
DF_Entity *entity = df_entity_alloc(machine, DF_EntityKind_Process);
df_entity_equip_u64(entity, event->msg_id);
df_entity_equip_ctrl_handle(entity, event->entity);
df_entity_equip_ctrl_id(entity, event->entity_id);
df_entity_equip_arch(entity, event->arch);
RD_Entity *machine = rd_machine_entity_from_machine_id(event->entity.machine_id);
RD_Entity *entity = rd_entity_alloc(machine, RD_EntityKind_Process);
rd_entity_equip_u64(entity, event->msg_id);
rd_entity_equip_ctrl_handle(entity, event->entity);
rd_entity_equip_ctrl_id(entity, event->entity_id);
rd_entity_equip_arch(entity, event->arch);
}break;
case CTRL_EventKind_NewThread:
{
// rjf: create entity
DF_Entity *parent = df_entity_from_ctrl_handle(event->parent);
DF_Entity *entity = df_entity_alloc(parent, DF_EntityKind_Thread);
df_entity_equip_ctrl_handle(entity, event->entity);
df_entity_equip_arch(entity, event->arch);
df_entity_equip_ctrl_id(entity, event->entity_id);
df_entity_equip_stack_base(entity, event->stack_base);
df_entity_equip_vaddr(entity, event->rip_vaddr);
RD_Entity *parent = rd_entity_from_ctrl_handle(event->parent);
RD_Entity *entity = rd_entity_alloc(parent, RD_EntityKind_Thread);
rd_entity_equip_ctrl_handle(entity, event->entity);
rd_entity_equip_arch(entity, event->arch);
rd_entity_equip_ctrl_id(entity, event->entity_id);
rd_entity_equip_stack_base(entity, event->stack_base);
rd_entity_equip_vaddr(entity, event->rip_vaddr);
if(event->string.size != 0)
{
df_entity_equip_name(entity, event->string);
rd_entity_equip_name(entity, event->string);
}
// rjf: find any pending thread names correllating with this TID -> equip name if found match
{
DF_EntityList pending_thread_names = d_query_cached_entity_list_with_kind(DF_EntityKind_PendingThreadName);
for(DF_EntityNode *n = pending_thread_names.first; n != 0; n = n->next)
RD_EntityList pending_thread_names = d_query_cached_entity_list_with_kind(RD_EntityKind_PendingThreadName);
for(RD_EntityNode *n = pending_thread_names.first; n != 0; n = n->next)
{
DF_Entity *pending_thread_name = n->entity;
RD_Entity *pending_thread_name = n->entity;
if(event->entity.machine_id == pending_thread_name->ctrl_handle.machine_id && event->entity_id == pending_thread_name->ctrl_id)
{
df_entity_mark_for_deletion(pending_thread_name);
df_entity_equip_name(entity, pending_thread_name->string);
rd_entity_mark_for_deletion(pending_thread_name);
rd_entity_equip_name(entity, pending_thread_name->string);
break;
}
}
@@ -1734,13 +1734,13 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
// rjf: determine index in process
U64 thread_idx_in_process = 0;
for(DF_Entity *child = parent->first; !df_entity_is_nil(child); child = child->next)
for(RD_Entity *child = parent->first; !rd_entity_is_nil(child); child = child->next)
{
if(child == entity)
{
break;
}
if(child->kind == DF_EntityKind_Thread)
if(child->kind == RD_EntityKind_Thread)
{
thread_idx_in_process += 1;
}
@@ -1749,63 +1749,63 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
// rjf: build default thread color table
Vec4F32 thread_colors[] =
{
df_rgba_from_theme_color(DF_ThemeColor_Thread0),
df_rgba_from_theme_color(DF_ThemeColor_Thread1),
df_rgba_from_theme_color(DF_ThemeColor_Thread2),
df_rgba_from_theme_color(DF_ThemeColor_Thread3),
df_rgba_from_theme_color(DF_ThemeColor_Thread4),
df_rgba_from_theme_color(DF_ThemeColor_Thread5),
df_rgba_from_theme_color(DF_ThemeColor_Thread6),
df_rgba_from_theme_color(DF_ThemeColor_Thread7),
rd_rgba_from_theme_color(RD_ThemeColor_Thread0),
rd_rgba_from_theme_color(RD_ThemeColor_Thread1),
rd_rgba_from_theme_color(RD_ThemeColor_Thread2),
rd_rgba_from_theme_color(RD_ThemeColor_Thread3),
rd_rgba_from_theme_color(RD_ThemeColor_Thread4),
rd_rgba_from_theme_color(RD_ThemeColor_Thread5),
rd_rgba_from_theme_color(RD_ThemeColor_Thread6),
rd_rgba_from_theme_color(RD_ThemeColor_Thread7),
};
// rjf: pick color
Vec4F32 thread_color = thread_colors[thread_idx_in_process % ArrayCount(thread_colors)];
// rjf: equip color
df_entity_equip_color_rgba(entity, thread_color);
rd_entity_equip_color_rgba(entity, thread_color);
}break;
case CTRL_EventKind_NewModule:
{
// rjf: grab process
DF_Entity *parent = df_entity_from_ctrl_handle(event->parent);
RD_Entity *parent = rd_entity_from_ctrl_handle(event->parent);
// rjf: determine if this is the first module
B32 is_first = 0;
if(df_entity_is_nil(df_entity_child_from_kind(parent, DF_EntityKind_Module)))
if(rd_entity_is_nil(rd_entity_child_from_kind(parent, RD_EntityKind_Module)))
{
is_first = 1;
}
// rjf: create module entity
DF_Entity *module = df_entity_alloc(parent, DF_EntityKind_Module);
df_entity_equip_ctrl_handle(module, event->entity);
df_entity_equip_arch(module, event->arch);
df_entity_equip_name(module, event->string);
df_entity_equip_vaddr_rng(module, event->vaddr_rng);
df_entity_equip_vaddr(module, event->rip_vaddr);
df_entity_equip_timestamp(module, event->timestamp);
RD_Entity *module = rd_entity_alloc(parent, RD_EntityKind_Module);
rd_entity_equip_ctrl_handle(module, event->entity);
rd_entity_equip_arch(module, event->arch);
rd_entity_equip_name(module, event->string);
rd_entity_equip_vaddr_rng(module, event->vaddr_rng);
rd_entity_equip_vaddr(module, event->rip_vaddr);
rd_entity_equip_timestamp(module, event->timestamp);
// rjf: is first -> find target, equip process & module & first thread with target color
if(is_first)
{
DF_EntityList targets = d_query_cached_entity_list_with_kind(DF_EntityKind_Target);
for(DF_EntityNode *n = targets.first; n != 0; n = n->next)
RD_EntityList targets = d_query_cached_entity_list_with_kind(RD_EntityKind_Target);
for(RD_EntityNode *n = targets.first; n != 0; n = n->next)
{
DF_Entity *target = n->entity;
DF_Entity *exe = df_entity_child_from_kind(target, DF_EntityKind_Executable);
RD_Entity *target = n->entity;
RD_Entity *exe = rd_entity_child_from_kind(target, RD_EntityKind_Executable);
String8 exe_name = exe->string;
String8 exe_name_normalized = path_normalized_from_string(scratch.arena, exe_name);
String8 module_name_normalized = path_normalized_from_string(scratch.arena, module->string);
if(str8_match(exe_name_normalized, module_name_normalized, StringMatchFlag_CaseInsensitive) &&
target->flags & DF_EntityFlag_HasColor)
target->flags & RD_EntityFlag_HasColor)
{
DF_Entity *first_thread = df_entity_child_from_kind(parent, DF_EntityKind_Thread);
Vec4F32 rgba = df_rgba_from_entity(target);
df_entity_equip_color_rgba(parent, rgba);
df_entity_equip_color_rgba(first_thread, rgba);
df_entity_equip_color_rgba(module, rgba);
RD_Entity *first_thread = rd_entity_child_from_kind(parent, RD_EntityKind_Thread);
Vec4F32 rgba = rd_rgba_from_entity(target);
rd_entity_equip_color_rgba(parent, rgba);
rd_entity_equip_color_rgba(first_thread, rgba);
rd_entity_equip_color_rgba(module, rgba);
break;
}
}
@@ -1815,34 +1815,34 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
case CTRL_EventKind_EndProc:
{
U32 pid = event->entity_id;
DF_Entity *process = df_entity_from_ctrl_handle(event->entity);
df_entity_mark_for_deletion(process);
RD_Entity *process = rd_entity_from_ctrl_handle(event->entity);
rd_entity_mark_for_deletion(process);
}break;
case CTRL_EventKind_EndThread:
{
DF_Entity *thread = df_entity_from_ctrl_handle(event->entity);
df_entity_mark_for_deletion(thread);
RD_Entity *thread = rd_entity_from_ctrl_handle(event->entity);
rd_entity_mark_for_deletion(thread);
}break;
case CTRL_EventKind_EndModule:
{
DF_Entity *module = df_entity_from_ctrl_handle(event->entity);
df_entity_mark_for_deletion(module);
RD_Entity *module = rd_entity_from_ctrl_handle(event->entity);
rd_entity_mark_for_deletion(module);
}break;
//- rjf: debug info changes
case CTRL_EventKind_ModuleDebugInfoPathChange:
{
DF_Entity *module = df_entity_from_ctrl_handle(event->entity);
DF_Entity *debug_info = df_entity_child_from_kind(module, DF_EntityKind_DebugInfoPath);
if(df_entity_is_nil(debug_info))
RD_Entity *module = rd_entity_from_ctrl_handle(event->entity);
RD_Entity *debug_info = rd_entity_child_from_kind(module, RD_EntityKind_DebugInfoPath);
if(rd_entity_is_nil(debug_info))
{
debug_info = df_entity_alloc(module, DF_EntityKind_DebugInfoPath);
debug_info = rd_entity_alloc(module, RD_EntityKind_DebugInfoPath);
}
df_entity_equip_name(debug_info, event->string);
df_entity_equip_timestamp(debug_info, event->timestamp);
rd_entity_equip_name(debug_info, event->string);
rd_entity_equip_timestamp(debug_info, event->timestamp);
}break;
//- rjf: debug strings
@@ -1856,25 +1856,25 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
case CTRL_EventKind_ThreadName:
{
String8 string = event->string;
DF_Entity *entity = df_entity_from_ctrl_handle(event->entity);
RD_Entity *entity = rd_entity_from_ctrl_handle(event->entity);
if(event->entity_id != 0)
{
entity = df_entity_from_ctrl_id(event->entity.machine_id, event->entity_id);
entity = rd_entity_from_ctrl_id(event->entity.machine_id, event->entity_id);
}
if(df_entity_is_nil(entity))
if(rd_entity_is_nil(entity))
{
DF_Entity *process = df_entity_from_ctrl_handle(event->parent);
if(!df_entity_is_nil(process))
RD_Entity *process = rd_entity_from_ctrl_handle(event->parent);
if(!rd_entity_is_nil(process))
{
entity = df_entity_alloc(process, DF_EntityKind_PendingThreadName);
df_entity_equip_name(entity, string);
df_entity_equip_ctrl_handle(entity, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero()));
df_entity_equip_ctrl_id(entity, event->entity_id);
entity = rd_entity_alloc(process, RD_EntityKind_PendingThreadName);
rd_entity_equip_name(entity, string);
rd_entity_equip_ctrl_handle(entity, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero()));
rd_entity_equip_ctrl_id(entity, event->entity_id);
}
}
if(!df_entity_is_nil(entity))
if(!rd_entity_is_nil(entity))
{
df_entity_equip_name(entity, string);
rd_entity_equip_name(entity, string);
}
}break;
@@ -2000,15 +2000,15 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
default:{}break;
case DI_EventKind_ConversionStarted:
{
DF_Entity *task = df_entity_alloc(df_entity_root(), DF_EntityKind_ConversionTask);
df_entity_equip_name(task, event->string);
RD_Entity *task = rd_entity_alloc(rd_entity_root(), RD_EntityKind_ConversionTask);
rd_entity_equip_name(task, event->string);
}break;
case DI_EventKind_ConversionEnded:
{
DF_Entity *task = df_entity_from_name_and_kind(event->string, DF_EntityKind_ConversionTask);
if(!df_entity_is_nil(task))
RD_Entity *task = rd_entity_from_name_and_kind(event->string, RD_EntityKind_ConversionTask);
if(!rd_entity_is_nil(task))
{
df_entity_mark_for_deletion(task);
rd_entity_mark_for_deletion(task);
}
}break;
}
@@ -2355,22 +2355,22 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P
#if 0 // TODO(rjf): @msgs
// rjf: gather targets corresponding to all launched processes
DF_EntityList targets = {0};
RD_EntityList targets = {0};
{
DF_EntityList processes = d_query_cached_entity_list_with_kind(DF_EntityKind_Process);
for(DF_EntityNode *n = processes.first; n != 0; n = n->next)
RD_EntityList processes = d_query_cached_entity_list_with_kind(RD_EntityKind_Process);
for(RD_EntityNode *n = processes.first; n != 0; n = n->next)
{
DF_Entity *process = n->entity;
DF_Entity *target = df_entity_from_handle(process->entity_handle);
if(!df_entity_is_nil(target))
RD_Entity *process = n->entity;
RD_Entity *target = rd_entity_from_handle(process->entity_handle);
if(!rd_entity_is_nil(target))
{
df_entity_list_push(scratch.arena, &targets, target);
rd_entity_list_push(scratch.arena, &targets, target);
}
}
}
// rjf: re-launch targets
d_cmd(D_CmdKind_LaunchAndRun, .entity_list = df_handle_list_from_entity_list(scratch.arena, targets));
d_cmd(D_CmdKind_LaunchAndRun, .entity_list = rd_handle_list_from_entity_list(scratch.arena, targets));
#endif
}break;
case D_CmdKind_StepInto:
File diff suppressed because it is too large Load Diff
-7
View File
@@ -1,7 +0,0 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#include "dbg_frontend_core.c"
#include "dbg_frontend_widgets.c"
#include "dbg_frontend_views.c"
#include "dbg_frontend_view_rules.c"
-12
View File
@@ -1,12 +0,0 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef DBG_FRONTEND_INC_H
#define DBG_FRONTEND_INC_H
#include "dbg_frontend_core.h"
#include "dbg_frontend_widgets.h"
#include "dbg_frontend_views.h"
#include "dbg_frontend_view_rules.h"
#endif // DBG_GFX_INC_H
-219
View File
@@ -1,219 +0,0 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
////////////////////////////////
//~ rjf: "list"
EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(list){}
DF_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(list){}
////////////////////////////////
//~ rjf: "dec"
DF_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(dec){}
////////////////////////////////
//~ rjf: "bin"
DF_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(bin){}
////////////////////////////////
//~ rjf: "oct"
DF_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(oct){}
////////////////////////////////
//~ rjf: "hex"
DF_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(hex){}
////////////////////////////////
//~ rjf: "only"
EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(only){}
DF_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(only){}
DF_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(only){}
////////////////////////////////
//~ rjf: "omit"
EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(omit){}
DF_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(omit){}
DF_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(omit){}
////////////////////////////////
//~ rjf: "no_addr"
DF_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(no_addr){}
////////////////////////////////
//~ rjf: "checkbox"
DF_VIEW_RULE_ROW_UI_FUNCTION_DEF(checkbox)
{
Temp scratch = scratch_begin(0, 0);
E_Eval eval = e_eval_from_string(scratch.arena, string);
E_Eval value_eval = e_value_eval_from_eval(eval);
if(ui_clicked(df_icon_buttonf(value_eval.value.u64 == 0 ? DF_IconKind_CheckHollow : DF_IconKind_CheckFilled, 0, "###check")))
{
d_commit_eval_value_string(eval, value_eval.value.u64 == 0 ? str8_lit("1") : str8_lit("0"));
}
scratch_end(scratch);
}
////////////////////////////////
//~ rjf: "rgba"
EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(color_rgba)
{
EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth);
vb->string = string;
vb->expr = expr;
vb->visual_idx_range = r1u64(0, 8);
vb->semantic_idx_range = r1u64(0, 1);
vb->view_rules = view_rules;
ev_block_end(out, vb);
}
DF_VIEW_RULE_ROW_UI_FUNCTION_DEF(color_rgba)
{
Temp scratch = scratch_begin(0, 0);
E_Eval eval = e_eval_from_string(scratch.arena, string);
Vec4F32 rgba = df_rgba_from_eval_params(eval, params);
Vec4F32 hsva = hsva_from_rgba(rgba);
//- rjf: build text box
UI_Box *text_box = &ui_g_nil_box;
UI_WidthFill DF_Font(DF_FontSlot_Code)
{
text_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());
DR_FancyStringList fancy_strings = {0};
{
DR_FancyString open_paren = {ui_top_font(), str8_lit("("), ui_top_palette()->text, ui_top_font_size(), 0, 0};
DR_FancyString comma = {ui_top_font(), str8_lit(", "), ui_top_palette()->text, ui_top_font_size(), 0, 0};
DR_FancyString r_fstr = {ui_top_font(), push_str8f(scratch.arena, "%.2f", rgba.x), v4f32(1.f, 0.25f, 0.25f, 1.f), ui_top_font_size(), 4.f, 0};
DR_FancyString g_fstr = {ui_top_font(), push_str8f(scratch.arena, "%.2f", rgba.y), v4f32(0.25f, 1.f, 0.25f, 1.f), ui_top_font_size(), 4.f, 0};
DR_FancyString b_fstr = {ui_top_font(), push_str8f(scratch.arena, "%.2f", rgba.z), v4f32(0.25f, 0.25f, 1.f, 1.f), ui_top_font_size(), 4.f, 0};
DR_FancyString a_fstr = {ui_top_font(), push_str8f(scratch.arena, "%.2f", rgba.w), v4f32(1.f, 1.f, 1.f, 1.f), ui_top_font_size(), 4.f, 0};
DR_FancyString clse_paren = {ui_top_font(), str8_lit(")"), ui_top_palette()->text, ui_top_font_size(), 0, 0};
dr_fancy_string_list_push(scratch.arena, &fancy_strings, &open_paren);
dr_fancy_string_list_push(scratch.arena, &fancy_strings, &r_fstr);
dr_fancy_string_list_push(scratch.arena, &fancy_strings, &comma);
dr_fancy_string_list_push(scratch.arena, &fancy_strings, &g_fstr);
dr_fancy_string_list_push(scratch.arena, &fancy_strings, &comma);
dr_fancy_string_list_push(scratch.arena, &fancy_strings, &b_fstr);
dr_fancy_string_list_push(scratch.arena, &fancy_strings, &comma);
dr_fancy_string_list_push(scratch.arena, &fancy_strings, &a_fstr);
dr_fancy_string_list_push(scratch.arena, &fancy_strings, &clse_paren);
}
ui_box_equip_display_fancy_strings(text_box, &fancy_strings);
}
//- rjf: build color box
UI_Box *color_box = &ui_g_nil_box;
UI_PrefWidth(ui_em(1.875f, 1.f)) UI_ChildLayoutAxis(Axis2_Y)
{
color_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, "color_box");
UI_Parent(color_box) UI_PrefHeight(ui_em(1.875f, 1.f)) UI_Padding(ui_pct(1, 0))
{
UI_Palette(ui_build_palette(ui_top_palette(), .background = rgba)) UI_CornerRadius(ui_top_font_size()*0.5f)
ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder, ui_key_zero());
}
}
//- rjf: space
ui_spacer(ui_em(0.375f, 1.f));
//- rjf: hover color box -> show components
UI_Signal sig = ui_signal_from_box(color_box);
if(ui_hovering(sig))
{
ui_do_color_tooltip_hsva(hsva);
}
scratch_end(scratch);
}
////////////////////////////////
//~ rjf: "text"
EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(text)
{
EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth);
vb->string = string;
vb->expr = expr;
vb->visual_idx_range = r1u64(0, 8);
vb->semantic_idx_range = r1u64(0, 1);
vb->view_rules = view_rules;
ev_block_end(out, vb);
}
////////////////////////////////
//~ rjf: "disasm"
EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(disasm)
{
EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth);
vb->string = string;
vb->expr = expr;
vb->visual_idx_range = r1u64(0, 8);
vb->semantic_idx_range = r1u64(0, 1);
vb->view_rules = view_rules;
ev_block_end(out, vb);
}
////////////////////////////////
//~ rjf: "memory"
EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(memory)
{
EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth);
vb->string = string;
vb->expr = expr;
vb->visual_idx_range = r1u64(0, 16);
vb->semantic_idx_range = r1u64(0, 1);
vb->view_rules = view_rules;
ev_block_end(out, vb);
}
////////////////////////////////
//~ rjf: "graph"
EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(graph)
{
EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth);
vb->string = string;
vb->expr = expr;
vb->visual_idx_range = r1u64(0, 8);
vb->semantic_idx_range = r1u64(0, 1);
vb->view_rules = view_rules;
ev_block_end(out, vb);
}
////////////////////////////////
//~ rjf: "bitmap"
EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(bitmap)
{
EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth);
vb->string = string;
vb->expr = expr;
vb->visual_idx_range = r1u64(0, 8);
vb->semantic_idx_range = r1u64(0, 1);
vb->view_rules = view_rules;
ev_block_end(out, vb);
}
////////////////////////////////
//~ rjf: "geo3d"
EV_VIEW_RULE_BLOCK_PROD_FUNCTION_DEF(geo3d)
{
EV_Block *vb = ev_block_begin(arena, EV_BlockKind_Canvas, key, ev_key_make(ev_hash_from_key(key), 1), depth);
vb->string = string;
vb->expr = expr;
vb->visual_idx_range = r1u64(0, 16);
vb->semantic_idx_range = r1u64(0, 1);
vb->view_rules = view_rules;
ev_block_end(out, vb);
}
-190
View File
@@ -1,190 +0,0 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef DBG_FRONTEND_VIEWS_H
#define DBG_FRONTEND_VIEWS_H
////////////////////////////////
//~ rjf: Code View Types
typedef U32 DF_CodeViewFlags;
enum
{
DF_CodeViewFlag_StickToBottom = (1<<0),
};
typedef U32 DF_CodeViewBuildFlags;
enum
{
DF_CodeViewBuildFlag_Margins = (1<<0),
DF_CodeViewBuildFlag_All = 0xffffffff,
};
typedef struct DF_CodeViewState DF_CodeViewState;
struct DF_CodeViewState
{
// rjf: stable state
B32 initialized;
S64 preferred_column;
B32 drifted_for_search;
DF_CodeViewFlags flags;
// rjf: per-frame command info
S64 goto_line_num;
B32 center_cursor;
B32 contain_cursor;
B32 watch_expr_at_mouse;
Arena *find_text_arena;
String8 find_text_fwd;
String8 find_text_bwd;
};
typedef struct DF_CodeViewBuildResult DF_CodeViewBuildResult;
struct DF_CodeViewBuildResult
{
DI_KeyList dbgi_keys;
};
////////////////////////////////
//~ rjf: Watch View Types
typedef enum DF_WatchViewColumnKind
{
DF_WatchViewColumnKind_Expr,
DF_WatchViewColumnKind_Value,
DF_WatchViewColumnKind_Type,
DF_WatchViewColumnKind_ViewRule,
DF_WatchViewColumnKind_Module,
DF_WatchViewColumnKind_FrameSelection,
DF_WatchViewColumnKind_Member,
DF_WatchViewColumnKind_COUNT
}
DF_WatchViewColumnKind;
typedef struct DF_WatchViewColumnParams DF_WatchViewColumnParams;
struct DF_WatchViewColumnParams
{
String8 string;
String8 display_string;
String8 view_rule;
B32 is_non_code;
B32 dequote_string;
};
typedef struct DF_WatchViewColumn DF_WatchViewColumn;
struct DF_WatchViewColumn
{
DF_WatchViewColumn *next;
DF_WatchViewColumn *prev;
DF_WatchViewColumnKind kind;
F32 pct;
U8 string_buffer[1024];
U64 string_size;
U8 display_string_buffer[1024];
U64 display_string_size;
U8 view_rule_buffer[1024];
U64 view_rule_size;
B32 is_non_code;
B32 dequote_string;
};
typedef enum DF_WatchViewFillKind
{
DF_WatchViewFillKind_Watch,
DF_WatchViewFillKind_Breakpoints,
DF_WatchViewFillKind_WatchPins,
DF_WatchViewFillKind_CallStack,
DF_WatchViewFillKind_Registers,
DF_WatchViewFillKind_Locals,
DF_WatchViewFillKind_Globals,
DF_WatchViewFillKind_ThreadLocals,
DF_WatchViewFillKind_Types,
DF_WatchViewFillKind_Procedures,
DF_WatchViewFillKind_COUNT
}
DF_WatchViewFillKind;
typedef struct DF_WatchViewPoint DF_WatchViewPoint;
struct DF_WatchViewPoint
{
S64 x;
EV_Key parent_key;
EV_Key key;
};
typedef struct DF_WatchViewTextEditState DF_WatchViewTextEditState;
struct DF_WatchViewTextEditState
{
DF_WatchViewTextEditState *pt_hash_next;
DF_WatchViewPoint pt;
TxtPt cursor;
TxtPt mark;
U8 input_buffer[1024];
U64 input_size;
U8 initial_buffer[1024];
U64 initial_size;
};
typedef struct DF_WatchViewState DF_WatchViewState;
struct DF_WatchViewState
{
B32 initialized;
// rjf: fill kinds (way that the contents of the watch view are computed)
DF_WatchViewFillKind fill_kind;
// rjf: column state
Arena *column_arena;
DF_WatchViewColumn *first_column;
DF_WatchViewColumn *last_column;
DF_WatchViewColumn *free_column;
U64 column_count;
// rjf; table cursor state
DF_WatchViewPoint cursor;
DF_WatchViewPoint mark;
DF_WatchViewPoint next_cursor;
DF_WatchViewPoint next_mark;
// rjf: text input state
Arena *text_edit_arena;
U64 text_edit_state_slots_count;
DF_WatchViewTextEditState dummy_text_edit_state;
DF_WatchViewTextEditState **text_edit_state_slots;
B32 text_editing;
};
////////////////////////////////
//~ rjf: Code View Functions
internal void df_code_view_init(DF_CodeViewState *cv, DF_View *view);
internal void df_code_view_cmds(DF_View *view, DF_CodeViewState *cv, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key);
internal DF_CodeViewBuildResult df_code_view_build(Arena *arena, DF_View *view, DF_CodeViewState *cv, DF_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key);
////////////////////////////////
//~ rjf: Watch View Functions
//- rjf: index -> column
internal DF_WatchViewColumn *df_watch_view_column_from_x(DF_WatchViewState *wv, S64 index);
//- rjf: watch view points <-> table coordinates
internal B32 df_watch_view_point_match(DF_WatchViewPoint a, DF_WatchViewPoint b);
internal DF_WatchViewPoint df_watch_view_point_from_tbl(EV_BlockList *blocks, Vec2S64 tbl);
internal Vec2S64 df_tbl_from_watch_view_point(EV_BlockList *blocks, DF_WatchViewPoint pt);
//- rjf: table coordinates -> strings
internal String8 df_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, DF_WatchViewColumn *col, B32 editable, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px);
//- rjf: table coordinates -> text edit state
internal DF_WatchViewTextEditState *df_watch_view_text_edit_state_from_pt(DF_WatchViewState *wv, DF_WatchViewPoint pt);
//- rjf: watch view column state mutation
internal DF_WatchViewColumn *df_watch_view_column_alloc_(DF_WatchViewState *wv, DF_WatchViewColumnKind kind, F32 pct, DF_WatchViewColumnParams *params);
#define df_watch_view_column_alloc(wv, kind, pct, ...) df_watch_view_column_alloc_((wv), (kind), (pct), &(DF_WatchViewColumnParams){.string = str8_zero(), __VA_ARGS__})
internal void df_watch_view_column_release(DF_WatchViewState *wv, DF_WatchViewColumn *col);
//- rjf: watch view main hooks
internal void df_watch_view_init(DF_WatchViewState *ewv, DF_View *view, DF_WatchViewFillKind fill_kind);
internal void df_watch_view_build(DF_View *view, DF_WatchViewState *ewv, B32 modifiable, U32 default_radix, Rng2F32 rect);
#endif // DBG_FRONTEND_VIEWS_H
-122
View File
@@ -1,122 +0,0 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef DBG_FRONTEND_WIDGETS_H
#define DBG_FRONTEND_WIDGETS_H
////////////////////////////////
//~ rjf: Line Edit Types
typedef U32 DF_LineEditFlags;
enum
{
DF_LineEditFlag_Expander = (1<<0),
DF_LineEditFlag_ExpanderSpace = (1<<1),
DF_LineEditFlag_ExpanderPlaceholder = (1<<2),
DF_LineEditFlag_DisableEdit = (1<<3),
DF_LineEditFlag_CodeContents = (1<<4),
DF_LineEditFlag_Border = (1<<5),
DF_LineEditFlag_NoBackground = (1<<6),
DF_LineEditFlag_PreferDisplayString = (1<<7),
DF_LineEditFlag_DisplayStringIsCode = (1<<8),
};
////////////////////////////////
//~ rjf: Code Slice Types
typedef U32 DF_CodeSliceFlags;
enum
{
DF_CodeSliceFlag_Clickable = (1<<0),
DF_CodeSliceFlag_PriorityMargin = (1<<1),
DF_CodeSliceFlag_CatchallMargin = (1<<2),
DF_CodeSliceFlag_LineNums = (1<<3),
};
typedef struct DF_CodeSliceParams DF_CodeSliceParams;
struct DF_CodeSliceParams
{
// rjf: content
DF_CodeSliceFlags flags;
Rng1S64 line_num_range;
String8 *line_text;
Rng1U64 *line_ranges;
TXT_TokenArray *line_tokens;
DF_EntityList *line_bps;
CTRL_EntityList *line_ips;
DF_EntityList *line_pins;
U64 *line_vaddrs;
D_LineList *line_infos;
DI_KeyList relevant_dbgi_keys;
// rjf: visual parameters
FNT_Tag font;
F32 font_size;
F32 tab_size;
String8 search_query;
F32 line_height_px;
F32 priority_margin_width_px;
F32 catchall_margin_width_px;
F32 line_num_width_px;
F32 line_text_max_width_px;
F32 margin_float_off_px;
};
typedef struct DF_CodeSliceSignal DF_CodeSliceSignal;
struct DF_CodeSliceSignal
{
UI_Signal base;
TxtPt mouse_pt;
TxtRng mouse_expr_rng;
};
////////////////////////////////
//~ rjf: UI Building Helpers
#define DF_Palette(code) UI_Palette(df_palette_from_code(code))
#define DF_Font(slot) UI_Font(df_font_from_slot(slot)) UI_TextRasterFlags(df_raster_flags_from_slot((slot)))
////////////////////////////////
//~ rjf: UI Widgets: Loading Overlay
internal void df_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U64 progress_v_target);
////////////////////////////////
//~ rjf: UI Widgets: Fancy Buttons
internal void df_cmd_binding_buttons(String8 name);
internal UI_Signal df_menu_bar_button(String8 string);
internal UI_Signal df_cmd_spec_button(String8 name);
internal void df_cmd_list_menu_buttons(U64 count, String8 *cmd_names, U32 *fastpath_codepoints);
internal UI_Signal df_icon_button(DF_IconKind kind, FuzzyMatchRangeList *matches, String8 string);
internal UI_Signal df_icon_buttonf(DF_IconKind kind, FuzzyMatchRangeList *matches, char *fmt, ...);
internal void df_entity_tooltips(DF_Entity *entity);
internal UI_Signal df_entity_desc_button(DF_Entity *entity, FuzzyMatchRangeList *name_matches, String8 fuzzy_query, B32 is_implicit);
internal void df_src_loc_button(String8 file_path, TxtPt point);
////////////////////////////////
//~ rjf: UI Widgets: Text View
internal UI_BOX_CUSTOM_DRAW(df_thread_box_draw_extensions);
internal UI_BOX_CUSTOM_DRAW(df_bp_box_draw_extensions);
internal DF_CodeSliceSignal df_code_slice(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string);
internal DF_CodeSliceSignal df_code_slicef(DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...);
internal B32 df_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column);
////////////////////////////////
//~ rjf: UI Widgets: Fancy Labels
internal UI_Signal df_label(String8 string);
internal UI_Signal df_error_label(String8 string);
internal B32 df_help_label(String8 string);
internal DR_FancyStringList df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string);
internal UI_Box *df_code_label(F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string);
////////////////////////////////
//~ rjf: UI Widgets: Line Edit
internal UI_Signal df_line_edit(DF_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, String8 string);
internal UI_Signal df_line_editf(DF_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, char *fmt, ...);
#endif // DBG_FRONTEND_WIDGETS_H
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -4,17 +4,17 @@
////////////////////////////////
//~ rjf: Embedded Data
@embed_file df_g_icon_font_bytes: "../data/icons.ttf"
@embed_file df_g_default_main_font_bytes: "../data/Roboto-Regular.ttf"
@embed_file df_g_default_code_font_bytes: "../data/liberation-mono.ttf"
//@embed_file df_g_default_code_font_bytes: "../data/Inconsolata-Regular.ttf"
@embed_file df_g_icon_file_bytes: "../data/logo.ico"
@embed_file rd_icon_font_bytes: "../data/icons.ttf"
@embed_file rd_default_main_font_bytes: "../data/Roboto-Regular.ttf"
@embed_file rd_default_code_font_bytes: "../data/liberation-mono.ttf"
//@embed_file rd_default_code_font_bytes: "../data/Inconsolata-Regular.ttf"
@embed_file rd_icon_file_bytes: "../data/logo.ico"
////////////////////////////////
//~ rjf: Config Sources
@table(string, name, load_cmd, write_cmd, apply_cmd)
DF_CfgSrcTable:
RD_CfgSrcTable:
{
{"user" User OpenUser WriteUserData ApplyUserData }
{"project" Project OpenProject WriteProjectData ApplyProjectData }
@@ -22,30 +22,30 @@ DF_CfgSrcTable:
{"transient" Transient Null Null Null }
}
@enum DF_CfgSrc:
@enum RD_CfgSrc:
{
@expand(DF_CfgSrcTable a) `$(a.name)`,
@expand(RD_CfgSrcTable a) `$(a.name)`,
COUNT,
}
@data(String8) d_cfg_src_string_table:
@data(String8) rd_cfg_src_string_table:
{
@expand(DF_CfgSrcTable a) `str8_lit_comp("$(a.string)")`,
@expand(RD_CfgSrcTable a) `str8_lit_comp("$(a.string)")`,
}
@data(DF_CmdKind) d_cfg_src_load_cmd_kind_table:
@data(RD_CmdKind) rd_cfg_src_load_cmd_kind_table:
{
@expand(DF_CfgSrcTable a) `DF_CmdKind_$(a.load_cmd)`,
@expand(RD_CfgSrcTable a) `RD_CmdKind_$(a.load_cmd)`,
}
@data(DF_CmdKind) d_cfg_src_write_cmd_kind_table:
@data(RD_CmdKind) rd_cfg_src_write_cmd_kind_table:
{
@expand(DF_CfgSrcTable a) `DF_CmdKind_$(a.write_cmd)`,
@expand(RD_CfgSrcTable a) `RD_CmdKind_$(a.write_cmd)`,
}
@data(DF_CmdKind) d_cfg_src_apply_cmd_kind_table:
@data(RD_CmdKind) rd_cfg_src_apply_cmd_kind_table:
{
@expand(DF_CfgSrcTable a) `DF_CmdKind_$(a.apply_cmd)`;
@expand(RD_CfgSrcTable a) `RD_CmdKind_$(a.apply_cmd)`;
}
////////////////////////////////
@@ -58,7 +58,7 @@ DF_CfgSrcTable:
// operations________ names lt sz
// /..................\ /...\ | |
// dl fz ed rn en cn dp nc np ul iz
DF_EntityKindTable:
RD_EntityKindTable:
{
{Nil nil nils 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Nil" }
{Root root roots 0 0 0 0 0 0 0 0 0 0 0 "Label" Null "Root" }
@@ -120,55 +120,55 @@ DF_EntityKindTable:
{ConversionFail conversion_fail conversion_fails 0 0 0 1 0 0 0 0 0 0 0 "Label" Null "Conversion Failure" }
}
@enum DF_EntityKind:
@enum RD_EntityKind:
{
@expand(DF_EntityKindTable a) `$(a.name)`,
@expand(RD_EntityKindTable a) `$(a.name)`,
COUNT,
}
@data(String8) d_entity_kind_display_string_table:
{
@expand(DF_EntityKindTable a) `str8_lit_comp("$(a.display_string)")`,
@expand(RD_EntityKindTable a) `str8_lit_comp("$(a.display_string)")`,
}
@data(String8) d_entity_kind_name_lower_table:
{
@expand(DF_EntityKindTable a) `str8_lit_comp("$(a.name_lower)")`,
@expand(RD_EntityKindTable a) `str8_lit_comp("$(a.name_lower)")`,
}
@data(String8) d_entity_kind_name_lower_plural_table:
{
@expand(DF_EntityKindTable a) `str8_lit_comp("$(a.name_lower_plural)")`,
@expand(RD_EntityKindTable a) `str8_lit_comp("$(a.name_lower_plural)")`,
}
@data(String8) d_entity_kind_name_label_table:
{
@expand(DF_EntityKindTable a) `str8_lit_comp("$(a.name_label)")`,
@expand(RD_EntityKindTable a) `str8_lit_comp("$(a.name_label)")`,
}
@data(DF_EntityKindFlags) d_entity_kind_flags_table:
@data(RD_EntityKindFlags) rd_entity_kind_flags_table:
{
@expand(DF_EntityKindTable a) `($(a.op_delete)*DF_EntityKindFlag_CanDelete) | ($(a.op_freeze)*DF_EntityKindFlag_CanFreeze) | ($(a.op_edit)*DF_EntityKindFlag_CanEdit) | ($(a.op_rename)*DF_EntityKindFlag_CanRename) | ($(a.op_enable)*DF_EntityKindFlag_CanEnable) | ($(a.op_cond)*DF_EntityKindFlag_CanCondition) | ($(a.op_dup)*DF_EntityKindFlag_CanDuplicate) | ($(a.name_is_code)*DF_EntityKindFlag_NameIsCode) | ($(a.name_is_path)*DF_EntityKindFlag_NameIsPath) | ($(a.user_lifetime)*DF_EntityKindFlag_UserDefinedLifetime) | ($(a.is_serialized)*DF_EntityKindFlag_IsSerializedToConfig)`,
@expand(RD_EntityKindTable a) `($(a.op_delete)*RD_EntityKindFlag_CanDelete) | ($(a.op_freeze)*RD_EntityKindFlag_CanFreeze) | ($(a.op_edit)*RD_EntityKindFlag_CanEdit) | ($(a.op_rename)*RD_EntityKindFlag_CanRename) | ($(a.op_enable)*RD_EntityKindFlag_CanEnable) | ($(a.op_cond)*RD_EntityKindFlag_CanCondition) | ($(a.op_dup)*RD_EntityKindFlag_CanDuplicate) | ($(a.name_is_code)*RD_EntityKindFlag_NameIsCode) | ($(a.name_is_path)*RD_EntityKindFlag_NameIsPath) | ($(a.user_lifetime)*RD_EntityKindFlag_UserDefinedLifetime) | ($(a.is_serialized)*RD_EntityKindFlag_IsSerializedToConfig)`,
}
////////////////////////////////
//~ rjf: Registers Type Table
@table(c_type name_lower name)
DF_RegTable:
RD_RegTable:
{
// rjf: entity slots
{CTRL_Handle machine Machine }
{CTRL_Handle module Module }
{CTRL_Handle process Process }
{CTRL_Handle thread Thread }
{D_Handle window Window }
{D_Handle panel Panel }
{D_Handle view View }
{D_Handle prev_view PrevView }
{D_Handle dst_panel DstPanel }
{D_Handle entity Entity }
{D_HandleList entity_list EntityList }
{RD_Handle window Window }
{RD_Handle panel Panel }
{RD_Handle view View }
{RD_Handle prev_view PrevView }
{RD_Handle dst_panel DstPanel }
{RD_Handle entity Entity }
{RD_HandleList entity_list EntityList }
// rjf: frame selection
{U64 unwind_count UnwindCount }
@@ -197,28 +197,28 @@ DF_RegTable:
{`OS_Event *` os_event OSEvent }
}
@enum DF_RegSlot:
@enum RD_RegSlot:
{
Null,
@expand(DF_RegTable a) `$(a.name)`,
@expand(RD_RegTable a) `$(a.name)`,
COUNT,
}
@struct DF_Regs:
@struct RD_Regs:
{
@expand(DF_RegTable a) `$(a.c_type) $(a.name_lower)`
@expand(RD_RegTable a) `$(a.c_type) $(a.name_lower)`
}
@data(Rng1U64) df_reg_slot_range_table:
@data(Rng1U64) rd_reg_slot_range_table:
{
`{0}`,
@expand(DF_RegTable a) `{OffsetOf(DF_Regs, $(a.name_lower)), OffsetOf(DF_Regs, $(a.name_lower)) + sizeof($(a.c_type))}`
@expand(RD_RegTable a) `{OffsetOf(RD_Regs, $(a.name_lower)), OffsetOf(RD_Regs, $(a.name_lower)) + sizeof($(a.c_type))}`
}
@gen
{
`#define df_regs_lit_init_top \\`
@expand(DF_RegTable a) `.$(a.name_lower) = df_regs()->$(a.name_lower),\\`
`#define rd_regs_lit_init_top \\`
@expand(RD_RegTable a) `.$(a.name_lower) = rd_regs()->$(a.name_lower),\\`
``;
}
@@ -228,7 +228,7 @@ DF_RegTable:
@table(name ui_vis ipc_docs_vis q_slot q_view q_ent_kind q_allow_files q_allow_folders q_keep_oi q_select_oi q_is_code q_required canonical_icon string display_name desc search_tags )
// / | | | \___ _____________________________________/ | | | | |
// / | | | \ / | | | | |
DF_CmdTable: // | | | | | | | | | |
RD_CmdTable: // | | | | | | | | | |
{
//- rjf: exiting
{Exit 1 1 Null null Nil 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" }
@@ -500,47 +500,47 @@ DF_CmdTable: // | | | |
{LogMarker 1 1 Null null Nil 0 0 0 0 0 0 Null "log_marker" "Log Marker" "Logs a marker in the application log, to denote specific points in time within the log." "" }
}
@enum DF_CmdKind:
@enum RD_CmdKind:
{
`Null`,
@expand(D_CmdTable a) `$(a.name)`,
@expand(DF_CmdTable, a) `$(a.name)`,
@expand(RD_CmdTable, a) `$(a.name)`,
COUNT,
}
@struct DF_Query:
@struct RD_Query:
{
`DF_QueryFlags flags`;
`DF_RegSlot slot`;
`RD_QueryFlags flags`;
`RD_RegSlot slot`;
`String8 view_name`;
`DF_EntityKind entity_kind`;
`RD_EntityKind entity_kind`;
}
@struct DF_CmdKindInfo:
@struct RD_CmdKindInfo:
{
`String8 string`;
`String8 description`;
`String8 search_tags`;
`String8 display_name`;
`DF_IconKind icon_kind`;
`DF_CmdKindFlags flags`;
`DF_Query query`;
`RD_IconKind icon_kind`;
`RD_CmdKindFlags flags`;
`RD_Query query`;
};
@data(DF_CmdKindInfo) @c_file df_cmd_kind_info_table:
@data(RD_CmdKindInfo) @c_file rd_cmd_kind_info_table:
{
`{0}`,
@expand(D_CmdTable, a)
```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.display_name)"), DF_IconKind_$(a.canonical_icon), (DF_CmdKindFlag_ListInUI*$(a.ui_vis))|(DF_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis)), {(DF_QueryFlag_AllowFiles*$(a.q_allow_files))|(DF_QueryFlag_AllowFolders*$(a.q_allow_folders))|(DF_QueryFlag_CodeInput*$(a.q_is_code))|(DF_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(DF_QueryFlag_SelectOldInput*$(a.q_select_oi))|(DF_QueryFlag_Required*$(a.q_required)), DF_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), DF_EntityKind_$(a.q_ent_kind)}}```;
@expand(DF_CmdTable, a)
```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.display_name)"), DF_IconKind_$(a.canonical_icon), (DF_CmdKindFlag_ListInUI*$(a.ui_vis))|(DF_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis)), {(DF_QueryFlag_AllowFiles*$(a.q_allow_files))|(DF_QueryFlag_AllowFolders*$(a.q_allow_folders))|(DF_QueryFlag_CodeInput*$(a.q_is_code))|(DF_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(DF_QueryFlag_SelectOldInput*$(a.q_select_oi))|(DF_QueryFlag_Required*$(a.q_required)), DF_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), DF_EntityKind_$(a.q_ent_kind)}}```;
```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.display_name)"), RD_IconKind_$(a.canonical_icon), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), RD_EntityKind_$(a.q_ent_kind)}}```;
@expand(RD_CmdTable, a)
```{ str8_lit_comp("$(a.string)"), str8_lit_comp("$(a.desc)"), str8_lit_comp("$(a.search_tags)"), str8_lit_comp("$(a.display_name)"), RD_IconKind_$(a.canonical_icon), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp("$(a.q_view != 'null' -> a.q_view)"), RD_EntityKind_$(a.q_ent_kind)}}```;
}
////////////////////////////////
//~ rjf: Default Bindings
@table(name key ctrl shift alt)
DF_DefaultBindingTable:
RD_DefaultBindingTable:
{
//- rjf: low-level target control operations
{ "kill_all" F5 0 shift 0 }
@@ -703,16 +703,16 @@ DF_DefaultBindingTable:
{ "log_marker" M ctrl shift alt }
}
@data(DF_StringBindingPair) df_g_default_binding_table:
@data(RD_StringBindingPair) rd_default_binding_table:
{
@expand(DF_DefaultBindingTable a) ```{str8_lit_comp("$(a.name)"), {OS_Key_$(a.key), 0 $(a.ctrl != 0 -> `|OS_EventFlag_Ctrl`) $(a.shift != 0 -> `|OS_EventFlag_Shift`) $(a.alt != 0 -> `|OS_EventFlag_Alt`)}}```;
@expand(RD_DefaultBindingTable a) ```{str8_lit_comp("$(a.name)"), {OS_Key_$(a.key), 0 $(a.ctrl != 0 -> `|OS_EventFlag_Ctrl`) $(a.shift != 0 -> `|OS_EventFlag_Shift`) $(a.alt != 0 -> `|OS_EventFlag_Alt`)}}```;
}
////////////////////////////////
//~ rjf: Binding Version Remap Table
@table(old_name new_name)
DF_BindingVersionRemapTable:
RD_BindingVersionRemapTable:
{
{"commands" "run_command"}
{"load_user" "open_user"}
@@ -723,21 +723,21 @@ DF_BindingVersionRemapTable:
{"function_breakpoint" "add_function_breakpoint"}
}
@data(String8) df_g_binding_version_remap_old_name_table:
@data(String8) rd_binding_version_remap_old_name_table:
{
@expand(DF_BindingVersionRemapTable a) `str8_lit_comp("$(a.old_name)")`
@expand(RD_BindingVersionRemapTable a) `str8_lit_comp("$(a.old_name)")`
}
@data(String8) df_g_binding_version_remap_new_name_table:
@data(String8) rd_binding_version_remap_new_name_table:
{
@expand(DF_BindingVersionRemapTable a) `str8_lit_comp("$(a.new_name)")`
@expand(RD_BindingVersionRemapTable a) `str8_lit_comp("$(a.new_name)")`
}
////////////////////////////////
//~ rjf: Icons
@table(name, text)
DF_IconTable:
RD_IconTable:
{
(Null "")
(FolderOpenOutline "b")
@@ -810,22 +810,22 @@ DF_IconTable:
(Dot "c")
}
@enum DF_IconKind:
@enum RD_IconKind:
{
@expand(DF_IconTable a) `$(a.name)`,
@expand(RD_IconTable a) `$(a.name)`,
COUNT,
}
@data(String8) df_g_icon_kind_text_table:
@data(String8) rd_icon_kind_text_table:
{
@expand(DF_IconTable a) `str8_lit_comp("$(a.text)")`;
@expand(RD_IconTable a) `str8_lit_comp("$(a.text)")`;
}
////////////////////////////////
//~ rjf: Built-In View Rules
@table(name name_lower display_name params_schema icon can_filter filter_is_code typing_automatically_filters show_in_docs description)
DF_ViewRuleTable:
RD_ViewRuleTable:
{
//- rjf: basics
{ Empty empty "" "" Null 0 0 0 0 "" }
@@ -876,34 +876,34 @@ DF_ViewRuleTable:
{ Geo3D geo3d "Geometry (3D)" "x:{'count':expr, 'vtx':expr, 'vtx_size':expr}" Binoculars 0 0 0 1 "Visualizes memory as 3D geometry." }
}
@enum DF_ViewRuleKind:
@enum RD_ViewRuleKind:
{
Null,
@expand(DF_ViewRuleTable a) `$(a.name)`,
@expand(RD_ViewRuleTable a) `$(a.name)`,
COUNT
}
@struct DF_ViewRuleInfo:
@struct RD_ViewRuleInfo:
{
`String8 string`;
`String8 description`;
`String8 display_name`;
`String8 params_schema`;
`DF_IconKind icon_kind`;
`DF_ViewRuleInfoFlags flags`;
`DF_ViewRuleUIFunctionType *ui`;
`RD_IconKind icon_kind`;
`RD_ViewRuleInfoFlags flags`;
`RD_ViewRuleUIFunctionType *ui`;
};
/*
@gen
{
@expand(DF_ViewRuleTable a) `DF_VIEW_RULE_UI_FUNCTION_DEF($(a.name_lower));`
@expand(RD_ViewRuleTable a) `RD_VIEW_RULE_UI_FUNCTION_DEF($(a.name_lower));`
}
@data(DF_ViewRuleInfo) df_view_rule_kind_info_table:
@data(RD_ViewRuleInfo) rd_view_rule_kind_info_table:
{
`{0}`,
@expand(DF_ViewRuleTable a) `{str8_lit_comp("$(a.name_lower)"), str8_lit_comp("$(a.description)"), str8_lit_comp("$(a.display_name)"), str8_lit_comp("$(a.params_schema)"), DF_IconKind_$(a.icon), (DF_ViewRuleInfoFlag_ShowInDocs*$(a.show_in_docs)|DF_ViewRuleInfoFlag_CanFilter*$(a.can_filter)|DF_ViewRuleInfoFlag_FilterIsCode*$(a.filter_is_code)|DF_ViewRuleInfoFlag_TypingAutomaticallyFilters*$(a.typing_automatically_filters)), DF_VIEW_RULE_UI_FUNCTION_NAME($(a.name_lower))}`,
@expand(RD_ViewRuleTable a) `{str8_lit_comp("$(a.name_lower)"), str8_lit_comp("$(a.description)"), str8_lit_comp("$(a.display_name)"), str8_lit_comp("$(a.params_schema)"), RD_IconKind_$(a.icon), (RD_ViewRuleInfoFlag_ShowInDocs*$(a.show_in_docs)|RD_ViewRuleInfoFlag_CanFilter*$(a.can_filter)|RD_ViewRuleInfoFlag_FilterIsCode*$(a.filter_is_code)|RD_ViewRuleInfoFlag_TypingAutomaticallyFilters*$(a.typing_automatically_filters)), RD_VIEW_RULE_UI_FUNCTION_NAME($(a.name_lower))}`,
}
*/
@@ -911,7 +911,7 @@ DF_ViewRuleTable:
//~ rjf: Gfx Layer View Kinds
@table(name name_lower display_string icon parameterized_by_entity project_specific can_serialize can_filter filter_is_code typing_automatically_filters inc_in_docs docs_desc)
DF_ViewTable:
RD_ViewTable:
{
//- rjf: basics
{ Null "null" "" Null 0 0 0 0 0 0 0 "" }
@@ -964,35 +964,35 @@ DF_ViewTable:
{ Settings "settings" "Settings" Gear 0 0 1 1 0 1 1 "An interface to modify general settings for the debugger's appearance and behavior." }
}
@enum DF_ViewKind:
@enum RD_ViewKind:
{
@expand(DF_ViewTable a) `$(a.name)`,
@expand(RD_ViewTable a) `$(a.name)`,
COUNT,
}
@gen
{
@expand(DF_ViewTable a) `DF_VIEW_SETUP_FUNCTION_DEF($(a.name_lower));`;
@expand(DF_ViewTable a) `DF_VIEW_CMD_FUNCTION_DEF($(a.name_lower));`;
@expand(DF_ViewTable a) `DF_VIEW_UI_FUNCTION_DEF($(a.name_lower));`;
@expand(RD_ViewTable a) `RD_VIEW_SETUP_FUNCTION_DEF($(a.name_lower));`;
@expand(RD_ViewTable a) `RD_VIEW_CMD_FUNCTION_DEF($(a.name_lower));`;
@expand(RD_ViewTable a) `RD_VIEW_UI_FUNCTION_DEF($(a.name_lower));`;
}
@data(String8) df_view_kind_name_lower_table:
@data(String8) rd_view_kind_name_lower_table:
{
@expand(DF_ViewTable a) `str8_lit_comp("$(a.name_lower)")`
@expand(RD_ViewTable a) `str8_lit_comp("$(a.name_lower)")`
}
@data(DF_ViewSpecInfo) df_g_gfx_view_kind_spec_info_table:
@data(RD_ViewSpecInfo) rd_gfx_view_kind_spec_info_table:
{
@expand(DF_ViewTable a) ```{(0|$(a.parameterized_by_entity)*DF_ViewSpecFlag_ParameterizedByEntity|$(a.project_specific)*DF_ViewSpecFlag_ProjectSpecific|$(a.can_serialize)*DF_ViewSpecFlag_CanSerialize|$(a.can_filter)*DF_ViewSpecFlag_CanFilter|$(a.filter_is_code)*DF_ViewSpecFlag_FilterIsCode|$(a.typing_automatically_filters)*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("$(a.name_lower)"), str8_lit_comp("$(a.display_string)"), DF_IconKind_$(a.icon), DF_VIEW_SETUP_FUNCTION_NAME($(a.name_lower)), DF_VIEW_CMD_FUNCTION_NAME($(a.name_lower)), DF_VIEW_UI_FUNCTION_NAME($(a.name_lower))}```;
@expand(RD_ViewTable a) ```{(0|$(a.parameterized_by_entity)*RD_ViewSpecFlag_ParameterizedByEntity|$(a.project_specific)*RD_ViewSpecFlag_ProjectSpecific|$(a.can_serialize)*RD_ViewSpecFlag_CanSerialize|$(a.can_filter)*RD_ViewSpecFlag_CanFilter|$(a.filter_is_code)*RD_ViewSpecFlag_FilterIsCode|$(a.typing_automatically_filters)*RD_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("$(a.name_lower)"), str8_lit_comp("$(a.display_string)"), RD_IconKind_$(a.icon), RD_VIEW_SETUP_FUNCTION_NAME($(a.name_lower)), RD_VIEW_CMD_FUNCTION_NAME($(a.name_lower)), RD_VIEW_UI_FUNCTION_NAME($(a.name_lower))}```;
}
////////////////////////////////
//~ rjf: Built-In Debug Engine Kind -> Icon Kind Table
@data(DF_IconKind) df_entity_kind_icon_kind_table:
@data(RD_IconKind) rd_entity_kind_icon_kind_table:
{
@expand(DF_EntityKindTable a) `DF_IconKind_$(a.icon_kind)`,
@expand(RD_EntityKindTable a) `RD_IconKind_$(a.icon_kind)`,
}
////////////////////////////////
@@ -1001,7 +1001,7 @@ DF_ViewTable:
// NOTE(rjf): see @view_rule_info
@table(string vr ls ru vu)
DF_ViewRuleTable:
RD_ViewRuleTable:
{
{"array" - - - - }
{"list" x - - - }
@@ -1024,27 +1024,25 @@ DF_ViewRuleTable:
@gen
{
``;
@expand(DF_ViewRuleTable a)
`$(a.vr == "x" -> "DF_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(" .. a.name_lower .. ");")`;
@expand(DF_ViewRuleTable a)
`$(a.ls == "x" -> "DF_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(" .. a.name_lower .. ");")`;
@expand(DF_ViewRuleTable a)
`$(a.ru == "x" -> "DF_VIEW_RULE_ROW_UI_FUNCTION_DEF(" .. a.name_lower .. ");")`;
@expand(DF_ViewRuleTable a)
`$(a.bu == "x" -> "DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(" .. a.name_lower .. ");")`;
@expand(RD_ViewRuleTable a)
`$(a.vr == "x" -> "RD_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_DEF(" .. a.name_lower .. ");")`;
@expand(RD_ViewRuleTable a)
`$(a.ls == "x" -> "RD_VIEW_RULE_LINE_STRINGIZE_FUNCTION_DEF(" .. a.name_lower .. ");")`;
@expand(RD_ViewRuleTable a)
`$(a.ru == "x" -> "RD_VIEW_RULE_ROW_UI_FUNCTION_DEF(" .. a.name_lower .. ");")`;
}
@data(DF_ViewRuleSpecInfo) @c_file df_g_gfx_view_rule_spec_info_table:
@data(RD_ViewRuleSpecInfo) @c_file rd_gfx_view_rule_spec_info_table:
{
@expand(DF_ViewRuleTable a)
```{ str8_lit_comp("$(a.string)"), (DF_ViewRuleSpecInfoFlag_VizRowProd*$(a.vr == "x"))|(DF_ViewRuleSpecInfoFlag_LineStringize*$(a.ls == "x"))|(DF_ViewRuleSpecInfoFlag_RowUI*$(a.ru == "x"))|(DF_ViewRuleSpecInfoFlag_ViewUI*$(a.vu == "x")), $(a.vr == "x" -> "DF_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vr != "x" -> 0), $(a.ls == "x" -> "DF_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME("..a.name_lower..")") $(a.ls != "x" -> 0), $(a.ru == "x" -> "DF_VIEW_RULE_ROW_UI_FUNCTION_NAME("..a.name_lower..")") $(a.ru != "x" -> 0) }```;
@expand(RD_ViewRuleTable a)
```{ str8_lit_comp("$(a.string)"), (RD_ViewRuleSpecInfoFlag_VizRowProd*$(a.vr == "x"))|(RD_ViewRuleSpecInfoFlag_LineStringize*$(a.ls == "x"))|(RD_ViewRuleSpecInfoFlag_RowUI*$(a.ru == "x"))|(RD_ViewRuleSpecInfoFlag_ViewUI*$(a.vu == "x")), $(a.vr == "x" -> "RD_VIEW_RULE_VIZ_ROW_PROD_FUNCTION_NAME("..a.name_lower..")") $(a.vr != "x" -> 0), $(a.ls == "x" -> "RD_VIEW_RULE_LINE_STRINGIZE_FUNCTION_NAME("..a.name_lower..")") $(a.ls != "x" -> 0), $(a.ru == "x" -> "RD_VIEW_RULE_ROW_UI_FUNCTION_NAME("..a.name_lower..")") $(a.ru != "x" -> 0) }```;
}
////////////////////////////////
//~ rjf: Theme Tables
@table(name_upper name_lower display_string)
DF_ThemePresetTable:
RD_ThemePresetTable:
{
{ DefaultDark default_dark "Default (Dark)" }
{ DefaultLight default_light "Default (Light)" }
@@ -1058,7 +1056,7 @@ DF_ThemePresetTable:
}
@table(name display_name name_lower default_dark default_light vs_dark vs_light solarized_dark solarized_light handmade_hero four_coder far_manager desc)
DF_ThemeColorTable:
RD_ThemeColorTable:
{
{Null "Null" null 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff 0xff00ffff ""}
@@ -1152,7 +1150,7 @@ DF_ThemeColorTable:
}
@table(old_name new_name)
DF_ThemeColorVersionRemapTable:
RD_ThemeColorVersionRemapTable:
{
{plain_text text}
{plain_background base_background}
@@ -1178,67 +1176,67 @@ DF_ThemeColorVersionRemapTable:
{action_background neutral_pop_button_background}
}
@enum DF_ThemeColor:
@enum RD_ThemeColor:
{
@expand(DF_ThemeColorTable a) `$(a.name)`,
@expand(RD_ThemeColorTable a) `$(a.name)`,
COUNT,
}
@enum DF_ThemePreset:
@enum RD_ThemePreset:
{
@expand(DF_ThemePresetTable a) `$(a.name)`,
@expand(RD_ThemePresetTable a) `$(a.name)`,
COUNT,
}
@data(String8) df_g_theme_preset_display_string_table:
@data(String8) rd_theme_preset_display_string_table:
{
@expand(DF_ThemePresetTable a) `str8_lit_comp("$(a.display_string)")`,
@expand(RD_ThemePresetTable a) `str8_lit_comp("$(a.display_string)")`,
}
@data(String8) df_g_theme_preset_code_string_table:
@data(String8) rd_theme_preset_code_string_table:
{
@expand(DF_ThemePresetTable a) `str8_lit_comp("$(a.name_lower)")`,
@expand(RD_ThemePresetTable a) `str8_lit_comp("$(a.name_lower)")`,
}
@data(String8) df_g_theme_color_version_remap_old_name_table:
@data(String8) rd_theme_color_version_remap_old_name_table:
{
@expand(DF_ThemeColorVersionRemapTable a) `str8_lit_comp("$(a.old_name)")`
@expand(RD_ThemeColorVersionRemapTable a) `str8_lit_comp("$(a.old_name)")`
}
@data(String8) df_g_theme_color_version_remap_new_name_table:
@data(String8) rd_theme_color_version_remap_new_name_table:
{
@expand(DF_ThemeColorVersionRemapTable a) `str8_lit_comp("$(a.new_name)")`
@expand(RD_ThemeColorVersionRemapTable a) `str8_lit_comp("$(a.new_name)")`
}
@data(Vec4F32) df_g_theme_preset_colors__default_dark: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.default_dark))`}
@data(Vec4F32) df_g_theme_preset_colors__default_light: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.default_light))`}
@data(Vec4F32) df_g_theme_preset_colors__vs_dark: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.vs_dark))`}
@data(Vec4F32) df_g_theme_preset_colors__vs_light: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.vs_light))`}
@data(Vec4F32) df_g_theme_preset_colors__solarized_dark: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.solarized_dark))`,}
@data(Vec4F32) df_g_theme_preset_colors__solarized_light:{@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.solarized_light))`,}
@data(Vec4F32) df_g_theme_preset_colors__handmade_hero: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.handmade_hero))`,}
@data(Vec4F32) df_g_theme_preset_colors__four_coder: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.four_coder))`,}
@data(Vec4F32) df_g_theme_preset_colors__far_manager: {@expand(DF_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.far_manager))`;}
@data(`Vec4F32*`) df_g_theme_preset_colors_table:
@data(Vec4F32) rd_theme_preset_colors__default_dark: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.default_dark))`}
@data(Vec4F32) rd_theme_preset_colors__default_light: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.default_light))`}
@data(Vec4F32) rd_theme_preset_colors__vs_dark: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.vs_dark))`}
@data(Vec4F32) rd_theme_preset_colors__vs_light: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.vs_light))`}
@data(Vec4F32) rd_theme_preset_colors__solarized_dark: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.solarized_dark))`,}
@data(Vec4F32) rd_theme_preset_colors__solarized_light:{@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.solarized_light))`,}
@data(Vec4F32) rd_theme_preset_colors__handmade_hero: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.handmade_hero))`,}
@data(Vec4F32) rd_theme_preset_colors__four_coder: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.four_coder))`,}
@data(Vec4F32) rd_theme_preset_colors__far_manager: {@expand(RD_ThemeColorTable a) `rgba_from_u32_lit_comp($(a.far_manager))`;}
@data(`Vec4F32*`) rd_theme_preset_colors_table:
{
@expand(DF_ThemePresetTable a) `df_g_theme_preset_colors__$(a.name_lower)`,
@expand(RD_ThemePresetTable a) `rd_theme_preset_colors__$(a.name_lower)`,
}
@data(String8) df_g_theme_color_display_string_table:
@data(String8) rd_theme_color_display_string_table:
{
@expand(DF_ThemeColorTable a) `str8_lit_comp("$(a.display_name)")`
@expand(RD_ThemeColorTable a) `str8_lit_comp("$(a.display_name)")`
}
@data(String8) df_g_theme_color_cfg_string_table:
@data(String8) rd_theme_color_cfg_string_table:
{
@expand(DF_ThemeColorTable a) `str8_lit_comp("$(a.name_lower)")`
@expand(RD_ThemeColorTable a) `str8_lit_comp("$(a.name_lower)")`
}
////////////////////////////////
//~ rjf: Settings
@table(name name_lower display_string default_per_window default_s32 s32_min s32_max)
DF_SettingTable:
RD_SettingTable:
{
{HoverAnimations hover_animations "Hover Animations" 0 1 0 1 }
{PressAnimations press_animations "Press Animations" 0 1 0 1 }
@@ -1261,35 +1259,35 @@ DF_SettingTable:
{HintCodeText hint_code_text "Hint Code Text" 1 1 0 1 }
}
@enum DF_SettingCode:
@enum RD_SettingCode:
{
@expand(DF_SettingTable a) `$(a.name)`,
@expand(RD_SettingTable a) `$(a.name)`,
COUNT
}
@data(String8) df_g_setting_code_display_string_table:
@data(String8) rd_setting_code_display_string_table:
{
@expand(DF_SettingTable a) `str8_lit_comp("$(a.display_string)")`
@expand(RD_SettingTable a) `str8_lit_comp("$(a.display_string)")`
}
@data(String8) df_g_setting_code_lower_string_table:
@data(String8) rd_setting_code_lower_string_table:
{
@expand(DF_SettingTable a) `str8_lit_comp("$(a.name_lower)")`
@expand(RD_SettingTable a) `str8_lit_comp("$(a.name_lower)")`
}
@data(B8) df_g_setting_code_default_is_per_window_table:
@data(B8) rd_setting_code_default_is_per_window_table:
{
@expand(DF_SettingTable a) `$(a.default_per_window)`
@expand(RD_SettingTable a) `$(a.default_per_window)`
}
@data(DF_SettingVal) df_g_setting_code_default_val_table:
@data(RD_SettingVal) rd_setting_code_default_val_table:
{
@expand(DF_SettingTable a) `{1, $(a.default_s32)}`
@expand(RD_SettingTable a) `{1, $(a.default_s32)}`
}
@data(Rng1S32) df_g_setting_code_s32_range_table:
@data(Rng1S32) rd_setting_code_s32_range_table:
{
@expand(DF_SettingTable a) `{$(a.s32_min), $(a.s32_max)}`
@expand(RD_SettingTable a) `{$(a.s32_min), $(a.s32_max)}`
}
////////////////////////////////
@@ -1373,7 +1371,7 @@ raddbg_readme:
@p "A list of debugger interfaces, which can occupy tabs, are below:";
@unordered_list
{
@expand(DF_ViewTable a) @p "$(a.inc_in_docs -> '`'..a.display_string..'` '..a.docs_desc)";
@expand(RD_ViewTable a) @p "$(a.inc_in_docs -> '`'..a.display_string..'` '..a.docs_desc)";
}
@subtitle "Commands";
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,7 +1,6 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef DBG_FRONTEND_VIEW_RULES_H
#define DBG_FRONTEND_VIEW_RULES_H
#endif // DBG_FRONTEND_VIEW_RULES_H
#include "raddbg_core.c"
#include "raddbg_widgets.c"
#include "raddbg_views.c"
+11
View File
@@ -0,0 +1,11 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef RADDBG_INC_H
#define RADDBG_INC_H
#include "raddbg_core.h"
#include "raddbg_widgets.h"
#include "raddbg_views.h"
#endif // RADDBG_INC_H
+31 -31
View File
@@ -50,7 +50,7 @@
// [ ] transient view timeout releasing
//
// [ ] save view column pcts; generalize to being a first-class thing in
// DF_View, e.g. by just having a string -> f32 store
// RD_View, e.g. by just having a string -> f32 store
// [ ] decay arrays to pointers in pointer/value comparison
// [ ] EVAL LOOKUP RULES -> currently going 0 -> rdis_count, but we need
// to prioritize the primary rdi
@@ -471,7 +471,7 @@
// "blocks" vs. "canvas" vs. "expansion" - etc.
// [x] @cleanup collapse DF_CfgNodes into just being MD trees, find another way
// to encode config source - don't need it at every node
// [x] @cleanup in the frontend, we are starting to have to pass down "DF_Window"
// [x] @cleanup in the frontend, we are starting to have to pass down "RD_Window"
// everywhere, because of per-window parameters (e.g. font rendering settings).
// this is really better solved by implicit thread-local parameters, similar to
// interaction registers, so that one window can "pick" all of the implicit
@@ -494,7 +494,7 @@
#define GEO_INIT_MANUAL 1
#define FNT_INIT_MANUAL 1
#define D_INIT_MANUAL 1
#define DF_INIT_MANUAL 1
#define RD_INIT_MANUAL 1
////////////////////////////////
//~ rjf: Includes
@@ -543,7 +543,7 @@
#include "draw/draw.h"
#include "ui/ui_inc.h"
#include "dbg_engine/dbg_engine_inc.h"
#include "dbg_frontend/dbg_frontend_inc.h"
#include "raddbg/raddbg_inc.h"
//- rjf: [c]
#include "base/base_inc.c"
@@ -583,7 +583,7 @@
#include "draw/draw.c"
#include "ui/ui_inc.c"
#include "dbg_engine/dbg_engine_inc.c"
#include "dbg_frontend/dbg_frontend_inc.c"
#include "raddbg/raddbg_inc.c"
////////////////////////////////
//~ rjf: Top-Level Execution Types
@@ -668,8 +668,8 @@ internal CTRL_WAKEUP_FUNCTION_DEF(wakeup_hook_ctrl)
internal B32
frame(void)
{
df_frame();
return df_state->quit;
rd_frame();
return rd_state->quit;
}
////////////////////////////////
@@ -766,7 +766,7 @@ entry_point(CmdLine *cmd_line)
geo_init();
fnt_init();
d_init();
df_init(cmd_line);
rd_init(cmd_line);
}
//- rjf: setup initial target from command line args
@@ -775,8 +775,8 @@ entry_point(CmdLine *cmd_line)
if(args.node_count > 0 && args.first->string.size != 0)
{
Temp scratch = scratch_begin(0, 0);
DF_Entity *target = df_entity_alloc(df_entity_root(), DF_EntityKind_Target);
df_entity_equip_cfg_src(target, DF_CfgSrc_CommandLine);
RD_Entity *target = rd_entity_alloc(rd_entity_root(), RD_EntityKind_Target);
rd_entity_equip_cfg_src(target, RD_CfgSrc_CommandLine);
String8List passthrough_args_list = {0};
for(String8Node *n = args.first->next; n != 0; n = n->next)
{
@@ -790,14 +790,14 @@ entry_point(CmdLine *cmd_line)
if(args.first->string.size != 0)
{
String8 exe_name = args.first->string;
DF_Entity *exe = df_entity_alloc(target, DF_EntityKind_Executable);
RD_Entity *exe = rd_entity_alloc(target, RD_EntityKind_Executable);
PathStyle style = path_style_from_str8(exe_name);
if(style == PathStyle_Relative)
{
exe_name = push_str8f(scratch.arena, "%S/%S", current_path, exe_name);
exe_name = path_normalized_from_string(scratch.arena, exe_name);
}
df_entity_equip_name(exe, exe_name);
rd_entity_equip_name(exe, exe_name);
}
// rjf: equip working directory
@@ -805,8 +805,8 @@ entry_point(CmdLine *cmd_line)
if(path_part_of_arg.size != 0)
{
String8 path = push_str8f(scratch.arena, "%S/", path_part_of_arg);
DF_Entity *wdir = df_entity_alloc(target, DF_EntityKind_WorkingDirectory);
df_entity_equip_name(wdir, path);
RD_Entity *wdir = rd_entity_alloc(target, RD_EntityKind_WorkingDirectory);
rd_entity_equip_name(wdir, path);
}
// rjf: equip args
@@ -814,8 +814,8 @@ entry_point(CmdLine *cmd_line)
String8 args_str = str8_list_join(scratch.arena, &passthrough_args_list, &join);
if(args_str.size != 0)
{
DF_Entity *args_entity = df_entity_alloc(target, DF_EntityKind_Arguments);
df_entity_equip_name(args_entity, args_str);
RD_Entity *args_entity = rd_entity_alloc(target, RD_EntityKind_Arguments);
rd_entity_equip_name(args_entity, args_str);
}
scratch_end(scratch);
}
@@ -868,8 +868,8 @@ entry_point(CmdLine *cmd_line)
if(msg.size != 0)
{
log_infof("ipc_msg: \"%S\"", msg);
DF_Window *dst_window = df_state->first_window;
for(DF_Window *window = dst_window; window != 0; window = window->next)
RD_Window *dst_window = rd_state->first_window;
for(RD_Window *window = dst_window; window != 0; window = window->next)
{
if(os_window_is_focused(window->os))
{
@@ -883,23 +883,23 @@ entry_point(CmdLine *cmd_line)
U64 first_space_pos = str8_find_needle(msg, 0, str8_lit(" "), 0);
String8 cmd_kind_name_string = str8_prefix(msg, first_space_pos);
String8 cmd_args_string = str8_skip_chop_whitespace(str8_skip(msg, first_space_pos));
DF_CmdKindInfo *cmd_kind_info = df_cmd_kind_info_from_string(cmd_kind_name_string);
if(cmd_kind_info != &df_nil_cmd_kind_info) DF_RegsScope()
RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_kind_name_string);
if(cmd_kind_info != &rd_nil_cmd_kind_info) RD_RegsScope()
{
if(dst_window != df_window_from_handle(df_regs()->window))
if(dst_window != rd_window_from_handle(rd_regs()->window))
{
df_regs()->window = df_handle_from_window(dst_window);
df_regs()->panel = df_handle_from_panel(dst_window->focused_panel);
df_regs()->view = dst_window->focused_panel->selected_tab_view;
rd_regs()->window = rd_handle_from_window(dst_window);
rd_regs()->panel = rd_handle_from_panel(dst_window->focused_panel);
rd_regs()->view = dst_window->focused_panel->selected_tab_view;
}
df_regs_fill_slot_from_string(cmd_kind_info->query.slot, cmd_args_string);
df_push_cmd(cmd_kind_name_string, df_regs());
df_request_frame();
rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, cmd_args_string);
rd_push_cmd(cmd_kind_name_string, rd_regs());
rd_request_frame();
}
else
{
log_user_errorf("\"%S\" is not a command.", cmd_kind_name_string);
df_request_frame();
rd_request_frame();
}
}
}
@@ -913,21 +913,21 @@ entry_point(CmdLine *cmd_line)
if(auto_run)
{
auto_run = 0;
df_cmd(DF_CmdKind_LaunchAndRun);
rd_cmd(RD_CmdKind_LaunchAndRun);
}
//- rjf: auto step
if(auto_step)
{
auto_step = 0;
df_cmd(DF_CmdKind_StepInto);
rd_cmd(RD_CmdKind_StepInto);
}
//- rjf: jit attach
if(jit_attach)
{
jit_attach = 0;
df_cmd(DF_CmdKind_Attach, .pid = jit_pid);
rd_cmd(RD_CmdKind_Attach, .pid = jit_pid);
}
}
}
File diff suppressed because it is too large Load Diff
+183
View File
@@ -0,0 +1,183 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef RADDBG_VIEWS_H
#define RADDBG_VIEWS_H
////////////////////////////////
//~ rjf: Code View Types
typedef U32 RD_CodeViewBuildFlags;
enum
{
RD_CodeViewBuildFlag_Margins = (1<<0),
RD_CodeViewBuildFlag_All = 0xffffffff,
};
typedef struct RD_CodeViewState RD_CodeViewState;
struct RD_CodeViewState
{
// rjf: stable state
B32 initialized;
S64 preferred_column;
B32 drifted_for_search;
// rjf: per-frame command info
S64 goto_line_num;
B32 center_cursor;
B32 contain_cursor;
B32 watch_expr_at_mouse;
Arena *find_text_arena;
String8 find_text_fwd;
String8 find_text_bwd;
};
typedef struct RD_CodeViewBuildResult RD_CodeViewBuildResult;
struct RD_CodeViewBuildResult
{
DI_KeyList dbgi_keys;
};
////////////////////////////////
//~ rjf: Watch View Types
typedef enum RD_WatchViewColumnKind
{
RD_WatchViewColumnKind_Expr,
RD_WatchViewColumnKind_Value,
RD_WatchViewColumnKind_Type,
RD_WatchViewColumnKind_ViewRule,
RD_WatchViewColumnKind_Module,
RD_WatchViewColumnKind_FrameSelection,
RD_WatchViewColumnKind_Member,
RD_WatchViewColumnKind_COUNT
}
RD_WatchViewColumnKind;
typedef struct RD_WatchViewColumnParams RD_WatchViewColumnParams;
struct RD_WatchViewColumnParams
{
String8 string;
String8 display_string;
String8 view_rule;
B32 is_non_code;
B32 dequote_string;
};
typedef struct RD_WatchViewColumn RD_WatchViewColumn;
struct RD_WatchViewColumn
{
RD_WatchViewColumn *next;
RD_WatchViewColumn *prev;
RD_WatchViewColumnKind kind;
F32 pct;
U8 string_buffer[1024];
U64 string_size;
U8 display_string_buffer[1024];
U64 display_string_size;
U8 view_rule_buffer[1024];
U64 view_rule_size;
B32 is_non_code;
B32 dequote_string;
};
typedef enum RD_WatchViewFillKind
{
RD_WatchViewFillKind_Watch,
RD_WatchViewFillKind_Breakpoints,
RD_WatchViewFillKind_WatchPins,
RD_WatchViewFillKind_CallStack,
RD_WatchViewFillKind_Registers,
RD_WatchViewFillKind_Locals,
RD_WatchViewFillKind_Globals,
RD_WatchViewFillKind_ThreadLocals,
RD_WatchViewFillKind_Types,
RD_WatchViewFillKind_Procedures,
RD_WatchViewFillKind_COUNT
}
RD_WatchViewFillKind;
typedef struct RD_WatchViewPoint RD_WatchViewPoint;
struct RD_WatchViewPoint
{
S64 x;
EV_Key parent_key;
EV_Key key;
};
typedef struct RD_WatchViewTextEditState RD_WatchViewTextEditState;
struct RD_WatchViewTextEditState
{
RD_WatchViewTextEditState *pt_hash_next;
RD_WatchViewPoint pt;
TxtPt cursor;
TxtPt mark;
U8 input_buffer[1024];
U64 input_size;
U8 initial_buffer[1024];
U64 initial_size;
};
typedef struct RD_WatchViewState RD_WatchViewState;
struct RD_WatchViewState
{
B32 initialized;
// rjf: fill kinds (way that the contents of the watch view are computed)
RD_WatchViewFillKind fill_kind;
// rjf: column state
Arena *column_arena;
RD_WatchViewColumn *first_column;
RD_WatchViewColumn *last_column;
RD_WatchViewColumn *free_column;
U64 column_count;
// rjf; table cursor state
RD_WatchViewPoint cursor;
RD_WatchViewPoint mark;
RD_WatchViewPoint next_cursor;
RD_WatchViewPoint next_mark;
// rjf: text input state
Arena *text_edit_arena;
U64 text_edit_state_slots_count;
RD_WatchViewTextEditState dummy_text_edit_state;
RD_WatchViewTextEditState **text_edit_state_slots;
B32 text_editing;
};
////////////////////////////////
//~ rjf: Code View Functions
internal void rd_code_view_init(RD_CodeViewState *cv, RD_View *view);
internal void rd_code_view_cmds(RD_View *view, RD_CodeViewState *cv, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key);
internal RD_CodeViewBuildResult rd_code_view_build(Arena *arena, RD_View *view, RD_CodeViewState *cv, RD_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key);
////////////////////////////////
//~ rjf: Watch View Functions
//- rjf: index -> column
internal RD_WatchViewColumn *rd_watch_view_column_from_x(RD_WatchViewState *wv, S64 index);
//- rjf: watch view points <-> table coordinates
internal B32 rd_watch_view_point_match(RD_WatchViewPoint a, RD_WatchViewPoint b);
internal RD_WatchViewPoint rd_watch_view_point_from_tbl(EV_BlockList *blocks, Vec2S64 tbl);
internal Vec2S64 rd_tbl_from_watch_view_point(EV_BlockList *blocks, RD_WatchViewPoint pt);
//- rjf: table coordinates -> strings
internal String8 rd_string_from_eval_viz_row_column(Arena *arena, EV_View *ev, EV_Row *row, RD_WatchViewColumn *col, B32 editable, U32 default_radix, FNT_Tag font, F32 font_size, F32 max_size_px);
//- rjf: table coordinates -> text edit state
internal RD_WatchViewTextEditState *rd_watch_view_text_edit_state_from_pt(RD_WatchViewState *wv, RD_WatchViewPoint pt);
//- rjf: watch view column state mutation
internal RD_WatchViewColumn *rd_watch_view_column_alloc_(RD_WatchViewState *wv, RD_WatchViewColumnKind kind, F32 pct, RD_WatchViewColumnParams *params);
#define rd_watch_view_column_alloc(wv, kind, pct, ...) rd_watch_view_column_alloc_((wv), (kind), (pct), &(RD_WatchViewColumnParams){.string = str8_zero(), __VA_ARGS__})
internal void rd_watch_view_column_release(RD_WatchViewState *wv, RD_WatchViewColumn *col);
//- rjf: watch view main hooks
internal void rd_watch_view_init(RD_WatchViewState *ewv, RD_View *view, RD_WatchViewFillKind fill_kind);
internal void rd_watch_view_build(RD_View *view, RD_WatchViewState *ewv, B32 modifiable, U32 default_radix, Rng2F32 rect);
#endif // RADDBG_VIEWS_H
File diff suppressed because it is too large Load Diff
+122
View File
@@ -0,0 +1,122 @@
// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef RADDBG_WIDGETS_H
#define RADDBG_WIDGETS_H
////////////////////////////////
//~ rjf: Line Edit Types
typedef U32 RD_LineEditFlags;
enum
{
RD_LineEditFlag_Expander = (1<<0),
RD_LineEditFlag_ExpanderSpace = (1<<1),
RD_LineEditFlag_ExpanderPlaceholder = (1<<2),
RD_LineEditFlag_DisableEdit = (1<<3),
RD_LineEditFlag_CodeContents = (1<<4),
RD_LineEditFlag_Border = (1<<5),
RD_LineEditFlag_NoBackground = (1<<6),
RD_LineEditFlag_PreferDisplayString = (1<<7),
RD_LineEditFlag_DisplayStringIsCode = (1<<8),
};
////////////////////////////////
//~ rjf: Code Slice Types
typedef U32 RD_CodeSliceFlags;
enum
{
RD_CodeSliceFlag_Clickable = (1<<0),
RD_CodeSliceFlag_PriorityMargin = (1<<1),
RD_CodeSliceFlag_CatchallMargin = (1<<2),
RD_CodeSliceFlag_LineNums = (1<<3),
};
typedef struct RD_CodeSliceParams RD_CodeSliceParams;
struct RD_CodeSliceParams
{
// rjf: content
RD_CodeSliceFlags flags;
Rng1S64 line_num_range;
String8 *line_text;
Rng1U64 *line_ranges;
TXT_TokenArray *line_tokens;
RD_EntityList *line_bps;
CTRL_EntityList *line_ips;
RD_EntityList *line_pins;
U64 *line_vaddrs;
D_LineList *line_infos;
DI_KeyList relevant_dbgi_keys;
// rjf: visual parameters
FNT_Tag font;
F32 font_size;
F32 tab_size;
String8 search_query;
F32 line_height_px;
F32 priority_margin_width_px;
F32 catchall_margin_width_px;
F32 line_num_width_px;
F32 line_text_max_width_px;
F32 margin_float_off_px;
};
typedef struct RD_CodeSliceSignal RD_CodeSliceSignal;
struct RD_CodeSliceSignal
{
UI_Signal base;
TxtPt mouse_pt;
TxtRng mouse_expr_rng;
};
////////////////////////////////
//~ rjf: UI Building Helpers
#define RD_Palette(code) UI_Palette(rd_palette_from_code(code))
#define RD_Font(slot) UI_Font(rd_font_from_slot(slot)) UI_TextRasterFlags(rd_raster_flags_from_slot((slot)))
////////////////////////////////
//~ rjf: UI Widgets: Loading Overlay
internal void rd_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U64 progress_v_target);
////////////////////////////////
//~ rjf: UI Widgets: Fancy Buttons
internal void rd_cmd_binding_buttons(String8 name);
internal UI_Signal rd_menu_bar_button(String8 string);
internal UI_Signal rd_cmd_spec_button(String8 name);
internal void rd_cmd_list_menu_buttons(U64 count, String8 *cmd_names, U32 *fastpath_codepoints);
internal UI_Signal rd_icon_button(RD_IconKind kind, FuzzyMatchRangeList *matches, String8 string);
internal UI_Signal rd_icon_buttonf(RD_IconKind kind, FuzzyMatchRangeList *matches, char *fmt, ...);
internal void rd_entity_tooltips(RD_Entity *entity);
internal UI_Signal rd_entity_desc_button(RD_Entity *entity, FuzzyMatchRangeList *name_matches, String8 fuzzy_query, B32 is_implicit);
internal void rd_src_loc_button(String8 file_path, TxtPt point);
////////////////////////////////
//~ rjf: UI Widgets: Text View
internal UI_BOX_CUSTOM_DRAW(rd_thread_box_draw_extensions);
internal UI_BOX_CUSTOM_DRAW(rd_bp_box_draw_extensions);
internal RD_CodeSliceSignal rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string);
internal RD_CodeSliceSignal rd_code_slicef(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...);
internal B32 rd_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column);
////////////////////////////////
//~ rjf: UI Widgets: Fancy Labels
internal UI_Signal rd_label(String8 string);
internal UI_Signal rd_error_label(String8 string);
internal B32 rd_help_label(String8 string);
internal DR_FancyStringList rd_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string);
internal UI_Box *rd_code_label(F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string);
////////////////////////////////
//~ rjf: UI Widgets: Line Edit
internal UI_Signal rd_line_edit(RD_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, String8 string);
internal UI_Signal rd_line_editf(RD_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, B32 *expanded_out, String8 pre_edit_value, char *fmt, ...);
#endif // RADDBG_WIDGETS_H