From 95dd544871aee79905d6c1f65a9033576485ca43 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 7 Oct 2024 13:54:30 -0700 Subject: [PATCH] top-level text editing mode state, so that textual keys can be used for hotkeys, but just become disabled when text editing is actually happening --- src/raddbg/raddbg_core.c | 20 +++++++++++++++----- src/raddbg/raddbg_core.h | 3 +++ src/raddbg/raddbg_views.c | 1 + src/raddbg/raddbg_widgets.c | 1 + 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 60581c73..bcbd7a14 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -10708,6 +10708,8 @@ rd_frame(void) rd_state->frame_di_scope = di_scope_open(); rd_state->frame_fzy_scope = fzy_scope_open(); } + B32 allow_text_hotkeys = !rd_state->text_edit_mode; + rd_state->text_edit_mode = 0; ////////////////////////////// //- rjf: get events from the OS @@ -10806,7 +10808,7 @@ rd_frame(void) rd_unbind_name(rd_state->bind_change_cmd_name, rd_state->bind_change_binding); 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, os_handle_zero(), codepoint); + 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(); @@ -10891,12 +10893,20 @@ rd_frame(void) String8List spec_candidates = rd_cmd_name_list_from_binding(scratch.arena, binding); if(spec_candidates.first != 0) { - rd_cmd(RD_CmdKind_RunCommand, .string = spec_candidates.first->string); U32 hit_char = os_codepoint_from_modifiers_and_key(event->modifiers, event->key); - take = 1; - if(event->modifiers & OS_Modifier_Alt) + if(hit_char == 0 || allow_text_hotkeys) { - window->menu_bar_focus_press_started = 0; + rd_cmd(RD_CmdKind_RunCommand, .string = spec_candidates.first->string); + if(allow_text_hotkeys) + { + os_text(&events, event->window, hit_char); + next = event->next; + } + take = 1; + if(event->modifiers & OS_Modifier_Alt) + { + window->menu_bar_focus_press_started = 0; + } } } else if(OS_Key_F1 <= event->key && event->key <= OS_Key_F19) diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index acf2666f..d1769e55 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -811,6 +811,9 @@ struct RD_State String8 popup_title; String8 popup_desc; + // rjf: text editing mode state + B32 text_edit_mode; + // rjf: string search state Arena *string_search_arena; String8 string_search_string; diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 5779e1c3..23d79a32 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1584,6 +1584,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo B32 editing_complete = ((evt->kind == UI_EventKind_Press && (evt->slot == UI_EventActionSlot_Cancel || evt->slot == UI_EventActionSlot_Accept)) || (evt->kind == UI_EventKind_Navigate && evt->delta_2s32.y != 0) || cursor_rugpull); + rd_state->text_edit_mode = 1; if(editing_complete || ((evt->kind == UI_EventKind_Edit || evt->kind == UI_EventKind_Navigate || diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 74c29b37..d67ca695 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -3028,6 +3028,7 @@ rd_line_edit(RD_LineEditFlags flags, S32 depth, FuzzyMatchRangeList *matches, Tx if(!(flags & RD_LineEditFlag_DisableEdit) && (is_focus_active || focus_started)) { Temp scratch = scratch_begin(0, 0); + rd_state->text_edit_mode = 1; for(UI_Event *evt = 0; ui_next_event(&evt);) { String8 edit_string = str8(edit_buffer, edit_string_size_out[0]);