From f24a640e0412f39d01bfb4d8b5913a5fcc5dae37 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 20 May 2023 22:37:31 +0100 Subject: [PATCH] Increase reliability of menuKey system The intersection between processed buttons and raw keyboard data is a messy one and will probably never be perfect, but it is now consistent. - Never overwrite a valid keyboard menuKey recieved this frame with a -1 if a different type of event is recieved as well. - Store previous state of dpad_lr and dpad_ud on menucmd struct. - Previously, if `a` was bound to Turn Left, it could produce a valid menuKey for one frame, then be considered a leftward input - switching from manual keyboard to Virtual Keyboard. - It still only produces a valid menuKey for one frame... but we simply filter out leftward inputs that are older than this frame to keep things (relatively) clean. --- src/k_menu.h | 8 +++++++- src/k_menufunc.c | 19 +++++++++++++------ src/menus/transient/virtual-keyboard.c | 19 +++++++++++++++++-- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/k_menu.h b/src/k_menu.h index 24ba4372e..d461973b4 100644 --- a/src/k_menu.h +++ b/src/k_menu.h @@ -552,10 +552,16 @@ typedef enum struct menucmd_t { + // Current frame's data SINT8 dpad_ud; // up / down dpad SINT8 dpad_lr; // left / right UINT32 buttons; // buttons - UINT32 buttonsHeld; // prev frame's buttons + + // Previous frame's data + SINT8 prev_dpad_ud; + SINT8 prev_dpad_lr; + UINT32 buttonsHeld; + UINT16 delay; // menu wait UINT32 delayCount; // num times ya did menu wait (to make the wait shorter each time) }; diff --git a/src/k_menufunc.c b/src/k_menufunc.c index 20f456278..32c51d092 100644 --- a/src/k_menufunc.c +++ b/src/k_menufunc.c @@ -223,7 +223,7 @@ static boolean M_GamestateCanOpenMenu(void) // boolean M_Responder(event_t *ev) { - menuKey = -1; + boolean menuKeyJustChanged = false; if (dedicated || (demo.playback && demo.title) @@ -255,10 +255,11 @@ boolean M_Responder(event_t *ev) D_StartTitle(); } - if (ev->type == ev_keydown && ev->data1 < NUMKEYS) + if (ev->type == ev_keydown && ev->data1 > 0 && ev->data1 < NUMKEYS) { // Record keyboard presses menuKey = ev->data1; + menuKeyJustChanged = true; } // Profiles: Control mapping. @@ -354,7 +355,7 @@ boolean M_Responder(event_t *ev) } // Typing for CV_IT_STRING - if (menutyping.active && !menutyping.menutypingclose && menutyping.keyboardtyping) + if (menuKeyJustChanged && menutyping.active && !menutyping.menutypingclose && menutyping.keyboardtyping) { M_ChangeStringCvar(menuKey); } @@ -740,6 +741,9 @@ void M_UpdateMenuCMD(UINT8 i) { UINT8 mp = max(1, setup_numplayers); + menucmd[i].prev_dpad_ud = menucmd[i].dpad_ud; + menucmd[i].prev_dpad_lr = menucmd[i].dpad_lr; + menucmd[i].dpad_ud = 0; menucmd[i].dpad_lr = 0; @@ -833,6 +837,9 @@ static void M_HandleMenuInput(void) void (*routine)(INT32 choice); // for some casting problem UINT8 pid = 0; // todo: Add ability for any splitscreen player to bring up the menu. SINT8 lr = 0, ud = 0; + INT32 thisMenuKey = menuKey; + + menuKey = -1; if (menuactive == false) { @@ -849,7 +856,7 @@ static void M_HandleMenuInput(void) // Typing for CV_IT_STRING if (menutyping.active) { - M_MenuTypingInput(menuKey); + M_MenuTypingInput(thisMenuKey); return; } @@ -861,7 +868,7 @@ static void M_HandleMenuInput(void) // Handle menu-specific input handling. If this returns true, we skip regular input handling. if (currentMenu->inputroutine) { - if (currentMenu->inputroutine(menuKey)) + if (currentMenu->inputroutine(thisMenuKey)) { return; } @@ -887,7 +894,7 @@ 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)) { - menutyping.keyboardtyping = menuKey != -1 ? true : false; // If we entered this menu by pressing a menu Key, default to keyboard typing, otherwise use controller. + menutyping.keyboardtyping = thisMenuKey != -1 ? true : false; // If we entered this menu by pressing a menu Key, default to keyboard typing, otherwise use controller. menutyping.active = true; menutyping.menutypingclose = false; return; diff --git a/src/menus/transient/virtual-keyboard.c b/src/menus/transient/virtual-keyboard.c index ed40f6430..da5bb4d2d 100644 --- a/src/menus/transient/virtual-keyboard.c +++ b/src/menus/transient/virtual-keyboard.c @@ -243,10 +243,25 @@ void M_MenuTypingInput(INT32 key) || M_MenuButtonPressed(pid, MBT_X) || M_MenuButtonPressed(pid, MBT_Y) || M_MenuButtonPressed(pid, MBT_Z) - || menucmd[pid].dpad_lr != 0 - || menucmd[pid].dpad_ud != 0 + || (menucmd[pid].dpad_lr != 0 && menucmd[pid].prev_dpad_lr == 0) + || (menucmd[pid].dpad_ud != 0 && menucmd[pid].prev_dpad_ud != 0) )) { + /*CONS_Printf("key is %d, \ + %c%c%c-%c%c%c-%c-%c%c%c%c\n", + key, + M_MenuButtonPressed(pid, MBT_A) ? 'A' : ' ', + M_MenuButtonPressed(pid, MBT_B) ? 'B' : ' ', + M_MenuButtonPressed(pid, MBT_C) ? 'C' : ' ', + M_MenuButtonPressed(pid, MBT_X) ? 'X' : ' ', + M_MenuButtonPressed(pid, MBT_Y) ? 'Y' : ' ', + M_MenuButtonPressed(pid, MBT_Z) ? 'Z' : ' ', + M_MenuButtonPressed(pid, MBT_START) ? '+' : ' ', + menucmd[pid].dpad_lr < 0 ? '<' : ' ', + menucmd[pid].dpad_ud > 0 ? '^' : ' ', + menucmd[pid].dpad_ud < 0 ? 'v' : ' ', + menucmd[pid].dpad_lr > 0 ? '>' : ' ' + );*/ menutyping.keyboardtyping = false; return; }