From f270ac5579c6e3ba4cb441c82dd8db47219f872e Mon Sep 17 00:00:00 2001 From: James R Date: Thu, 29 Feb 2024 19:41:42 -0800 Subject: [PATCH] Virtual Keyboard: use callback function to get/set cvar string --- src/k_menu.h | 4 +++- src/k_menufunc.c | 11 ++++++++++- src/menus/transient/virtual-keyboard.c | 7 ++++--- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/k_menu.h b/src/k_menu.h index 049559ce4..dc5b5d095 100644 --- a/src/k_menu.h +++ b/src/k_menu.h @@ -542,6 +542,7 @@ extern INT32 menuKey; // keyboard key pressed for menu extern INT16 virtualKeyboard[5][NUMVIRTUALKEYSINROW]; extern INT16 shift_virtualKeyboard[5][NUMVIRTUALKEYSINROW]; +typedef const char *(*vkb_query_fn_t)(const char *replace); extern struct menutyping_s { boolean active; // Active @@ -554,6 +555,7 @@ extern struct menutyping_s boolean keyboardcapslock; boolean keyboardshift; + vkb_query_fn_t queryfn; // callback on open and close char cache[MAXSTRINGLENGTH]; // cached string } menutyping; @@ -682,7 +684,7 @@ void M_PlayMenuJam(void); boolean M_ConsiderSealedSwapAlert(void); -void M_OpenVirtualKeyboard(boolean gamepad); +void M_OpenVirtualKeyboard(boolean gamepad, vkb_query_fn_t queryfn); void M_MenuTypingInput(INT32 key); void M_QuitResponse(INT32 ch); diff --git a/src/k_menufunc.c b/src/k_menufunc.c index 7833da1e3..aa3c3b674 100644 --- a/src/k_menufunc.c +++ b/src/k_menufunc.c @@ -188,6 +188,14 @@ static void M_ChangeCvar(INT32 choice) M_ChangeCvarDirect(choice, currentMenu->menuitems[itemOn].itemaction.cvar); } +static const char *M_QueryCvarAction(const char *replace) +{ + consvar_t *cvar = currentMenu->menuitems[itemOn].itemaction.cvar; + if (replace) + CV_Set(cvar, replace); + return cvar->string; +} + boolean M_NextOpt(void) { INT16 oldItemOn = itemOn; // prevent infinite loop @@ -1124,7 +1132,8 @@ static void M_HandleMenuInput(void) // If we're hovering over a IT_CV_STRING option, pressing A/X opens the typing submenu if (M_MenuConfirmPressed(pid)) { - M_OpenVirtualKeyboard(thisMenuKey == -1); // If we entered this menu by pressing a menu Key, default to keyboard typing, otherwise use controller. + // If we entered this menu by pressing a menu Key, default to keyboard typing, otherwise use controller. + M_OpenVirtualKeyboard(thisMenuKey == -1, M_QueryCvarAction); return; } else if (M_MenuExtraPressed(pid)) diff --git a/src/menus/transient/virtual-keyboard.c b/src/menus/transient/virtual-keyboard.c index 81afaed8e..6722e48ca 100644 --- a/src/menus/transient/virtual-keyboard.c +++ b/src/menus/transient/virtual-keyboard.c @@ -180,7 +180,7 @@ static void M_ToggleVirtualShift(void) static void M_CloseVirtualKeyboard(void) { menutyping.menutypingclose = true; // close menu. - CV_Set(currentMenu->menuitems[itemOn].itemaction.cvar, menutyping.cache); + menutyping.queryfn(menutyping.cache); } static boolean M_IsTypingKey(INT32 key) @@ -405,11 +405,12 @@ void M_MenuTypingInput(INT32 key) } } -void M_OpenVirtualKeyboard(boolean gamepad) +void M_OpenVirtualKeyboard(boolean gamepad, vkb_query_fn_t queryfn) { menutyping.keyboardtyping = !gamepad; menutyping.active = true; menutyping.menutypingclose = false; - strlcpy(menutyping.cache, currentMenu->menuitems[itemOn].itemaction.cvar->string, MAXSTRINGLENGTH); + menutyping.queryfn = queryfn; + strlcpy(menutyping.cache, queryfn(NULL), MAXSTRINGLENGTH); }