mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 22:08:41 +00:00
shift source ctx menu to universal ctx menu path
This commit is contained in:
@@ -3332,6 +3332,131 @@ rd_window_frame(RD_Window *ws)
|
|||||||
{
|
{
|
||||||
default:{}break;
|
default:{}break;
|
||||||
|
|
||||||
|
//////////////////////
|
||||||
|
//- rjf: source code locations
|
||||||
|
//
|
||||||
|
case RD_RegSlot_Cursor:
|
||||||
|
{
|
||||||
|
TXT_Scope *txt_scope = txt_scope_open();
|
||||||
|
HS_Scope *hs_scope = hs_scope_open();
|
||||||
|
TxtRng range = txt_rng(regs->cursor, regs->mark);
|
||||||
|
D_LineList lines = regs->lines;
|
||||||
|
if(!txt_pt_match(range.min, range.max) && ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_Copy].string)))
|
||||||
|
{
|
||||||
|
U128 hash = {0};
|
||||||
|
TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, regs->text_key, regs->lang_kind, &hash);
|
||||||
|
String8 data = hs_data_from_hash(hs_scope, hash);
|
||||||
|
String8 copy_data = txt_string_from_info_data_txt_rng(&info, data, range);
|
||||||
|
os_set_clipboard_text(copy_data);
|
||||||
|
ui_ctx_menu_close();
|
||||||
|
}
|
||||||
|
if(range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_RightArrow, 0, "Set Next Statement")))
|
||||||
|
{
|
||||||
|
CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread);
|
||||||
|
U64 new_rip_vaddr = regs->vaddr;
|
||||||
|
if(regs->file_path.size != 0)
|
||||||
|
{
|
||||||
|
for(D_LineNode *n = lines.first; n != 0; n = n->next)
|
||||||
|
{
|
||||||
|
CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, d_state->ctrl_entity_store, &n->v.dbgi_key);
|
||||||
|
CTRL_Entity *module = ctrl_module_from_thread_candidates(d_state->ctrl_entity_store, thread, &modules);
|
||||||
|
if(module != &ctrl_entity_nil)
|
||||||
|
{
|
||||||
|
new_rip_vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rd_cmd(RD_CmdKind_SetThreadIP, .vaddr = new_rip_vaddr);
|
||||||
|
ui_ctx_menu_close();
|
||||||
|
}
|
||||||
|
if(range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_Play, 0, "Run To Line")))
|
||||||
|
{
|
||||||
|
if(regs->file_path.size != 0)
|
||||||
|
{
|
||||||
|
rd_cmd(RD_CmdKind_RunToLine, .file_path = regs->file_path, .cursor = range.min);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rd_cmd(RD_CmdKind_RunToAddress, .vaddr = regs->vaddr);
|
||||||
|
}
|
||||||
|
ui_ctx_menu_close();
|
||||||
|
}
|
||||||
|
if(range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_Null, 0, "Go To Name")))
|
||||||
|
{
|
||||||
|
U128 hash = {0};
|
||||||
|
TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, regs->text_key, regs->lang_kind, &hash);
|
||||||
|
String8 data = hs_data_from_hash(hs_scope, hash);
|
||||||
|
Rng1U64 expr_off_range = {0};
|
||||||
|
if(range.min.column != range.max.column)
|
||||||
|
{
|
||||||
|
expr_off_range = r1u64(txt_off_from_info_pt(&info, range.min), txt_off_from_info_pt(&info, range.max));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
expr_off_range = txt_expr_off_range_from_info_data_pt(&info, data, range.min);
|
||||||
|
}
|
||||||
|
String8 expr = str8_substr(data, expr_off_range);
|
||||||
|
rd_cmd(RD_CmdKind_GoToName, .string = expr);
|
||||||
|
ui_ctx_menu_close();
|
||||||
|
}
|
||||||
|
if(range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_CircleFilled, 0, "Toggle Breakpoint")))
|
||||||
|
{
|
||||||
|
rd_cmd(RD_CmdKind_ToggleBreakpoint,
|
||||||
|
.file_path = regs->file_path,
|
||||||
|
.cursor = range.min,
|
||||||
|
.vaddr = regs->vaddr);
|
||||||
|
ui_ctx_menu_close();
|
||||||
|
}
|
||||||
|
if(range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_Binoculars, 0, "Toggle Watch Expression")))
|
||||||
|
{
|
||||||
|
U128 hash = {0};
|
||||||
|
TXT_TextInfo info = txt_text_info_from_key_lang(txt_scope, regs->text_key, regs->lang_kind, &hash);
|
||||||
|
String8 data = hs_data_from_hash(hs_scope, hash);
|
||||||
|
Rng1U64 expr_off_range = {0};
|
||||||
|
if(range.min.column != range.max.column)
|
||||||
|
{
|
||||||
|
expr_off_range = r1u64(txt_off_from_info_pt(&info, range.min), txt_off_from_info_pt(&info, range.max));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
expr_off_range = txt_expr_off_range_from_info_data_pt(&info, data, range.min);
|
||||||
|
}
|
||||||
|
String8 expr = str8_substr(data, expr_off_range);
|
||||||
|
rd_cmd(RD_CmdKind_ToggleWatchExpression, .string = expr);
|
||||||
|
ui_ctx_menu_close();
|
||||||
|
}
|
||||||
|
if(regs->file_path.size == 0 && range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_FileOutline, 0, "Go To Source")))
|
||||||
|
{
|
||||||
|
if(lines.first != 0)
|
||||||
|
{
|
||||||
|
rd_cmd(RD_CmdKind_FindCodeLocation,
|
||||||
|
.file_path = lines.first->v.file_path,
|
||||||
|
.cursor = lines.first->v.pt);
|
||||||
|
}
|
||||||
|
ui_ctx_menu_close();
|
||||||
|
}
|
||||||
|
if(regs->file_path.size != 0 && range.min.line == range.max.line && ui_clicked(rd_icon_buttonf(RD_IconKind_FileOutline, 0, "Go To Disassembly")))
|
||||||
|
{
|
||||||
|
CTRL_Entity *thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread);
|
||||||
|
U64 vaddr = 0;
|
||||||
|
for(D_LineNode *n = lines.first; n != 0; n = n->next)
|
||||||
|
{
|
||||||
|
CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, d_state->ctrl_entity_store, &n->v.dbgi_key);
|
||||||
|
CTRL_Entity *module = ctrl_module_from_thread_candidates(d_state->ctrl_entity_store, thread, &modules);
|
||||||
|
if(module != &ctrl_entity_nil)
|
||||||
|
{
|
||||||
|
vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rd_cmd(RD_CmdKind_FindCodeLocation, .vaddr = vaddr);
|
||||||
|
ui_ctx_menu_close();
|
||||||
|
}
|
||||||
|
hs_scope_close(hs_scope);
|
||||||
|
txt_scope_close(txt_scope);
|
||||||
|
}break;
|
||||||
|
|
||||||
//////////////////////
|
//////////////////////
|
||||||
//- rjf: tabs
|
//- rjf: tabs
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -1799,20 +1799,19 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe
|
|||||||
{
|
{
|
||||||
*cursor = *mark = mouse_pt;
|
*cursor = *mark = mouse_pt;
|
||||||
}
|
}
|
||||||
ui_ctx_menu_open(rd_state->code_ctx_menu_key, ui_key_zero(), sub_2f32(ui_mouse(), v2f32(2, 2)));
|
U64 vaddr = 0;
|
||||||
RD_Window *window = rd_window_from_handle(rd_regs()->window);
|
D_LineList lines = {0};
|
||||||
arena_clear(window->code_ctx_menu_arena);
|
|
||||||
window->code_ctx_menu_file_path = push_str8_copy(window->code_ctx_menu_arena, rd_regs()->file_path);
|
|
||||||
window->code_ctx_menu_text_key = rd_regs()->text_key;
|
|
||||||
window->code_ctx_menu_lang_kind = rd_regs()->lang_kind;
|
|
||||||
window->code_ctx_menu_range = txt_rng(*cursor, *mark);
|
|
||||||
if(params->line_num_range.min <= cursor->line && cursor->line < params->line_num_range.max)
|
if(params->line_num_range.min <= cursor->line && cursor->line < params->line_num_range.max)
|
||||||
{
|
{
|
||||||
window->code_ctx_menu_vaddr = params->line_vaddrs[cursor->line - params->line_num_range.min];
|
vaddr = params->line_vaddrs[cursor->line - params->line_num_range.min];
|
||||||
|
lines = params->line_infos[cursor->line - params->line_num_range.min];
|
||||||
}
|
}
|
||||||
if(params->line_num_range.min <= cursor->line && cursor->line < params->line_num_range.max)
|
RD_RegsScope(.cursor = *cursor,
|
||||||
|
.mark = *mark,
|
||||||
|
.vaddr = vaddr,
|
||||||
|
.lines = lines)
|
||||||
{
|
{
|
||||||
window->code_ctx_menu_lines = d_line_list_copy(window->code_ctx_menu_arena, ¶ms->line_infos[cursor->line - params->line_num_range.min]);
|
rd_open_ctx_menu(ui_key_zero(), sub_2f32(ui_mouse(), v2f32(2, 2)), RD_RegSlot_Cursor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user