From 7d01c3046b1e81d224ae319e6d71f9eaec54b80a Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 29 Feb 2024 21:22:56 -0800 Subject: [PATCH] M_OpenVirtualKeyboard: add optional dummymenu argument - Virtual Keyboard can switch to a temporary menu while typing - It will switch back to the previous menu after it's closed - This functionality can be used even if the menu isn't already open - It will close the menu and return to gameplay when the Virtual Keyboard is closed --- src/k_menu.h | 4 +++- src/k_menufunc.c | 4 ++-- src/menus/transient/virtual-keyboard.c | 28 ++++++++++++++++++++++++-- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/k_menu.h b/src/k_menu.h index dc5b5d095..fdc7c2c88 100644 --- a/src/k_menu.h +++ b/src/k_menu.h @@ -556,6 +556,7 @@ extern struct menutyping_s boolean keyboardshift; vkb_query_fn_t queryfn; // callback on open and close + menu_t *dummymenu; char cache[MAXSTRINGLENGTH]; // cached string } menutyping; @@ -684,7 +685,8 @@ void M_PlayMenuJam(void); boolean M_ConsiderSealedSwapAlert(void); -void M_OpenVirtualKeyboard(boolean gamepad, vkb_query_fn_t queryfn); +void M_OpenVirtualKeyboard(boolean gamepad, vkb_query_fn_t queryfn, menu_t *dummymenu); +void M_AbortVirtualKeyboard(void); void M_MenuTypingInput(INT32 key); void M_QuitResponse(INT32 ch); diff --git a/src/k_menufunc.c b/src/k_menufunc.c index aa3c3b674..e7507aec3 100644 --- a/src/k_menufunc.c +++ b/src/k_menufunc.c @@ -839,7 +839,7 @@ void M_ClearMenus(boolean callexitmenufunc) D_StartTitle(); } - menutyping.active = false; + M_AbortVirtualKeyboard(); menumessage.active = false; menuactive = false; @@ -1133,7 +1133,7 @@ static void M_HandleMenuInput(void) if (M_MenuConfirmPressed(pid)) { // If we entered this menu by pressing a menu Key, default to keyboard typing, otherwise use controller. - M_OpenVirtualKeyboard(thisMenuKey == -1, M_QueryCvarAction); + M_OpenVirtualKeyboard(thisMenuKey == -1, M_QueryCvarAction, NULL); return; } else if (M_MenuExtraPressed(pid)) diff --git a/src/menus/transient/virtual-keyboard.c b/src/menus/transient/virtual-keyboard.c index 6722e48ca..15e0e9485 100644 --- a/src/menus/transient/virtual-keyboard.c +++ b/src/menus/transient/virtual-keyboard.c @@ -183,6 +183,16 @@ static void M_CloseVirtualKeyboard(void) menutyping.queryfn(menutyping.cache); } +void M_AbortVirtualKeyboard(void) +{ + if (!menutyping.active) + return; + + menutyping.active = false; + if (currentMenu == menutyping.dummymenu) + M_GoBack(0); +} + static boolean M_IsTypingKey(INT32 key) { return key == KEY_BACKSPACE || key == KEY_ENTER @@ -202,7 +212,7 @@ void M_MenuTypingInput(INT32 key) // Closing menutyping.menutypingfade--; if (!menutyping.menutypingfade) - menutyping.active = false; + M_AbortVirtualKeyboard(); return; // prevent inputs while closing the menu. } @@ -405,12 +415,26 @@ void M_MenuTypingInput(INT32 key) } } -void M_OpenVirtualKeyboard(boolean gamepad, vkb_query_fn_t queryfn) +void M_OpenVirtualKeyboard(boolean gamepad, vkb_query_fn_t queryfn, menu_t *dummymenu) { menutyping.keyboardtyping = !gamepad; menutyping.active = true; menutyping.menutypingclose = false; menutyping.queryfn = queryfn; + menutyping.dummymenu = dummymenu; strlcpy(menutyping.cache, queryfn(NULL), MAXSTRINGLENGTH); + + if (dummymenu) + { + if (!menuactive) + { + M_StartControlPanel(); + dummymenu->prevMenu = NULL; + } + else + dummymenu->prevMenu = currentMenu; + + M_SetupNextMenu(dummymenu, true); + } }