From fb5287f33549c74bf42af3449d401cdd52d6d48e Mon Sep 17 00:00:00 2001 From: minenice55 Date: Sun, 15 Feb 2026 16:02:07 -0500 Subject: [PATCH] fix keyrepeat for gamepad sticks hats are still broken --- src/g_input.c | 8 +-- src/m_menu.c | 182 ++++++++++++++++++++++++++++---------------------- 2 files changed, 107 insertions(+), 83 deletions(-) diff --git a/src/g_input.c b/src/g_input.c index d9eceaca3..748244f3f 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -147,11 +147,11 @@ INT32 gamecontroldefault[num_gamecontrols][MAXINPUTMAPPING] = { [gc_aimbackward] = {KEY_DOWNARROW, KEY_AXIS1+3 }, // Left Y+ [gc_turnleft ] = {KEY_LEFTARROW, KEY_AXIS1+0 }, // Left X- [gc_turnright ] = {KEY_RIGHTARROW, KEY_AXIS1+1 }, // Left X+ - [gc_accelerate ] = {'a', KEY_JOY1+0 }, // A + [gc_accelerate ] = {'a', KEY_JOY1+0 }, // East [gc_drift ] = {'s', KEY_JOY1+10, KEY_AXIS1+9}, // RB, RT - [gc_brake ] = {'d', KEY_JOY1+1 }, // B + [gc_brake ] = {'d', KEY_JOY1+1 }, // South [gc_fire ] = {KEY_SPACE, KEY_JOY1+9, KEY_AXIS1+8}, // LB, LT - [gc_lookback ] = {KEY_LSHIFT, KEY_JOY1+2 }, // X + [gc_lookback ] = {KEY_LSHIFT, KEY_JOY1+2 }, // North [gc_horncode ] = {'r', KEY_JOY1+8 }, // R-Stick Click [gc_pause ] = {KEY_PAUSE, KEY_JOY1+4 }, // Back @@ -159,7 +159,7 @@ INT32 gamecontroldefault[num_gamecontrols][MAXINPUTMAPPING] = { [gc_console ] = {KEY_CONSOLE }, [gc_screenshot ] = {KEY_F8 }, [gc_recordgif ] = {KEY_F9 }, - [gc_viewpoint ] = {KEY_F12, KEY_JOY1+3 }, // Y + [gc_viewpoint ] = {KEY_F12, KEY_JOY1+3 }, // West [gc_talkkey ] = {'t', KEY_HAT1+1 }, // D-Pad Down //[gc_teamkey ] = {'y' }, [gc_scores ] = {KEY_TAB, KEY_HAT1+0 }, // D-Pad Up diff --git a/src/m_menu.c b/src/m_menu.c index 5434ff7fd..b44dc8b03 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1311,6 +1311,53 @@ static boolean M_WipeBuffer(INT32 ch, menufunc_f *routine) // use this when routine being NULL isn't a free pass static INT32 MR_Dummy(INT32 ch) { (void)ch; return true; } +static INT32 RemapGamepadButton(event_t *ev) +{ + // remap to keyboard keys if needed + if (ev->data1 < KEY_JOY1 || ev->data1 >= JOYINPUTEND) + return ev->data1; + + static INT32 joyremap[][2] = { + { gc_accelerate, KEY_ENTER }, // these two first + { gc_brake, KEY_ESCAPE }, // in case of conflicts + { gc_fire, KEY_BACKSPACE }, + { gc_drift, KEY_SPACE }, + { gc_systemmenu, KEY_ESCAPE }, + { gc_aimforward, KEY_UPARROW }, + { gc_aimbackward, KEY_DOWNARROW }, + { gc_turnleft, KEY_LEFTARROW }, + { gc_turnright, KEY_RIGHTARROW }, + { gc_horncode, KEY_TAB }, + }; + + for (size_t r = 0; r < sizeof(joyremap)/sizeof(*joyremap); r++) + { + INT32 gc = joyremap[r][0]; + if (gc == gc_brake && !menustack[0]) + continue; // don't open the menu with brake! + + if (G_ControlBoundToKey(0, gc, ev->data1, true)) + { + return joyremap[r][1]; + } + } + + // remap the hats too + switch (ev->data1) + { + case KEY_HAT1+0: + return KEY_UPARROW; + case KEY_HAT1+1: + return KEY_DOWNARROW; + case KEY_HAT1+2: + return KEY_LEFTARROW; + case KEY_HAT1+3: + return KEY_RIGHTARROW; + } + return ev->data1; +} + + // // M_Responder // @@ -1318,6 +1365,7 @@ boolean M_Responder(event_t *ev) { INT32 ch = -1; static tic_t joywait = 0, mousewait = 0; + static INT32 pjoyx = 0, pjoyy = 0; static INT32 pmousex = 0, pmousey = 0; static INT32 lastx = 0, lasty = 0; INT32 deviceplayer = G_GetDevicePlayer(ev->device); @@ -1339,63 +1387,68 @@ boolean M_Responder(event_t *ev) // (but still allow shift keyup so caps doesn't get stuck) return false; } - else if (ev->type == ev_keydown) - { - ch = ev->data1; - - // added 5-2-98 remap virtual keys (mouse & joystick buttons) - switch (ch) - { - case KEY_MOUSE1: - ch = KEY_ENTER; - break; - case KEY_MOUSE1 + 1: - ch = KEY_BACKSPACE; - break; - case KEY_HAT1: - if (deviceplayer == 0) - ch = KEY_UPARROW; - break; - case KEY_HAT1 + 1: - if (deviceplayer == 0) - ch = KEY_DOWNARROW; - break; - case KEY_HAT1 + 2: - if (deviceplayer == 0) - ch = KEY_LEFTARROW; - break; - case KEY_HAT1 + 3: - if (deviceplayer == 0) - ch = KEY_RIGHTARROW; - break; - default: - break; - } - } else if (menustack[0]) { - if (ev->type == ev_joystick && deviceplayer == 0) + if (ev->type == ev_keydown) { - static INT32 lastjoy[JOYAXISES] = {0}; - - if (G_AxisInDeadzone(deviceplayer, ev)) + ch = ev->data1; + + // added 5-2-98 remap virtual keys (mouse buttons) + switch (ch) { - lastjoy[ev->data1] = 0; - return false; + case KEY_MOUSE1: + ch = KEY_ENTER; + break; + case KEY_MOUSE1 + 1: + ch = KEY_ESCAPE; + break; + default: + ch = RemapGamepadButton(ev); + break; } - - tic_t thistime = I_GetTime(); - - // no previous direction OR change direction - if (joywait < thistime && (lastjoy[ev->data1] == 0 || (ev->data2 < 0) != (lastjoy[ev->data1] < 0))) + } + else if (ev->type == ev_joystick && deviceplayer == 0 && joywait < I_GetTime()) + { + if (ev->data1 == 1) { - ch = G_AxisToKey(ev); - joywait = thistime + NEWTICRATE/7; + if (abs(ev->data2) > (JOYAXISRANGE/4)) + { + if (ev->data2 > 0 && pjoyy <= 0) + { + ch = KEY_DOWNARROW; + joywait = I_GetTime() + NEWTICRATE/10; + } + else if (ev->data2 < 0 && pjoyy >= 0) + { + ch = KEY_UPARROW; + joywait = I_GetTime() + NEWTICRATE/10; + } + } + else + { + pjoyy = 0; + } + } + else if (ev->data1 == 0) + { + if (abs(ev->data2) > (JOYAXISRANGE/4)) + { + if (ev->data2 > 0 && pjoyx <= 0) + { + ch = KEY_RIGHTARROW; + joywait = I_GetTime() + NEWTICRATE/10; + } + else if (ev->data2 < 0 && pjoyx >= 0) + { + ch = KEY_LEFTARROW; + joywait = I_GetTime() + NEWTICRATE/10; + } + } + else + { + pjoyx = 0; + } } - else - ch = 0; - - lastjoy[ev->data1] = ev->data2; } // pass through other joysticks else if (ev->type == ev_joystick) @@ -1437,35 +1490,6 @@ boolean M_Responder(event_t *ev) } } - // remap to keyboard keys if needed - if (deviceplayer == 0 && ch >= NUMKEYS) - { - static INT32 joyremap[][2] = { - { gc_accelerate, KEY_ENTER }, // these two first - { gc_brake, KEY_ESCAPE }, // in case of conflicts - { gc_fire, KEY_BACKSPACE }, - { gc_drift, KEY_SPACE }, - { gc_systemmenu, KEY_ESCAPE }, - { gc_aimforward, KEY_UPARROW }, - { gc_aimbackward, KEY_DOWNARROW }, - { gc_turnleft, KEY_LEFTARROW }, - { gc_turnright, KEY_RIGHTARROW }, - }; - - for (size_t r = 0; r < sizeof(joyremap)/sizeof(*joyremap); r++) - { - INT32 gc = joyremap[r][0]; - if (gc == gc_brake && !menustack[0]) - continue; // don't open the menu with brake! - - if (G_ControlBoundToKey(0, gc, ch, true)) - { - ch = joyremap[r][1]; - break; - } - } - } - if (ch == -1) return false;