Virtual Keyboard: use callback function to get/set cvar string

This commit is contained in:
James R 2024-02-29 19:41:42 -08:00
parent 0486c25afd
commit f270ac5579
3 changed files with 17 additions and 5 deletions

View file

@ -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);

View file

@ -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))

View file

@ -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);
}