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

View file

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

View file

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