From fa981597eab04a04c0d862f20cb924bbdfee00a6 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 23 Jan 2024 13:08:00 -0800 Subject: [PATCH] add support in ui layer for re-rooting keyboard focus stack, which short-circuits the focus-off search through the focus stack --- src/ui/ui_core.c | 12 ++++++++++++ src/ui/ui_core.h | 1 + 2 files changed, 13 insertions(+) diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 12d96464..8cbb66a8 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -1668,12 +1668,16 @@ ui_begin_ctx_menu(UI_Key key) } ui_push_pref_width(ui_bottom_pref_width()); ui_push_pref_height(ui_bottom_pref_height()); + ui_push_focus_hot(UI_FocusKind_Root); + ui_push_focus_active(UI_FocusKind_Root); return result; } internal void ui_end_ctx_menu(void) { + ui_pop_focus_active(); + ui_pop_focus_hot(); ui_pop_pref_width(); ui_pop_pref_height(); ui_pop_parent(); @@ -1702,6 +1706,10 @@ ui_is_focus_hot(void) { for(UI_FocusHotNode *n = ui_state->focus_hot_stack.top; n != 0; n = n->next) { + if(n->v == UI_FocusKind_Root) + { + break; + } if(n->v == UI_FocusKind_Off) { result = 0; @@ -1720,6 +1728,10 @@ ui_is_focus_active(void) { for(UI_FocusActiveNode *n = ui_state->focus_active_stack.top; n != 0; n = n->next) { + if(n->v == UI_FocusKind_Root) + { + break; + } if(n->v == UI_FocusKind_Off) { result = 0; diff --git a/src/ui/ui_core.h b/src/ui/ui_core.h index f1f72624..a845bb0b 100644 --- a/src/ui/ui_core.h +++ b/src/ui/ui_core.h @@ -39,6 +39,7 @@ typedef enum UI_FocusKind UI_FocusKind_Null, UI_FocusKind_Off, UI_FocusKind_On, + UI_FocusKind_Root, UI_FocusKind_COUNT } UI_FocusKind;