From eeff182abbea12e8abdc7dda5354a66c72e3bdda Mon Sep 17 00:00:00 2001 From: Eidolon Date: Tue, 3 Jan 2023 14:09:12 -0600 Subject: [PATCH 1/2] Reverse axis event mapping in G_RemapGamepadEvent Was erroneously mapping events inside the deadzone as key down and vice versa. --- src/g_input.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_input.c b/src/g_input.c index 465db0316..6b0da7e41 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -543,9 +543,9 @@ INT32 G_RemapGamepadEvent(event_t *event, INT32 *type) const INT16 value = G_GetGamepadAxisValue(event->which, event->key); if (value < -jdeadzone || value > jdeadzone) - *type = ev_keyup; - else *type = ev_keydown; + else + *type = ev_keyup; if (value < -jdeadzone) return KEY_INV_AXES + event->key; From c270cca55f6e13731c91d872a75c58ff01eda769 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Tue, 3 Jan 2023 14:39:15 -0600 Subject: [PATCH 2/2] Always swallow pad axis events when menu is active This prevents axis events from trickling out of the menu and taking effect in G_Responder when they aren't hitting the digital deadzone needed to be mapped into internal menu key events. --- src/m_menu.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index 51d13df98..1d5bd65f3 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3224,6 +3224,7 @@ boolean M_Responder(event_t *ev) static INT32 pjoyx = 0, pjoyy = 0; static INT32 pmousex = 0, pmousey = 0; static INT32 lastx = 0, lasty = 0; + boolean shouldswallowevent = false; void (*routine)(INT32 choice); // for some casting problem if (dedicated || (demoplayback && titledemo) @@ -3239,11 +3240,18 @@ boolean M_Responder(event_t *ev) boolean useEventHandler = false; + if (menuactive && ev->type == ev_gamepad_axis && ev->which == 0) + { + // ALWAYS swallow gamepad axis events, to prevent trickling down to game input + // this applies even if the axis event does not get remapped + shouldswallowevent = true; + } + if (noFurtherInput) { // Ignore input after enter/escape/other buttons // (but still allow shift keyup so caps doesn't get stuck) - return false; + return shouldswallowevent; } else if (menuactive) { @@ -3368,7 +3376,7 @@ boolean M_Responder(event_t *ev) } if (!useEventHandler && ch == -1) - return false; + return shouldswallowevent; else if (ch == gamecontrol[GC_SYSTEMMENU][0] || ch == gamecontrol[GC_SYSTEMMENU][1]) // allow remappable ESC key ch = KEY_ESCAPE; @@ -3601,7 +3609,7 @@ boolean M_Responder(event_t *ev) //currentMenu->lastOn = itemOn; //if (currentMenu->prevMenu) // M_SetupNextMenu(currentMenu->prevMenu); - return false; + return shouldswallowevent; default: CON_Responder(ev);