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
This commit is contained in:
James R 2024-02-29 21:22:56 -08:00
parent f270ac5579
commit 7d01c3046b
3 changed files with 31 additions and 5 deletions

View file

@ -556,6 +556,7 @@ extern struct menutyping_s
boolean keyboardshift; boolean keyboardshift;
vkb_query_fn_t queryfn; // callback on open and close vkb_query_fn_t queryfn; // callback on open and close
menu_t *dummymenu;
char cache[MAXSTRINGLENGTH]; // cached string char cache[MAXSTRINGLENGTH]; // cached string
} menutyping; } menutyping;
@ -684,7 +685,8 @@ void M_PlayMenuJam(void);
boolean M_ConsiderSealedSwapAlert(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_MenuTypingInput(INT32 key);
void M_QuitResponse(INT32 ch); void M_QuitResponse(INT32 ch);

View file

@ -839,7 +839,7 @@ void M_ClearMenus(boolean callexitmenufunc)
D_StartTitle(); D_StartTitle();
} }
menutyping.active = false; M_AbortVirtualKeyboard();
menumessage.active = false; menumessage.active = false;
menuactive = false; menuactive = false;
@ -1133,7 +1133,7 @@ static void M_HandleMenuInput(void)
if (M_MenuConfirmPressed(pid)) if (M_MenuConfirmPressed(pid))
{ {
// 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); M_OpenVirtualKeyboard(thisMenuKey == -1, M_QueryCvarAction, NULL);
return; return;
} }
else if (M_MenuExtraPressed(pid)) else if (M_MenuExtraPressed(pid))

View file

@ -183,6 +183,16 @@ static void M_CloseVirtualKeyboard(void)
menutyping.queryfn(menutyping.cache); 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) static boolean M_IsTypingKey(INT32 key)
{ {
return key == KEY_BACKSPACE || key == KEY_ENTER return key == KEY_BACKSPACE || key == KEY_ENTER
@ -202,7 +212,7 @@ void M_MenuTypingInput(INT32 key)
// Closing // Closing
menutyping.menutypingfade--; menutyping.menutypingfade--;
if (!menutyping.menutypingfade) if (!menutyping.menutypingfade)
menutyping.active = false; M_AbortVirtualKeyboard();
return; // prevent inputs while closing the menu. 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.keyboardtyping = !gamepad;
menutyping.active = true; menutyping.active = true;
menutyping.menutypingclose = false; menutyping.menutypingclose = false;
menutyping.queryfn = queryfn; menutyping.queryfn = queryfn;
menutyping.dummymenu = dummymenu;
strlcpy(menutyping.cache, queryfn(NULL), MAXSTRINGLENGTH); strlcpy(menutyping.cache, queryfn(NULL), MAXSTRINGLENGTH);
if (dummymenu)
{
if (!menuactive)
{
M_StartControlPanel();
dummymenu->prevMenu = NULL;
}
else
dummymenu->prevMenu = currentMenu;
M_SetupNextMenu(dummymenu, true);
}
} }