From e10bef9d2b20bc75048a7a85e4b596ff313cdba5 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 26 Jun 2024 12:05:56 -0700 Subject: [PATCH] fix function breakpoints using hit-count as voff; pass over entity ref buttons in various uis; go-to-location with address values in watch views --- src/df/core/df_core.c | 10 ++- src/df/gfx/df_gfx.c | 23 +++---- src/df/gfx/df_gfx.h | 2 +- src/df/gfx/df_views.c | 143 +++++++++++++++++++++++++++++++----------- src/df/gfx/df_views.h | 13 +++- src/raddbg/raddbg.h | 7 +-- 6 files changed, 142 insertions(+), 56 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index e1c30fb6..53e88c8d 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -4054,7 +4054,6 @@ df_ctrl_run(DF_RunKind run, DF_Entity *run_thread, CTRL_RunFlags flags, CTRL_Tra { ctrl_user_bp_kind = CTRL_UserBreakpointKind_SymbolNameAndOffset; ctrl_user_bp_string = symb->name; - ctrl_user_bp_u64 = user_bp->u64; } } @@ -7056,6 +7055,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) for(DF_EntityNode *n = user_bps.first; n != 0; n = n->next) { DF_Entity *bp = n->entity; + DF_Entity *symb = df_entity_child_from_kind(bp, DF_EntityKind_EntryPointName); if(bp->flags & DF_EntityFlag_HasVAddr && bp->vaddr == stop_thread_vaddr) { bp->u64 += 1; @@ -7073,6 +7073,14 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) } } } + if(!df_entity_is_nil(symb)) + { + U64 symb_voff = df_voff_from_dbgi_key_symbol_name(&dbgi_key, symb->name); + if(symb_voff == stop_thread_voff) + { + bp->u64 += 1; + } + } } } diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 61853333..77f68220 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -5417,7 +5417,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) } //- rjf: restart button - if(!can_play && processes.count != 0) UI_TextAlignment(UI_TextAlign_Center) + else UI_TextAlignment(UI_TextAlign_Center) UI_Palette(ui_build_palette(ui_top_palette(), .text = df_rgba_from_theme_color(DF_ThemeColor_TextPositive))) { UI_Signal sig = ui_button(df_g_icon_kind_text_table[DF_IconKind_Redo]); @@ -10457,8 +10457,8 @@ df_entity_tooltips(DF_Entity *entity) scratch_end(scratch); } -internal void -df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *name_matches, String8 fuzzy_query) +internal UI_Signal +df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *name_matches, String8 fuzzy_query, B32 is_implicit) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -10490,10 +10490,10 @@ df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *nam { palette = df_palette_from_code(DF_PaletteCode_NeutralPopButton); } - ui_set_next_hover_cursor(OS_Cursor_HandPoint); ui_set_next_palette(palette); + ui_set_next_hover_cursor(OS_Cursor_HandPoint); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable| - UI_BoxFlag_DrawBorder| + (!is_implicit*UI_BoxFlag_DrawBorder)| UI_BoxFlag_DrawBackground| UI_BoxFlag_DrawHotEffects| UI_BoxFlag_DrawActiveEffects, @@ -10609,9 +10609,9 @@ df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *nam } //- rjf: do interaction on main box + UI_Signal sig = ui_signal_from_box(box); { - UI_Signal sig = ui_signal_from_box(box); - if(ui_key_match(box->key, ui_hot_key())) + if(ui_hovering(sig) && !df_drag_is_active()) { df_entity_tooltips(entity); } @@ -10644,6 +10644,7 @@ df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *nam } scratch_end(scratch); ProfEnd(); + return sig; } internal void @@ -11032,7 +11033,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } // rjf: hover tooltips - if(ui_hovering(thread_sig)) + if(ui_hovering(thread_sig) && !df_drag_is_active()) { df_entity_tooltips(thread); } @@ -11187,7 +11188,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ } // rjf: hover tooltips - if(ui_hovering(thread_sig)) + if(ui_hovering(thread_sig) && !df_drag_is_active()) { df_entity_tooltips(thread); } @@ -11274,7 +11275,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ UI_Signal bp_sig = ui_signal_from_box(bp_box); // rjf: bp hovering - if(ui_hovering(bp_sig)) + if(ui_hovering(bp_sig) && !df_drag_is_active()) { df_entity_tooltips(bp); } @@ -11334,7 +11335,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ UI_Signal pin_sig = ui_signal_from_box(pin_box); // rjf: watch hovering - if(ui_hovering(pin_sig)) + if(ui_hovering(pin_sig) && !df_drag_is_active()) { df_entity_tooltips(pin); } diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index 8b9f469c..94edcca0 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -1072,7 +1072,7 @@ internal void df_cmd_list_menu_buttons(DF_Window *ws, U64 count, DF_CoreCmdKind 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 void df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *name_matches, String8 fuzzy_query); +internal UI_Signal df_entity_desc_button(DF_Window *ws, DF_Entity *entity, FuzzyMatchRangeList *name_matches, String8 fuzzy_query, B32 is_implicit); internal void df_entity_src_loc_button(DF_Window *ws, DF_Entity *entity, TxtPt point); //////////////////////////////// diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index e026a2b0..8c36c7e8 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -432,7 +432,7 @@ df_code_view_cmds(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_CodeViewStat } internal void -df_code_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_CodeViewState *cv, DF_CodeViewFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_InstArray *dasm_insts, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key) +df_code_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_CodeViewState *cv, DF_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_InstArray *dasm_insts, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key) { ProfBeginFunction(); Temp scratch = scratch_begin(0, 0); @@ -503,7 +503,7 @@ df_code_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_CodeViewSta F32 line_num_width_px = big_glyph_advance * (log10(visible_line_num_range.max) + 3); F32 priority_margin_width_px = 0; F32 catchall_margin_width_px = 0; - if(flags & DF_CodeViewFlag_Margins) + if(flags & DF_CodeViewBuildFlag_Margins) { priority_margin_width_px = big_glyph_advance*3.5f; catchall_margin_width_px = big_glyph_advance*3.5f; @@ -534,7 +534,7 @@ df_code_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_CodeViewSta { // rjf: fill basics code_slice_params.flags = DF_CodeSliceFlag_LineNums|DF_CodeSliceFlag_Clickable; - if(flags & DF_CodeViewFlag_Margins) + if(flags & DF_CodeViewBuildFlag_Margins) { code_slice_params.flags |= DF_CodeSliceFlag_PriorityMargin|DF_CodeSliceFlag_CatchallMargin; } @@ -1867,6 +1867,40 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS } } + ////////////////////////// + //- rjf: [table] do cell-granularity go-to-locations + // + if(!ewv->text_editing && evt->slot == UI_EventActionSlot_Accept && + selection_tbl.min.x == selection_tbl.max.x && + selection_tbl.min.y == selection_tbl.max.y && + selection_tbl.min.x == 1) + { + taken = 1; + DF_EvalVizWindowedRowList rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, di_scope, &ctrl_ctx, &parse_ctx, ¯o_map, eval_view, default_radix, code_font, ui_top_font_size(), + r1s64(ui_scroll_list_row_from_item(&row_blocks, selection_tbl.min.y-1), + ui_scroll_list_row_from_item(&row_blocks, selection_tbl.max.y-1)+1), &blocks); + DF_EvalVizRow *row = rows.first; + if(!(row->flags & DF_EvalVizRowFlag_CanEditValue)) + { + U64 vaddr = 0; + if(vaddr == 0) { vaddr = row->eval.offset; } + if(vaddr == 0) { vaddr = row->eval.imm_u64; } + DF_Entity *module = df_module_from_process_vaddr(process, vaddr); + DI_Key dbgi_key = df_dbgi_key_from_module(module); + U64 voff = df_voff_from_vaddr(module, vaddr); + DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, voff); + DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); + p.entity = df_handle_from_entity(process); + p.vaddr = vaddr; + if(lines.first != 0) + { + p.file_path = df_full_path_from_entity(scratch.arena, df_entity_from_handle(lines.first->v.file)); + p.text_point = lines.first->v.pt; + } + df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); + } + } + ////////////////////////// //- rjf: [text] apply textual edits // @@ -2746,6 +2780,27 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Edit)); } + + // rjf: double-click, not editable -> go-to-location + if(ui_double_clicked(sig) && !(row->flags & DF_EvalVizRowFlag_CanEditValue)) + { + U64 vaddr = 0; + if(vaddr == 0) { vaddr = row->eval.offset; } + if(vaddr == 0) { vaddr = row->eval.imm_u64; } + DF_Entity *module = df_module_from_process_vaddr(process, vaddr); + DI_Key dbgi_key = df_dbgi_key_from_module(module); + U64 voff = df_voff_from_vaddr(module, vaddr); + DF_LineList lines = df_lines_from_dbgi_key_voff(scratch.arena, &dbgi_key, voff); + DF_CmdParams p = df_cmd_params_from_view(ws, panel, view); + p.entity = df_handle_from_entity(process); + p.vaddr = vaddr; + if(lines.first != 0) + { + p.file_path = df_full_path_from_entity(scratch.arena, df_entity_from_handle(lines.first->v.file)); + p.text_point = lines.first->v.pt; + } + df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FindCodeLocation)); + } } //////////////////// @@ -4617,7 +4672,7 @@ DF_VIEW_UI_FUNCTION_DEF(Targets) // rjf: target name UI_WidthFill UI_FocusHot((row_selected && cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) { - df_entity_desc_button(ws, target, &targets.v[row_idx-1].matches, query); + df_entity_desc_button(ws, target, &targets.v[row_idx-1].matches, query, 0); } // rjf: controls @@ -5473,7 +5528,7 @@ DF_VIEW_UI_FUNCTION_DEF(Scheduler) UI_TableCellSized(ui_pct(1, 0)) UI_FocusHot((row_is_selected && desc_col_rng.min <= cursor.x && cursor.x <= desc_col_rng.max) ? UI_FocusKind_On : UI_FocusKind_Off) { - df_entity_desc_button(ws, entity, &items.v[idx].matches, query); + df_entity_desc_button(ws, entity, &items.v[idx].matches, query, 0); } switch(entity->kind) { @@ -5627,16 +5682,22 @@ DF_VIEW_UI_FUNCTION_DEF(CallStack) { ui_set_next_flags(UI_BoxFlag_Disabled); } - F32 *col_pcts[] = { &cs->selection_col_pct, &cs->module_col_pct, &cs->function_name_col_pct, &cs->addr_col_pct }; + F32 *col_pcts[] = + { + &cs->selection_col_pct, + &cs->function_name_col_pct, + &cs->addr_col_pct, + &cs->module_col_pct, + }; UI_TableF(ArrayCount(col_pcts), col_pcts, "###tbl") { //- rjf: header if(visible_row_range.min == 0) UI_TableVector UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) { UI_TableCell {} - UI_TableCell ui_label(str8_lit("Module")); UI_TableCell ui_label(str8_lit("Function Name")); UI_TableCell ui_label(str8_lit("Address")); + UI_TableCell ui_label(str8_lit("Module")); } //- rjf: frame rows @@ -5711,29 +5772,9 @@ DF_VIEW_UI_FUNCTION_DEF(CallStack) } } - // rjf: build cell for module - UI_TableCell UI_FocusHot((row_selected && cs->cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) - { - if(df_entity_is_nil(module)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) - { - UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "(No Module)###moduleless_frame_%I64x", frame_idx); - UI_Signal sig = ui_signal_from_box(box); - if(ui_pressed(sig)) - { - next_cursor = v2s64(1, (S64)frame_idx+1); - DF_CmdParams p = df_cmd_params_from_panel(ws, panel); - df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); - } - } - else - { - df_entity_desc_button(ws, module, 0, str8_zero()); - } - } - // rjf: build cell for function header UI_TableCell UI_Font(df_font_from_slot(DF_FontSlot_Code)) - UI_FocusHot((row_selected && cs->cursor.x == 2) ? UI_FocusKind_On : UI_FocusKind_Off) + UI_FocusHot((row_selected && cs->cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) { ui_set_next_child_layout_axis(Axis2_X); UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_Clip, "frame_%I64x", frame_idx); @@ -5766,7 +5807,7 @@ DF_VIEW_UI_FUNCTION_DEF(CallStack) UI_Signal sig = ui_signal_from_box(box); if(ui_pressed(sig)) { - next_cursor = v2s64(2, (S64)frame_idx+1); + next_cursor = v2s64(1, (S64)frame_idx+1); DF_CmdParams p = df_cmd_params_from_panel(ws, panel); df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); } @@ -5783,11 +5824,41 @@ DF_VIEW_UI_FUNCTION_DEF(CallStack) // rjf: build cell for rip UI_TableCell - UI_FocusHot((row_selected && cs->cursor.x == 3) ? UI_FocusKind_On : UI_FocusKind_Off) + UI_FocusHot((row_selected && cs->cursor.x == 2) ? UI_FocusKind_On : UI_FocusKind_Off) { UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "0x%I64x", rip_vaddr); UI_Signal sig = ui_signal_from_box(box); if(ui_pressed(sig)) + { + next_cursor = v2s64(2, (S64)frame_idx+1); + DF_CmdParams p = df_cmd_params_from_panel(ws, panel); + df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_FocusPanel)); + } + if(ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed) + { + DF_CmdParams params = df_cmd_params_from_view(ws, panel, view); + df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_BaseUnwindIndex); + df_cmd_params_mark_slot(¶ms, DF_CmdParamSlot_InlineUnwindIndex); + params.base_unwind_index = frame->base_unwind_idx; + params.inline_unwind_index = frame->inline_unwind_idx; + df_push_cmd__root(¶ms, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_SelectUnwind)); + } + } + + // rjf: build cell for module + UI_TableCell UI_FocusHot((row_selected && cs->cursor.x == 3) ? UI_FocusKind_On : UI_FocusKind_Off) + { + UI_Signal sig = {0}; + if(df_entity_is_nil(module)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) + { + UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, "(No Module)###moduleless_frame_%I64x", frame_idx); + sig = ui_signal_from_box(box); + } + else + { + sig = df_entity_desc_button(ws, module, 0, str8_zero(), 1); + } + if(ui_pressed(sig)) { next_cursor = v2s64(3, (S64)frame_idx+1); DF_CmdParams p = df_cmd_params_from_panel(ws, panel); @@ -6014,7 +6085,7 @@ DF_VIEW_UI_FUNCTION_DEF(Modules) { UI_TableCellSized(ui_pct(1, 0)) UI_FocusHot((row_is_selected) ? UI_FocusKind_On : UI_FocusKind_Off) { - df_entity_desc_button(ws, entity, &items.v[idx].matches, query); + df_entity_desc_button(ws, entity, &items.v[idx].matches, query, 0); } } idx_in_process = 0; @@ -6028,7 +6099,7 @@ DF_VIEW_UI_FUNCTION_DEF(Modules) } UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) { - df_entity_desc_button(ws, entity, &items.v[idx].matches, query); + df_entity_desc_button(ws, entity, &items.v[idx].matches, query, 1); } UI_TableCell UI_Font(df_font_from_slot(DF_FontSlot_Code)) UI_FocusHot((row_is_selected && cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) { @@ -6432,7 +6503,7 @@ DF_VIEW_UI_FUNCTION_DEF(Code) // if(!entity_is_missing && key_has_data) { - df_code_view_build(ws, panel, view, cv, DF_CodeViewFlag_All, code_area_rect, data, &info, 0, r1u64(0, 0), di_key_zero()); + df_code_view_build(ws, panel, view, cv, DF_CodeViewBuildFlag_All, code_area_rect, data, &info, 0, r1u64(0, 0), di_key_zero()); } ////////////////////////////// @@ -6682,7 +6753,7 @@ DF_VIEW_UI_FUNCTION_DEF(Disassembly) // if(!is_loading && has_disasm) { - df_code_view_build(ws, panel, view, cv, DF_CodeViewFlag_All, code_area_rect, dasm_text_data, &dasm_text_info, &dasm_info.insts, dasm_vaddr_range, dasm_dbgi_key); + df_code_view_build(ws, panel, view, cv, DF_CodeViewBuildFlag_All, code_area_rect, dasm_text_data, &dasm_text_info, &dasm_info.insts, dasm_vaddr_range, dasm_dbgi_key); } ////////////////////////////// @@ -7951,7 +8022,7 @@ DF_VIEW_UI_FUNCTION_DEF(Breakpoints) } UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) { - df_entity_desc_button(ws, entity, &entities.v[idx-1].matches, query); + df_entity_desc_button(ws, entity, &entities.v[idx-1].matches, query, 1); } UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 2) ? UI_FocusKind_On : UI_FocusKind_Off) { @@ -8117,7 +8188,7 @@ DF_VIEW_UI_FUNCTION_DEF(WatchPins) { UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 0) ? UI_FocusKind_On : UI_FocusKind_Off) { - df_entity_desc_button(ws, entity, &entities.v[idx-1].matches, query); + df_entity_desc_button(ws, entity, &entities.v[idx-1].matches, query, 1); } UI_TableCell UI_FocusHot((row_is_selected && cursor.x == 1) ? UI_FocusKind_On : UI_FocusKind_Off) { diff --git a/src/df/gfx/df_views.h b/src/df/gfx/df_views.h index cc21af32..69f13aae 100644 --- a/src/df/gfx/df_views.h +++ b/src/df/gfx/df_views.h @@ -364,8 +364,14 @@ struct DF_WatchViewState typedef U32 DF_CodeViewFlags; enum { - DF_CodeViewFlag_Margins = (1<<0), - DF_CodeViewFlag_All = 0xffffffff, + 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; @@ -376,6 +382,7 @@ struct DF_CodeViewState S64 preferred_column; B32 drifted_for_search; DF_Handle pick_file_override_target; + DF_CodeViewFlags flags; // rjf: per-frame command info S64 goto_line_num; @@ -465,7 +472,7 @@ internal void df_entity_lister_item_array_sort_by_strength__in_place(DF_EntityLi internal void df_code_view_init(DF_CodeViewState *cv, DF_View *view); internal void df_code_view_cmds(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_CodeViewState *cv, DF_CmdList *cmds, String8 text_data, TXT_TextInfo *text_info, DASM_InstArray *dasm_insts, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key); -internal void df_code_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_CodeViewState *cv, DF_CodeViewFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_InstArray *dasm_insts, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key); +internal void df_code_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_CodeViewState *cv, DF_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_InstArray *dasm_insts, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key); //////////////////////////////// //~ rjf: Watch Views diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 62209438..30597f35 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -35,10 +35,6 @@ // [ ] theme lister -> fonts & font sizes // [ ] "Browse..." buttons should adopt a more relevant starting search path, // if possible -// -// [x] highlighted text & ctrl+f -> auto-fill search query -// [ ] double click on procedure in procedures tab to jump to source -// [ ] double-click any part of frame in callstack view -> snap to function //////////////////////////////// //~ rjf: Frontend/UI Pass Tasks @@ -421,6 +417,9 @@ // opens the context window. It seems like maybe menus should be right, // and left should do the default action, more consistently? // +// [x] double click on procedure in procedures tab to jump to source +// [x] highlighted text & ctrl+f -> auto-fill search query +// [x] double-click any part of frame in callstack view -> snap to function #ifndef RADDBG_H #define RADDBG_H