From 4371d727fb54a10ea1e9c08d6bb19d87e45dded5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 17 Jan 2025 13:34:18 -0800 Subject: [PATCH] line expressions in eval lang; begin getting off of entities for breakpoints/watch-pins/etc., move -> cfg --- src/eval/eval.mdesk | 2 + src/eval/eval_ir.c | 45 +++ src/eval/generated/eval.meta.c | 6 +- src/eval/generated/eval.meta.h | 5 +- src/raddbg/generated/raddbg.meta.c | 4 +- src/raddbg/generated/raddbg.meta.h | 8 +- src/raddbg/raddbg.mdesk | 2 + src/raddbg/raddbg_core.c | 442 +++++++++++++---------------- src/raddbg/raddbg_core.h | 19 ++ src/raddbg/raddbg_views.c | 68 ++--- src/raddbg/raddbg_widgets.c | 83 +++--- src/raddbg/raddbg_widgets.h | 4 +- 12 files changed, 366 insertions(+), 322 deletions(-) diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index f6de6560..0c7aba70 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -132,6 +132,8 @@ E_ExprKindTable: { Array Null 0 "array" "" "" "" } { Func Null 0 "function" "" "" "" } + { Line Binary 1 ":" "" ":" "" } + { Define Binary 13 "=" "" "=" "" } } diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 9c08b133..49fdda40 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -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: { diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index 35b65640..dd52f65a 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -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("") }, }; diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index 2a6200ba..c4dc0adc 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -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]; diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 7e56a987..d63c1116 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -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)}, diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index 199f4738..eeb77547 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -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]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 33aa7c04..c8812019 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -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 } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index c851cae2..16c828dd 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -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); diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 5670d3c3..5f897bc7 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -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 diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index eaa496e1..22ecf4f0 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -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); } } } diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 209bf857..80027037 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -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); diff --git a/src/raddbg/raddbg_widgets.h b/src/raddbg/raddbg_widgets.h index 9048161e..3774f7fe 100644 --- a/src/raddbg/raddbg_widgets.h +++ b/src/raddbg/raddbg_widgets.h @@ -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;