line expressions in eval lang; begin getting off of entities for breakpoints/watch-pins/etc., move -> cfg

This commit is contained in:
Ryan Fleury
2025-01-17 13:34:18 -08:00
parent 069084c108
commit 4371d727fb
12 changed files with 366 additions and 322 deletions
+2
View File
@@ -132,6 +132,8 @@ E_ExprKindTable:
{ Array Null 0 "array" "" "" "" }
{ Func Null 0 "function" "" "" "" }
{ Line Binary 1 ":" "" ":" "" }
{ Define Binary 13 "=" "" "=" "" }
}
+45
View File
@@ -1337,6 +1337,51 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr)
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Type expression not expected.");
}break;
//- rjf: textual line slicing
case E_ExprKind_Line:
{
E_Expr *lhs = expr->first;
E_Expr *rhs = expr->last;
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs);
E_Space space = lhs_irtree.space;
U64 line_num = rhs->value.u64;
B32 space_is_good = 1;
if(lhs_irtree.root->op != E_IRExtKind_SetSpace)
{
space_is_good = 0;
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, lhs->location, "Cannot take a line from a non-file.");
}
B32 line_num_is_good = 1;
if(rhs->kind != E_ExprKind_LeafU64)
{
line_num_is_good = 0;
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, rhs->location, "Line number must be specified as a constant number.");
}
if(space_is_good && line_num_is_good)
{
TXT_Scope *txt_scope = txt_scope_open();
U128 key = space.u128;
U128 hash = {0};
TXT_TextInfo text_info = txt_text_info_from_key_lang(txt_scope, key, TXT_LangKind_Null, &hash);
if(1 <= line_num && line_num <= text_info.lines_count)
{
Rng1U64 line_range = text_info.lines_ranges[line_num-1];
U64 line_size = dim_1u64(line_range);
E_IRNode *line_offset = e_irtree_const_u(arena, line_range.min);
E_IRNode *set_space = e_irtree_set_space(arena, space, line_offset);
result.root = set_space;
result.type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), line_size);
result.mode = E_Mode_Offset;
result.space = space;
}
else
{
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, rhs->location, "Line %I64u is out of bounds.", line_num);
}
txt_scope_close(txt_scope);
}
}break;
//- rjf: definitions
case E_ExprKind_Define:
{
+4 -2
View File
@@ -14,7 +14,7 @@ str8_lit_comp("CharLiteral"),
str8_lit_comp("Symbol"),
};
String8 e_expr_kind_strings[48] =
String8 e_expr_kind_strings[49] =
{
str8_lit_comp("Nil"),
str8_lit_comp("Ref"),
@@ -63,6 +63,7 @@ str8_lit_comp("TypeIdent"),
str8_lit_comp("Ptr"),
str8_lit_comp("Array"),
str8_lit_comp("Func"),
str8_lit_comp("Line"),
str8_lit_comp("Define"),
};
@@ -81,7 +82,7 @@ str8_lit_comp("Insufficient evaluation machine stack space."),
str8_lit_comp("Malformed bytecode."),
};
E_OpInfo e_expr_kind_op_info_table[48] =
E_OpInfo e_expr_kind_op_info_table[49] =
{
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
@@ -130,6 +131,7 @@ E_OpInfo e_expr_kind_op_info_table[48] =
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Binary, 1, str8_lit_comp(""), str8_lit_comp(":"), str8_lit_comp("") },
{ E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp("="), str8_lit_comp("") },
};
+3 -2
View File
@@ -138,6 +138,7 @@ E_ExprKind_TypeIdent,
E_ExprKind_Ptr,
E_ExprKind_Array,
E_ExprKind_Func,
E_ExprKind_Line,
E_ExprKind_Define,
E_ExprKind_COUNT,
} E_ExprKindEnum;
@@ -160,9 +161,9 @@ E_InterpretationCode_COUNT,
C_LINKAGE_BEGIN
extern String8 e_token_kind_strings[6];
extern String8 e_expr_kind_strings[48];
extern String8 e_expr_kind_strings[49];
extern String8 e_interpretation_code_display_strings[11];
extern E_OpInfo e_expr_kind_op_info_table[48];
extern E_OpInfo e_expr_kind_op_info_table[49];
extern U8 e_kind_basic_byte_size_table[56];
extern String8 e_kind_basic_string_table[56];
+3 -1
View File
@@ -191,7 +191,7 @@ RD_EntityKindFlags rd_entity_kind_flags_table[27] =
(0*RD_EntityKindFlag_CanDelete) | (0*RD_EntityKindFlag_CanFreeze) | (0*RD_EntityKindFlag_CanEdit) | (1*RD_EntityKindFlag_CanRename) | (0*RD_EntityKindFlag_CanEnable) | (0*RD_EntityKindFlag_CanCondition) | (0*RD_EntityKindFlag_CanDuplicate) | (0*RD_EntityKindFlag_NameIsCode) | (0*RD_EntityKindFlag_NameIsPath) | (0*RD_EntityKindFlag_UserDefinedLifetime) | (0*RD_EntityKindFlag_IsSerializedToConfig),
};
Rng1U64 rd_reg_slot_range_table[38] =
Rng1U64 rd_reg_slot_range_table[40] =
{
{0},
{OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(CTRL_Handle)},
@@ -204,6 +204,8 @@ Rng1U64 rd_reg_slot_range_table[38] =
{OffsetOf(RD_Regs, view), OffsetOf(RD_Regs, view) + sizeof(RD_Handle)},
{OffsetOf(RD_Regs, prev_view), OffsetOf(RD_Regs, prev_view) + sizeof(RD_Handle)},
{OffsetOf(RD_Regs, dst_panel), OffsetOf(RD_Regs, dst_panel) + sizeof(RD_Handle)},
{OffsetOf(RD_Regs, cfg), OffsetOf(RD_Regs, cfg) + sizeof(RD_Handle)},
{OffsetOf(RD_Regs, cfg_list), OffsetOf(RD_Regs, cfg_list) + sizeof(RD_HandleList)},
{OffsetOf(RD_Regs, entity), OffsetOf(RD_Regs, entity) + sizeof(RD_Handle)},
{OffsetOf(RD_Regs, entity_list), OffsetOf(RD_Regs, entity_list) + sizeof(RD_HandleList)},
{OffsetOf(RD_Regs, unwind_count), OffsetOf(RD_Regs, unwind_count) + sizeof(U64)},
+7 -1
View File
@@ -60,6 +60,8 @@ RD_RegSlot_Panel,
RD_RegSlot_View,
RD_RegSlot_PrevView,
RD_RegSlot_DstPanel,
RD_RegSlot_Cfg,
RD_RegSlot_CfgList,
RD_RegSlot_Entity,
RD_RegSlot_EntityList,
RD_RegSlot_UnwindCount,
@@ -557,6 +559,8 @@ RD_Handle panel;
RD_Handle view;
RD_Handle prev_view;
RD_Handle dst_panel;
RD_Handle cfg;
RD_HandleList cfg_list;
RD_Handle entity;
RD_HandleList entity_list;
U64 unwind_count;
@@ -632,6 +636,8 @@ RD_ViewRuleUIFunctionType *ui;
.view = rd_regs()->view,\
.prev_view = rd_regs()->prev_view,\
.dst_panel = rd_regs()->dst_panel,\
.cfg = rd_regs()->cfg,\
.cfg_list = rd_regs()->cfg_list,\
.entity = rd_regs()->entity,\
.entity_list = rd_regs()->entity_list,\
.unwind_count = rd_regs()->unwind_count,\
@@ -779,7 +785,7 @@ extern String8 d_entity_kind_name_lower_table[27];
extern String8 d_entity_kind_name_lower_plural_table[27];
extern String8 d_entity_kind_name_label_table[27];
extern RD_EntityKindFlags rd_entity_kind_flags_table[27];
extern Rng1U64 rd_reg_slot_range_table[38];
extern Rng1U64 rd_reg_slot_range_table[40];
extern RD_StringBindingPair rd_default_binding_table[110];
extern String8 rd_binding_version_remap_old_name_table[8];
extern String8 rd_binding_version_remap_new_name_table[8];
+2
View File
@@ -161,6 +161,8 @@ RD_RegTable:
{RD_Handle view View }
{RD_Handle prev_view PrevView }
{RD_Handle dst_panel DstPanel }
{RD_Handle cfg Cfg }
{RD_HandleList cfg_list CfgList }
{RD_Handle entity Entity }
{RD_HandleList entity_list EntityList }
+197 -245
View File
@@ -131,6 +131,7 @@ rd_regs_copy_contents(Arena *arena, RD_Regs *dst, RD_Regs *src)
{
MemoryCopyStruct(dst, src);
dst->entity_list = rd_handle_list_copy(arena, src->entity_list);
dst->cfg_list = rd_handle_list_copy(arena, src->cfg_list);
dst->file_path = push_str8_copy(arena, src->file_path);
dst->lines = d_line_list_copy(arena, &src->lines);
dst->dbgi_key = di_key_copy(arena, &src->dbgi_key);
@@ -1185,6 +1186,78 @@ rd_key_map_node_ptr_list_from_binding(Arena *arena, RD_Binding binding)
return list;
}
internal Vec4F32
rd_hsva_from_cfg(RD_Cfg *cfg)
{
Vec4F32 hsva = {0};
RD_Cfg *hsva_root = rd_cfg_child_from_string(cfg, str8_lit("hsva"));
RD_Cfg *h = hsva_root->first;
RD_Cfg *s = h->next;
RD_Cfg *v = s->next;
RD_Cfg *a = v->next;
hsva.x = (F32)f64_from_str8(h->string);
hsva.y = (F32)f64_from_str8(s->string);
hsva.z = (F32)f64_from_str8(v->string);
hsva.w = (F32)f64_from_str8(a->string);
return hsva;
}
internal Vec4F32
rd_rgba_from_cfg(RD_Cfg *cfg)
{
Vec4F32 hsva = rd_hsva_from_cfg(cfg);
Vec4F32 rgba = rgba_from_hsva(hsva);
return rgba;
}
internal B32
rd_disabled_from_cfg(RD_Cfg *cfg)
{
B32 is_disabled = (rd_cfg_child_from_string(cfg, str8_lit("disabled")) != &rd_nil_cfg);
return is_disabled;
}
internal RD_Location
rd_location_from_cfg(RD_Cfg *cfg)
{
RD_Location dst_loc = {0};
{
RD_Cfg *src_loc = rd_cfg_child_from_string(cfg, str8_lit("location"));
if(src_loc->first != &rd_nil_cfg && src_loc->first->first != &rd_nil_cfg)
{
dst_loc.file_path = src_loc->first->string;
try_s64_from_str8_c_rules(src_loc->first->first->string, &dst_loc.pt.line);
if(!try_s64_from_str8_c_rules(src_loc->first->first->first->string, &dst_loc.pt.column))
{
dst_loc.pt.column = 1;
}
}
else
{
Temp scratch = scratch_begin(0, 0);
MD_TokenizeResult tokenize = md_tokenize_from_text(scratch.arena, src_loc->first->string);
if(tokenize.tokens.count == 1 && tokenize.tokens.v[0].flags & (MD_TokenFlag_Identifier|MD_TokenFlag_StringLiteral))
{
dst_loc.name = src_loc->first->string;
}
else if(tokenize.tokens.count == 1 && tokenize.tokens.v[0].flags & MD_TokenFlag_Numeric)
{
try_u64_from_str8_c_rules(src_loc->first->string, &dst_loc.vaddr);
}
scratch_end(scratch);
}
}
return dst_loc;
}
internal String8
rd_expr_from_cfg(RD_Cfg *cfg)
{
RD_Cfg *expr_root = rd_cfg_child_from_string(cfg, str8_lit("expression"));
String8 result = expr_root->first->string;
return result;
}
////////////////////////////////
//~ rjf: Entity State Functions
@@ -3689,7 +3762,7 @@ rd_window_frame(void)
RD_ViewRuleUIFunctionType *view_ui = view_rule_info->ui;
String8 expr = rd_view_expr_string();
String8 params_string = rd_string_from_cfg_tree(scratch.arena, view);
MD_Node *params = md_tree_from_string(scratch.arena, params_string);
MD_Node *params = md_tree_from_string(scratch.arena, params_string)->first;
view_ui(expr, params, view_preview_container->rect);
}
}
@@ -4091,7 +4164,7 @@ rd_window_frame(void)
UI_Signal item_sig = ui_signal_from_box(item_box);
if(ui_clicked(item_sig))
{
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg_lister
UI_Event move_back_evt = zero_struct;
move_back_evt.kind = UI_EventKind_Navigate;
move_back_evt.flags = UI_EventFlag_KeepMark;
@@ -4117,7 +4190,7 @@ rd_window_frame(void)
di_scope_close(di_scope);
}
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg_lister
////////////////////////////
//- rjf: prepare query state for the in-progress query command
//
@@ -4136,7 +4209,7 @@ rd_window_frame(void)
ws->query_input_cursor = ws->query_input_mark = txt_pt(1, ws->query_input_string_size+1);
}
#if 0 // TODO(rjf): @cfg (query state prep)
#if 0 // TODO(rjf): @cfg_lister (query state prep)
String8 query_view_name = cmd_kind_info->query.view_name;
if(query_view_name.size == 0)
{
@@ -6011,7 +6084,7 @@ rd_window_frame(void)
// rjf: disable hover eval if hovered view is actively scrolling
if(hover_eval_is_open)
{
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg_panels
for(RD_Panel *panel = ws->root_panel;
!rd_panel_is_nil(panel);
panel = rd_panel_rec_depth_first_pre(panel).next)
@@ -6635,7 +6708,7 @@ rd_window_frame(void)
////////////////////////////
//- rjf: animate panels
//
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg_panels
{
F32 rate = rd_setting_val_from_code(RD_SettingCode_MenuAnimations).s32 ? 1 - pow_f32(2, (-50.f * rd_state->frame_dt)) : 1.f;
Vec2F32 content_rect_dim = dim_2f32(content_rect);
@@ -6690,8 +6763,6 @@ rd_window_frame(void)
F32 selected_tab_is_filtering_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "###is_filtering_t_%p", selected_tab), (F32)!!selected_tab_view_state->is_filtering);
ProfScope("leaf panel UI work - %.*s", str8_varg(selected_tab->string))
UI_Focus(panel_is_focused ? UI_FocusKind_Null : UI_FocusKind_Off)
RD_RegsScope(.panel = rd_handle_from_cfg(panel->cfg),
.view = rd_handle_from_cfg(selected_tab))
{
//////////////////////////
//- rjf: calculate UI rectangles
@@ -6702,7 +6773,7 @@ rd_window_frame(void)
target_rect_px.y0 / content_rect_dim.y,
target_rect_px.x1 / content_rect_dim.x,
target_rect_px.y1 / content_rect_dim.y);
// TODO(rjf): @cfg animate `target_rect_pct`
// TODO(rjf): @cfg_panels animate `target_rect_pct`
Rng2F32 panel_rect_pct = target_rect_pct;
Rng2F32 panel_rect = r2f32p(panel_rect_pct.x0*content_rect_dim.x,
panel_rect_pct.y0*content_rect_dim.y,
@@ -7020,6 +7091,8 @@ rd_window_frame(void)
String8 view_file_path = rd_file_path_from_eval_string(rd_frame_arena(), view_expr);
if(view_file_path.size != 0)
{
rd_regs()->panel = rd_handle_from_cfg(panel->cfg);
rd_regs()->view = rd_handle_from_cfg(selected_tab);
rd_regs()->file_path = view_file_path;
}
}
@@ -7044,7 +7117,7 @@ rd_window_frame(void)
{
String8 view_expr = rd_view_expr_string();
String8 params_string = rd_string_from_cfg_tree(scratch.arena, selected_tab);
MD_Node *params = md_tree_from_string(scratch.arena, params_string);
MD_Node *params = md_tree_from_string(scratch.arena, params_string)->first;
RD_ViewRuleInfo *view_rule_info = rd_view_rule_info_from_string(selected_tab->string);
RD_ViewRuleUIFunctionType *view_ui = view_rule_info->ui;
view_ui(view_expr, params, content_rect);
@@ -7172,7 +7245,7 @@ rd_window_frame(void)
// draw empty space
if(rd_drag_is_active() && rd_state->drag_drop_regs_slot == RD_RegSlot_View && catchall_drop_site_hovered)
{
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg_dragdrop
RD_Panel *dst_panel = rd_panel_from_handle(rd_last_drag_drop_panel);
RD_View *drag_view = rd_view_from_handle(rd_state->drag_drop_regs->view);
RD_View *dst_prev_view = rd_view_from_handle(rd_last_drag_drop_prev_tab);
@@ -7436,7 +7509,7 @@ rd_window_frame(void)
//
if(catchall_drop_site_hovered)
{
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg_dragdrop
rd_last_drag_drop_panel = rd_handle_from_panel(panel);
RD_View *dragged_view = rd_view_from_handle(rd_state->drag_drop_regs->view);
@@ -7516,89 +7589,6 @@ rd_window_frame(void)
}
}
////////////////////////////
//- rjf: animate views
//
{
#if 0 // TODO(rjf): @cfg
Temp scratch = scratch_begin(0, 0);
typedef struct Task Task;
struct Task
{
Task *next;
RD_Panel *panel;
RD_View *list_first;
RD_View *transient_owner;
};
Task start_task = {0, &rd_nil_panel, ws->query_view_stack_top};
Task *first_task = &start_task;
Task *last_task = first_task;
F32 rate = 1 - pow_f32(2, (-10.f * rd_state->frame_dt));
F32 fast_rate = 1 - pow_f32(2, (-40.f * rd_state->frame_dt));
for(RD_Panel *panel = ws->root_panel;
!rd_panel_is_nil(panel);
panel = rd_panel_rec_depth_first_pre(panel).next)
{
Task *t = push_array(scratch.arena, Task, 1);
SLLQueuePush(first_task, last_task, t);
t->panel = panel;
t->list_first = panel->first_tab_view;
}
for(Task *t = first_task; t != 0; t = t->next)
{
RD_View *list_first = t->list_first;
for(RD_View *view = list_first; !rd_view_is_nil(view); view = view->order_next)
{
if(!rd_view_is_nil(view->first_transient))
{
Task *task = push_array(scratch.arena, Task, 1);
SLLQueuePush(first_task, last_task, task);
task->panel = t->panel;
task->list_first = view->first_transient;
task->transient_owner = view;
}
if(window_is_focused)
{
if(abs_f32(view->loading_t_target - view->loading_t) > 0.01f ||
abs_f32(view->scroll_pos.x.off) > 0.01f ||
abs_f32(view->scroll_pos.y.off) > 0.01f ||
abs_f32(view->is_filtering_t - (F32)!!view->is_filtering))
{
rd_request_frame();
}
if(view->loading_t_target != 0 && (view == rd_selected_tab_from_panel(t->panel) ||
t->transient_owner == rd_selected_tab_from_panel(t->panel)))
{
rd_request_frame();
}
}
view->loading_t += (view->loading_t_target - view->loading_t) * rate;
view->is_filtering_t += ((F32)!!view->is_filtering - view->is_filtering_t) * fast_rate;
view->scroll_pos.x.off -= view->scroll_pos.x.off * (rd_setting_val_from_code(RD_SettingCode_ScrollingAnimations).s32 ? fast_rate : 1.f);
view->scroll_pos.y.off -= view->scroll_pos.y.off * (rd_setting_val_from_code(RD_SettingCode_ScrollingAnimations).s32 ? fast_rate : 1.f);
if(abs_f32(view->scroll_pos.x.off) < 0.01f)
{
view->scroll_pos.x.off = 0;
}
if(abs_f32(view->scroll_pos.y.off) < 0.01f)
{
view->scroll_pos.y.off = 0;
}
if(abs_f32(view->is_filtering_t - (F32)!!view->is_filtering) < 0.01f)
{
view->is_filtering_t = (F32)!!view->is_filtering;
}
if(view == rd_selected_tab_from_panel(t->panel) ||
t->transient_owner == rd_selected_tab_from_panel(t->panel))
{
view->loading_t_target = 0;
}
}
}
scratch_end(scratch);
#endif
}
////////////////////////////
//- rjf: drag/drop cancelling
//
@@ -9984,7 +9974,7 @@ rd_lister_query_path_from_input_string_off(String8 input, U64 cursor_off)
return path;
}
#if 0 // TODO(rjf): @cfg
#if 0 // TODO(rjf): @cfg_lister
internal RD_ListerParams
rd_view_rule_lister_params_from_input_cursor(Arena *arena, String8 string, U64 cursor_off)
@@ -10380,44 +10370,6 @@ rd_font_size_from_slot(RD_FontSlot slot)
result *= (dpi / 96.f);
}
return result;
#if 0 // TODO(rjf): @cfg
F32 result = 0;
RD_Cfg *wcfg = rd_cfg_from_handle(rd_regs()->window);
RD_WindowState *ws = rd_window_state_from_cfg(wcfg);
F32 dpi = os_dpi_from_window(ws->os);
if(dpi != ws->last_dpi)
{
F32 old_dpi = ws->last_dpi;
F32 new_dpi = dpi;
ws->last_dpi = dpi;
S32 *pt_sizes[] =
{
&ws->setting_vals[RD_SettingCode_MainFontSize].s32,
&ws->setting_vals[RD_SettingCode_CodeFontSize].s32,
};
for(U64 idx = 0; idx < ArrayCount(pt_sizes); idx += 1)
{
F32 ratio = pt_sizes[idx][0] / old_dpi;
F32 new_pt_size = ratio*new_dpi;
pt_sizes[idx][0] = (S32)new_pt_size;
}
}
switch(slot)
{
case RD_FontSlot_Code:
{
result = (F32)ws->setting_vals[RD_SettingCode_CodeFontSize].s32;
}break;
default:
case RD_FontSlot_Main:
case RD_FontSlot_Icons:
{
result = (F32)ws->setting_vals[RD_SettingCode_MainFontSize].s32;
}break;
}
return result;
#endif
}
internal FNT_RasterFlags
@@ -11826,6 +11778,112 @@ rd_frame(void)
}
}
//////////////////////////////
//- rjf: get events from the OS
//
OS_EventList events = {0};
if(depth == 0) DeferLoop(depth += 1, depth -= 1)
{
events = os_get_events(scratch.arena, rd_state->num_frames_requested == 0);
}
//////////////////////////////
//- rjf: pick target hz
//
// TODO(rjf): maximize target, given all windows and their monitors
F32 target_hz = os_get_gfx_info()->default_refresh_rate;
if(rd_state->frame_index > 32)
{
// rjf: calculate average frame time out of the last N
U64 num_frames_in_history = Min(ArrayCount(rd_state->frame_time_us_history), rd_state->frame_index);
U64 frame_time_history_sum_us = 0;
for(U64 idx = 0; idx < num_frames_in_history; idx += 1)
{
frame_time_history_sum_us += rd_state->frame_time_us_history[idx];
}
U64 frame_time_history_avg_us = frame_time_history_sum_us/num_frames_in_history;
// rjf: pick among a number of sensible targets to snap to, given how well
// we've been performing
F32 possible_alternate_hz_targets[] = {target_hz, 60.f, 120.f, 144.f, 240.f};
F32 best_target_hz = target_hz;
S64 best_target_hz_frame_time_us_diff = max_S64;
for(U64 idx = 0; idx < ArrayCount(possible_alternate_hz_targets); idx += 1)
{
F32 candidate = possible_alternate_hz_targets[idx];
if(candidate <= target_hz)
{
U64 candidate_frame_time_us = 1000000/(U64)candidate;
S64 frame_time_us_diff = (S64)frame_time_history_avg_us - (S64)candidate_frame_time_us;
if(abs_s64(frame_time_us_diff) < best_target_hz_frame_time_us_diff)
{
best_target_hz = candidate;
best_target_hz_frame_time_us_diff = frame_time_us_diff;
}
}
}
target_hz = best_target_hz;
}
//////////////////////////////
//- rjf: target Hz -> delta time
//
rd_state->frame_dt = 1.f/target_hz;
//////////////////////////////
//- rjf: begin measuring actual per-frame work
//
U64 begin_time_us = os_now_microseconds();
//////////////////////////////
//- rjf: bind change
//
if(!rd_state->popup_active && rd_state->bind_change_active)
{
if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Esc))
{
rd_request_frame();
rd_state->bind_change_active = 0;
}
if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Delete))
{
rd_request_frame();
// TODO(rjf): @cfg_bindchange rd_unbind_name(rd_state->bind_change_cmd_name, rd_state->bind_change_binding);
rd_state->bind_change_active = 0;
rd_cmd(rd_cfg_src_write_cmd_kind_table[RD_CfgSrc_User]);
}
for(OS_Event *event = events.first, *next = 0; event != 0; event = next)
{
if(event->kind == OS_EventKind_Press &&
event->key != OS_Key_Esc &&
event->key != OS_Key_Return &&
event->key != OS_Key_Backspace &&
event->key != OS_Key_Delete &&
event->key != OS_Key_LeftMouseButton &&
event->key != OS_Key_RightMouseButton &&
event->key != OS_Key_MiddleMouseButton &&
event->key != OS_Key_Ctrl &&
event->key != OS_Key_Alt &&
event->key != OS_Key_Shift)
{
rd_state->bind_change_active = 0;
RD_Binding binding = zero_struct;
{
binding.key = event->key;
binding.modifiers = event->modifiers;
}
// TODO(rjf): @cfg_bindchange rd_unbind_name(rd_state->bind_change_cmd_name, rd_state->bind_change_binding);
// TODO(rjf): @cfg_bindchange rd_bind_name(rd_state->bind_change_cmd_name, binding);
U32 codepoint = os_codepoint_from_modifiers_and_key(event->modifiers, event->key);
os_text(&events, event->window, codepoint);
os_eat_event(&events, event);
rd_cmd(rd_cfg_src_write_cmd_kind_table[RD_CfgSrc_User]);
rd_request_frame();
break;
}
}
}
//////////////////////////////
//- rjf: build key map from config
//
@@ -11929,112 +11987,6 @@ rd_frame(void)
}
}
//////////////////////////////
//- rjf: get events from the OS
//
OS_EventList events = {0};
if(depth == 0) DeferLoop(depth += 1, depth -= 1)
{
events = os_get_events(scratch.arena, rd_state->num_frames_requested == 0);
}
//////////////////////////////
//- rjf: pick target hz
//
// TODO(rjf): maximize target, given all windows and their monitors
F32 target_hz = os_get_gfx_info()->default_refresh_rate;
if(rd_state->frame_index > 32)
{
// rjf: calculate average frame time out of the last N
U64 num_frames_in_history = Min(ArrayCount(rd_state->frame_time_us_history), rd_state->frame_index);
U64 frame_time_history_sum_us = 0;
for(U64 idx = 0; idx < num_frames_in_history; idx += 1)
{
frame_time_history_sum_us += rd_state->frame_time_us_history[idx];
}
U64 frame_time_history_avg_us = frame_time_history_sum_us/num_frames_in_history;
// rjf: pick among a number of sensible targets to snap to, given how well
// we've been performing
F32 possible_alternate_hz_targets[] = {target_hz, 60.f, 120.f, 144.f, 240.f};
F32 best_target_hz = target_hz;
S64 best_target_hz_frame_time_us_diff = max_S64;
for(U64 idx = 0; idx < ArrayCount(possible_alternate_hz_targets); idx += 1)
{
F32 candidate = possible_alternate_hz_targets[idx];
if(candidate <= target_hz)
{
U64 candidate_frame_time_us = 1000000/(U64)candidate;
S64 frame_time_us_diff = (S64)frame_time_history_avg_us - (S64)candidate_frame_time_us;
if(abs_s64(frame_time_us_diff) < best_target_hz_frame_time_us_diff)
{
best_target_hz = candidate;
best_target_hz_frame_time_us_diff = frame_time_us_diff;
}
}
}
target_hz = best_target_hz;
}
//////////////////////////////
//- rjf: target Hz -> delta time
//
rd_state->frame_dt = 1.f/target_hz;
//////////////////////////////
//- rjf: begin measuring actual per-frame work
//
U64 begin_time_us = os_now_microseconds();
//////////////////////////////
//- rjf: bind change
//
if(!rd_state->popup_active && rd_state->bind_change_active)
{
if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Esc))
{
rd_request_frame();
rd_state->bind_change_active = 0;
}
if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Delete))
{
rd_request_frame();
// TODO(rjf): @cfg rd_unbind_name(rd_state->bind_change_cmd_name, rd_state->bind_change_binding);
rd_state->bind_change_active = 0;
rd_cmd(rd_cfg_src_write_cmd_kind_table[RD_CfgSrc_User]);
}
for(OS_Event *event = events.first, *next = 0; event != 0; event = next)
{
if(event->kind == OS_EventKind_Press &&
event->key != OS_Key_Esc &&
event->key != OS_Key_Return &&
event->key != OS_Key_Backspace &&
event->key != OS_Key_Delete &&
event->key != OS_Key_LeftMouseButton &&
event->key != OS_Key_RightMouseButton &&
event->key != OS_Key_MiddleMouseButton &&
event->key != OS_Key_Ctrl &&
event->key != OS_Key_Alt &&
event->key != OS_Key_Shift)
{
rd_state->bind_change_active = 0;
RD_Binding binding = zero_struct;
{
binding.key = event->key;
binding.modifiers = event->modifiers;
}
// TODO(rjf): @cfg rd_unbind_name(rd_state->bind_change_cmd_name, rd_state->bind_change_binding);
// TODO(rjf): @cfg rd_bind_name(rd_state->bind_change_cmd_name, binding);
U32 codepoint = os_codepoint_from_modifiers_and_key(event->modifiers, event->key);
os_text(&events, event->window, codepoint);
os_eat_event(&events, event);
rd_cmd(rd_cfg_src_write_cmd_kind_table[RD_CfgSrc_User]);
rd_request_frame();
break;
}
}
}
//////////////////////////////
//- rjf: consume events
//
@@ -12492,7 +12444,7 @@ rd_frame(void)
//- rjf: sanitize the window/panel/tab tree structure
//
{
// TODO(rjf): @cfg in the past, we had a spot in the rd_window_frame,
// TODO(rjf): @cfg_panels in the past, we had a spot in the rd_window_frame,
// which ensured to select tabs, if a panel had tabs but had none
// selected, and if a panel had a selected tab but it was project-filtered.
// this is effectively just fixing up unexpected malformations of the
@@ -15999,13 +15951,13 @@ X(getting_started)
for(RD_CfgNode *n = wps.first; n != 0; n = n->next)
{
RD_Cfg *wp = n->v;
RD_Cfg *name = rd_cfg_child_from_string(wp, str8_lit("name"));
RD_Cfg *expr = rd_cfg_child_from_string(wp, str8_lit("expression"));
RD_Cfg *loc = rd_cfg_child_from_string(wp, str8_lit("location"));
S64 loc_line = 0;
U64 loc_vaddr = 0;
B32 loc_matches_file_pt = (file_path.size != 0 && path_match_normalized(loc->first->string, file_path) && try_s64_from_str8_c_rules(loc->first->first->string, &loc_line) && loc_line == pt.line);
B32 loc_matches_vaddr = (vaddr != 0 && try_u64_from_str8_c_rules(loc->first->string, &loc_vaddr) && loc_vaddr == vaddr);
B32 loc_matches_expr = (string.size != 0 && str8_match(name->first->string, string, 0));
B32 loc_matches_expr = (string.size != 0 && str8_match(expr->first->string, string, 0));
if(loc_matches_expr && (loc_matches_file_pt || loc_matches_vaddr))
{
rd_cfg_release(wp);
@@ -16018,9 +15970,9 @@ X(getting_started)
{
RD_Cfg *project = rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("project"));
RD_Cfg *wp = rd_cfg_new(project, str8_lit("watch_pin"));
RD_Cfg *name = rd_cfg_new(wp, str8_lit("name"));
RD_Cfg *expr = rd_cfg_new(wp, str8_lit("expression"));
RD_Cfg *loc = rd_cfg_new(wp, str8_lit("location"));
rd_cfg_new(name, string);
rd_cfg_new(expr, string);
if(vaddr != 0)
{
rd_cfg_newf(loc, "0x%I64x", vaddr);
+19
View File
@@ -341,6 +341,18 @@ struct RD_CfgRec
S32 pop_count;
};
////////////////////////////////
//~ rjf: Structured Locations, Parsed From Config
typedef struct RD_Location RD_Location;
struct RD_Location
{
String8 file_path;
TxtPt pt;
U64 vaddr;
String8 name;
};
////////////////////////////////
//~ rjf: Key Map Types
@@ -1147,6 +1159,13 @@ internal B32 rd_cfg_is_project_filtered(RD_Cfg *cfg);
internal RD_KeyMapNodePtrList rd_key_map_node_ptr_list_from_name(Arena *arena, String8 string);
internal RD_KeyMapNodePtrList rd_key_map_node_ptr_list_from_binding(Arena *arena, RD_Binding binding);
internal Vec4F32 rd_hsva_from_cfg(RD_Cfg *cfg);
internal Vec4F32 rd_rgba_from_cfg(RD_Cfg *cfg);
internal B32 rd_disabled_from_cfg(RD_Cfg *cfg);
internal RD_Location rd_location_from_cfg(RD_Cfg *cfg);
internal String8 rd_expr_from_cfg(RD_Cfg *cfg);
////////////////////////////////
//~ rjf: Entity Stateful Functions
+34 -34
View File
@@ -178,9 +178,9 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
code_slice_params.line_text = push_array(scratch.arena, String8, visible_line_count);
code_slice_params.line_ranges = push_array(scratch.arena, Rng1U64, visible_line_count);
code_slice_params.line_tokens = push_array(scratch.arena, TXT_TokenArray, visible_line_count);
code_slice_params.line_bps = push_array(scratch.arena, RD_EntityList, visible_line_count);
code_slice_params.line_bps = push_array(scratch.arena, RD_CfgList, visible_line_count);
code_slice_params.line_ips = push_array(scratch.arena, CTRL_EntityList, visible_line_count);
code_slice_params.line_pins = push_array(scratch.arena, RD_EntityList, visible_line_count);
code_slice_params.line_pins = push_array(scratch.arena, RD_CfgList, visible_line_count);
code_slice_params.line_vaddrs = push_array(scratch.arena, U64, visible_line_count);
code_slice_params.line_infos = push_array(scratch.arena, D_LineList, visible_line_count);
code_slice_params.font = code_font;
@@ -211,21 +211,21 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
// rjf: find visible breakpoints for source code
if(!dasm_lines) ProfScope("find visible breakpoints for source code")
{
RD_EntityList bps = rd_query_cached_entity_list_with_kind(RD_EntityKind_Breakpoint);
for(RD_EntityNode *n = bps.first; n != 0; n = n->next)
RD_CfgList bps = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("breakpoint"));
for(RD_CfgNode *n = bps.first; n != 0; n = n->next)
{
RD_Entity *bp = n->entity;
RD_Entity *loc = rd_entity_child_from_kind(bp, RD_EntityKind_Location);
if(visible_line_num_range.min <= loc->text_point.line && loc->text_point.line <= visible_line_num_range.max)
RD_Cfg *bp = n->v;
RD_Location loc = rd_location_from_cfg(bp);
if(visible_line_num_range.min <= loc.pt.line && loc.pt.line <= visible_line_num_range.max)
{
for(String8Node *override_n = file_path_possible_overrides.first;
override_n != 0;
override_n = override_n->next)
{
if(path_match_normalized(loc->string, override_n->string))
if(path_match_normalized(loc.file_path, override_n->string))
{
U64 slice_line_idx = (loc->text_point.line-visible_line_num_range.min);
rd_entity_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp);
U64 slice_line_idx = (U64)(loc.pt.line-visible_line_num_range.min);
rd_cfg_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp);
break;
}
}
@@ -273,21 +273,21 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
// rjf: find visible watch pins for source code
if(!dasm_lines) ProfScope("find visible watch pins for source code")
{
RD_EntityList wps = rd_query_cached_entity_list_with_kind(RD_EntityKind_WatchPin);
for(RD_EntityNode *n = wps.first; n != 0; n = n->next)
RD_CfgList wps = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch_pin"));
for(RD_CfgNode *n = wps.first; n != 0; n = n->next)
{
RD_Entity *wp = n->entity;
RD_Entity *loc = rd_entity_child_from_kind(wp, RD_EntityKind_Location);
if(visible_line_num_range.min <= loc->text_point.line && loc->text_point.line <= visible_line_num_range.max)
RD_Cfg *wp = n->v;
RD_Location loc = rd_location_from_cfg(wp);
if(visible_line_num_range.min <= loc.pt.line && loc.pt.line <= visible_line_num_range.max)
{
for(String8Node *override_n = file_path_possible_overrides.first;
override_n != 0;
override_n = override_n->next)
{
if(path_match_normalized(loc->string, override_n->string))
if(path_match_normalized(loc.file_path, override_n->string))
{
U64 slice_line_idx = (loc->text_point.line-visible_line_num_range.min);
rd_entity_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], wp);
U64 slice_line_idx = (loc.pt.line-visible_line_num_range.min);
rd_cfg_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], wp);
break;
}
}
@@ -335,20 +335,20 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
// rjf: find breakpoints mapping to this disasm
if(dasm_lines) ProfScope("find breakpoints mapping to this disassembly")
{
RD_EntityList bps = rd_query_cached_entity_list_with_kind(RD_EntityKind_Breakpoint);
for(RD_EntityNode *n = bps.first; n != 0; n = n->next)
RD_CfgList bps = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("breakpoint"));
for(RD_CfgNode *n = bps.first; n != 0; n = n->next)
{
RD_Entity *bp = n->entity;
RD_Entity *loc = rd_entity_child_from_kind(bp, RD_EntityKind_Location);
if(loc->flags & RD_EntityFlag_HasVAddr && contains_1u64(dasm_vaddr_range, loc->vaddr))
RD_Cfg *bp = n->v;
RD_Location loc = rd_location_from_cfg(bp);
if(contains_1u64(dasm_vaddr_range, loc.vaddr))
{
U64 off = loc->vaddr-dasm_vaddr_range.min;
U64 off = loc.vaddr - dasm_vaddr_range.min;
U64 idx = dasm_line_array_idx_from_code_off__linear_scan(dasm_lines, off);
S64 line_num = (S64)(idx+1);
S64 line_num = (S64)idx+1;
if(contains_1s64(visible_line_num_range, line_num))
{
U64 slice_line_idx = (line_num-visible_line_num_range.min);
rd_entity_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp);
rd_cfg_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp);
}
}
}
@@ -357,20 +357,20 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla
// rjf: find watch pins mapping to this disasm
if(dasm_lines) ProfScope("find watch pins mapping to this disassembly")
{
RD_EntityList pins = rd_query_cached_entity_list_with_kind(RD_EntityKind_WatchPin);
for(RD_EntityNode *n = pins.first; n != 0; n = n->next)
RD_CfgList wps = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("watch_pin"));
for(RD_CfgNode *n = wps.first; n != 0; n = n->next)
{
RD_Entity *pin = n->entity;
RD_Entity *loc = rd_entity_child_from_kind(pin, RD_EntityKind_Location);
if(loc->flags & RD_EntityFlag_HasVAddr && contains_1u64(dasm_vaddr_range, loc->vaddr))
RD_Cfg *wp = n->v;
RD_Location loc = rd_location_from_cfg(wp);
if(contains_1u64(dasm_vaddr_range, loc.vaddr))
{
U64 off = loc->vaddr-dasm_vaddr_range.min;
U64 off = loc.vaddr - dasm_vaddr_range.min;
U64 idx = dasm_line_array_idx_from_code_off__linear_scan(dasm_lines, off);
S64 line_num = (S64)(idx+1);
S64 line_num = (S64)idx+1;
if(contains_1s64(visible_line_num_range, line_num))
{
U64 slice_line_idx = (line_num-visible_line_num_range.min);
rd_entity_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], pin);
rd_cfg_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], wp);
}
}
}
+48 -35
View File
@@ -829,8 +829,8 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
line_num += 1, line_idx += 1)
{
CTRL_EntityList line_ips = params->line_ips[line_idx];
RD_EntityList line_bps = params->line_bps[line_idx];
RD_EntityList line_pins = params->line_pins[line_idx];
RD_CfgList line_bps = params->line_bps[line_idx];
RD_CfgList line_pins = params->line_pins[line_idx];
ui_set_next_hover_cursor(OS_Cursor_HandPoint);
UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, "line_margin_%I64x", line_num);
UI_Parent(line_margin_box)
@@ -952,25 +952,26 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
}
//- rjf: build margin breakpoint ui
for(RD_EntityNode *n = line_bps.first; n != 0; n = n->next)
for(RD_CfgNode *n = line_bps.first; n != 0; n = n->next)
{
RD_Entity *bp = n->entity;
Vec4F32 bp_color = rd_rgba_from_theme_color(RD_ThemeColor_Breakpoint);
if(bp->flags & RD_EntityFlag_HasColor)
RD_Cfg *bp = n->v;
Vec4F32 bp_rgba = rd_rgba_from_cfg(bp);
B32 bp_is_disabled = rd_disabled_from_cfg(bp);
if(bp_rgba.w == 0)
{
bp_color = rd_rgba_from_entity(bp);
bp_rgba = rd_rgba_from_theme_color(RD_ThemeColor_Breakpoint);
}
if(bp->disabled)
if(bp_is_disabled)
{
bp_color = v4f32(bp_color.x * 0.6f, bp_color.y * 0.6f, bp_color.z * 0.6f, bp_color.w * 0.6f);
bp_rgba = v4f32(bp_rgba.x * 0.6f, bp_rgba.y * 0.6f, bp_rgba.z * 0.6f, bp_rgba.w * 0.6f);
}
// rjf: prep custom rendering data
RD_BreakpointBoxDrawExtData *bp_draw = push_array(ui_build_arena(), RD_BreakpointBoxDrawExtData, 1);
{
RD_Regs *hover_regs = rd_get_hover_regs();
B32 is_hovering = (rd_entity_from_handle(hover_regs->entity) == bp && rd_state->hover_regs_slot == RD_RegSlot_Entity);
bp_draw->color = bp_color;
B32 is_hovering = (rd_cfg_from_handle(hover_regs->cfg) == bp && rd_state->hover_regs_slot == RD_RegSlot_Cfg);
bp_draw->color = bp_rgba;
bp_draw->alive_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "bp_alive_t_%p", bp), 1.f, .rate = entity_alive_t_rate);
bp_draw->hover_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "bp_hover_t_%p", bp), (F32)!!is_hovering, .rate = entity_hover_t_rate);
bp_draw->do_lines = rd_setting_val_from_code(RD_SettingCode_BreakpointLines).s32;
@@ -995,7 +996,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
ui_set_next_font_size(params->font_size * 1.f);
ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth);
ui_set_next_hover_cursor(OS_Cursor_HandPoint);
ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = bp_color));
ui_set_next_palette(ui_build_palette(ui_top_palette(), .text = bp_rgba));
ui_set_next_text_alignment(UI_TextAlign_Center);
UI_Box *bp_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|
UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|
@@ -1009,42 +1010,46 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
// rjf: bp hovering
if(ui_hovering(bp_sig) && !rd_drag_is_active())
{
RD_RegsScope(.entity = rd_handle_from_entity(bp)) rd_set_hover_regs(RD_RegSlot_Entity);
RD_RegsScope(.entity = rd_handle_from_cfg(bp)) rd_set_hover_regs(RD_RegSlot_Entity);
}
// rjf: shift+click => enable breakpoint
if(ui_clicked(bp_sig) && bp_sig.event_flags & OS_Modifier_Shift)
{
rd_cmd(bp->disabled ? RD_CmdKind_EnableEntity : RD_CmdKind_DisableEntity, .entity = rd_handle_from_entity(bp));
rd_cmd(bp_is_disabled ? RD_CmdKind_EnableEntity : RD_CmdKind_DisableEntity, .cfg = rd_handle_from_cfg(bp));
}
// rjf: click => remove breakpoint
if(ui_clicked(bp_sig) && bp_sig.event_flags == 0)
{
rd_cmd(RD_CmdKind_RemoveEntity, .entity = rd_handle_from_entity(bp));
rd_cmd(RD_CmdKind_RemoveEntity, .cfg = rd_handle_from_cfg(bp));
}
// rjf: drag start
if(ui_dragging(bp_sig) && !contains_2f32(bp_box->rect, ui_mouse()))
{
RD_RegsScope(.entity = rd_handle_from_entity(bp)) rd_drag_begin(RD_RegSlot_Entity);
RD_RegsScope(.cfg = rd_handle_from_cfg(bp)) rd_drag_begin(RD_RegSlot_Cfg);
}
// rjf: bp right-click menu
if(ui_right_clicked(bp_sig))
{
RD_RegsScope(.entity = rd_handle_from_entity(bp)) rd_open_ctx_menu(bp_box->key, v2f32(0, bp_box->rect.y1-bp_box->rect.y0), RD_RegSlot_Entity);
rd_cmd(RD_CmdKind_PushQuery,
.cfg = rd_handle_from_cfg(bp),
.reg_slot= RD_RegSlot_Cfg,
.ui_key = bp_box->key,
.off_px = v2f32(0, bp_box->rect.y1-bp_box->rect.y0));
}
}
//- rjf: build margin watch pin ui
for(RD_EntityNode *n = line_pins.first; n != 0; n = n->next)
for(RD_CfgNode *n = line_pins.first; n != 0; n = n->next)
{
RD_Entity *pin = n->entity;
Vec4F32 color = rd_rgba_from_theme_color(RD_ThemeColor_Text);
if(pin->flags & RD_EntityFlag_HasColor)
RD_Cfg *pin = n->v;
Vec4F32 color = rd_rgba_from_cfg(pin);
if(color.w == 0)
{
color = rd_rgba_from_entity(pin);
color = rd_rgba_from_theme_color(RD_ThemeColor_Text);
}
// rjf: build box for watch
@@ -1065,25 +1070,29 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
// rjf: watch hovering
if(ui_hovering(pin_sig) && !rd_drag_is_active())
{
RD_RegsScope(.entity = rd_handle_from_entity(pin)) rd_set_hover_regs(RD_RegSlot_Entity);
RD_RegsScope(.cfg = rd_handle_from_cfg(pin)) rd_set_hover_regs(RD_RegSlot_Entity);
}
// rjf: click => remove pin
if(ui_clicked(pin_sig))
{
rd_cmd(RD_CmdKind_RemoveEntity, .entity = rd_handle_from_entity(pin));
rd_cmd(RD_CmdKind_RemoveEntity, .cfg = rd_handle_from_cfg(pin));
}
// rjf: drag start
if(ui_dragging(pin_sig) && !contains_2f32(pin_box->rect, ui_mouse()))
{
RD_RegsScope(.entity = rd_handle_from_entity(pin)) rd_drag_begin(RD_RegSlot_Entity);
RD_RegsScope(.cfg = rd_handle_from_cfg(pin)) rd_drag_begin(RD_RegSlot_Cfg);
}
// rjf: watch right-click menu
if(ui_right_clicked(pin_sig))
{
RD_RegsScope(.entity = rd_handle_from_entity(pin)) rd_open_ctx_menu(pin_box->key, v2f32(0, pin_box->rect.y1-pin_box->rect.y0), RD_RegSlot_Entity);
rd_cmd(RD_CmdKind_PushQuery,
.cfg = rd_handle_from_cfg(pin),
.reg_slot= RD_RegSlot_Cfg,
.ui_key = pin_box->key,
.off_px = v2f32(0, pin_box->rect.y1-pin_box->rect.y0));
}
}
}
@@ -1257,16 +1266,16 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
line_num < params->line_num_range.max;
line_num += 1, line_idx += 1)
{
RD_EntityList pins = params->line_pins[line_idx];
RD_CfgList pins = params->line_pins[line_idx];
if(pins.count != 0) UI_Parent(line_extras_boxes[line_idx])
RD_Font(RD_FontSlot_Code)
UI_FontSize(params->font_size)
UI_PrefHeight(ui_px(params->line_height_px, 1.f))
{
for(RD_EntityNode *n = pins.first; n != 0; n = n->next)
for(RD_CfgNode *n = pins.first; n != 0; n = n->next)
{
RD_Entity *pin = n->entity;
String8 pin_expr = pin->string;
RD_Cfg *pin = n->v;
String8 pin_expr = rd_expr_from_cfg(pin);
E_Eval eval = e_eval_from_string(scratch.arena, pin_expr);
String8 eval_string = {0};
if(!e_type_key_match(e_type_key_zero(), eval.type_key))
@@ -1283,10 +1292,10 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
UI_BoxFlag_DrawBorder, pin_box_key);
UI_Parent(pin_box) UI_PrefWidth(ui_text_dim(10, 1))
{
Vec4F32 pin_color = rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault);
if(pin->flags & RD_EntityFlag_HasColor)
Vec4F32 pin_color = rd_rgba_from_cfg(pin);
if(pin_color.w == 0)
{
pin_color = rd_rgba_from_entity(pin);
pin_color = rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault);
}
UI_PrefWidth(ui_em(1.5f, 1.f))
RD_Font(RD_FontSlot_Icons)
@@ -1297,11 +1306,15 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
UI_Signal sig = ui_buttonf("%S###pin_nub", rd_icon_kind_text_table[RD_IconKind_Pin]);
if(ui_dragging(sig) && !contains_2f32(sig.box->rect, ui_mouse()))
{
RD_RegsScope(.entity = rd_handle_from_entity(pin)) rd_drag_begin(RD_RegSlot_Entity);
RD_RegsScope(.cfg = rd_handle_from_cfg(pin)) rd_drag_begin(RD_RegSlot_Cfg);
}
if(ui_right_clicked(sig))
{
RD_RegsScope(.entity = rd_handle_from_entity(pin)) rd_open_ctx_menu(sig.box->key, v2f32(0, sig.box->rect.y1-sig.box->rect.y0), RD_RegSlot_Entity);
rd_cmd(RD_CmdKind_PushQuery,
.cfg = rd_handle_from_cfg(pin),
.reg_slot= RD_RegSlot_Cfg,
.ui_key = sig.box->key,
.off_px = v2f32(0, sig.box->rect.y1-sig.box->rect.y0));
}
}
rd_code_label(0.8f, 1, rd_rgba_from_theme_color(RD_ThemeColor_CodeDefault), pin_expr);
+2 -2
View File
@@ -43,9 +43,9 @@ struct RD_CodeSliceParams
String8 *line_text;
Rng1U64 *line_ranges;
TXT_TokenArray *line_tokens;
RD_EntityList *line_bps;
RD_CfgList *line_bps;
CTRL_EntityList *line_ips;
RD_EntityList *line_pins;
RD_CfgList *line_pins;
U64 *line_vaddrs;
D_LineList *line_infos;
DI_KeyList relevant_dbgi_keys;