diff --git a/quakespasm/Quake/in_sdl.c b/quakespasm/Quake/in_sdl.c index 1ae0e824..36c57822 100644 --- a/quakespasm/Quake/in_sdl.c +++ b/quakespasm/Quake/in_sdl.c @@ -556,9 +556,9 @@ static int IN_KeyForControllerButton(SDL_GameControllerButton button) case SDL_CONTROLLER_BUTTON_B: return K_X360_B; case SDL_CONTROLLER_BUTTON_X: return K_X360_X; case SDL_CONTROLLER_BUTTON_Y: return K_X360_Y; - case SDL_CONTROLLER_BUTTON_BACK: return K_X360_BACK; + case SDL_CONTROLLER_BUTTON_BACK: return K_ESCAPE; //case SDL_CONTROLLER_BUTTON_GUIDE: return K_X360_GUIDE; - case SDL_CONTROLLER_BUTTON_START: return K_X360_START; + case SDL_CONTROLLER_BUTTON_START: return K_ESCAPE; case SDL_CONTROLLER_BUTTON_LEFTSTICK: return K_X360_LEFT_THUMB; case SDL_CONTROLLER_BUTTON_RIGHTSTICK: return K_X360_RIGHT_THUMB; case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: return K_X360_LEFT_SHOULDER; @@ -601,9 +601,9 @@ void IN_ControllerButton(SDL_JoystickID instanceid, SDL_GameControllerButton but Key_Event(key, down); // also send emulated keyboard key - emulatedkey = IN_EmulatedKeyForControllerKey(key); - if (emulatedkey) - Key_Event(emulatedkey, down); +// emulatedkey = IN_EmulatedKeyForControllerKey(key); +// if (emulatedkey) +// Key_Event(emulatedkey, down); } #define DOWN_THRESHOLD 0.5 @@ -638,7 +638,7 @@ void IN_ControllerAxis(SDL_JoystickID instanceid, SDL_GameControllerAxis axis, S _rawDualAxis.left.x = axisValue; break; case SDL_CONTROLLER_AXIS_LEFTY: - IN_ControllerAxisButton(_rawDualAxis.left.y, axisValue, K_X360_LEFT_THUMB_DOWN, K_X360_LEFT_THUMB_UP); + IN_ControllerAxisButton(_rawDualAxis.left.y, axisValue, K_X360_LEFT_THUMB_UP, K_X360_LEFT_THUMB_DOWN); _rawDualAxis.left.y = axisValue; break; case SDL_CONTROLLER_AXIS_RIGHTX: @@ -646,7 +646,7 @@ void IN_ControllerAxis(SDL_JoystickID instanceid, SDL_GameControllerAxis axis, S _rawDualAxis.right.x = axisValue; break; case SDL_CONTROLLER_AXIS_RIGHTY: - IN_ControllerAxisButton(_rawDualAxis.right.y, axisValue, K_X360_RIGHT_THUMB_DOWN, K_X360_RIGHT_THUMB_UP); + IN_ControllerAxisButton(_rawDualAxis.right.y, axisValue, K_X360_RIGHT_THUMB_UP, K_X360_RIGHT_THUMB_DOWN); _rawDualAxis.right.y = axisValue; break; diff --git a/quakespasm/Quake/keys.c b/quakespasm/Quake/keys.c index e8636943..0aee135e 100644 --- a/quakespasm/Quake/keys.c +++ b/quakespasm/Quake/keys.c @@ -947,6 +947,35 @@ void Key_GetGrabbedInput (int *lastkey, int *lastchar) *lastchar = key_inputgrab.lastchar; } +static int IN_IsControllerKey(int button) +{ + return button >= K_X360_DPAD_UP && button <= K_X360_RIGHT_THUMB_RIGHT; +} + +static int IN_EmulatedKeyForControllerKey(int button) +{ + switch (button) + { + case K_X360_DPAD_UP: return K_UPARROW; + case K_X360_DPAD_DOWN: return K_DOWNARROW; + case K_X360_DPAD_LEFT: return K_LEFTARROW; + case K_X360_DPAD_RIGHT: return K_RIGHTARROW; + case K_X360_LEFT_THUMB_UP: return K_UPARROW; + case K_X360_LEFT_THUMB_DOWN: return K_DOWNARROW; + case K_X360_LEFT_THUMB_LEFT: return K_LEFTARROW; + case K_X360_LEFT_THUMB_RIGHT: return K_RIGHTARROW; + case K_X360_RIGHT_THUMB_UP: return K_UPARROW; + case K_X360_RIGHT_THUMB_DOWN: return K_DOWNARROW; + case K_X360_RIGHT_THUMB_LEFT: return K_LEFTARROW; + case K_X360_RIGHT_THUMB_RIGHT: return K_RIGHTARROW; +// case K_X360_START: return K_ESCAPE; +// case K_X360_BACK: return K_ESCAPE; + case K_X360_A: return K_ENTER; + case K_X360_B: return K_ESCAPE; + default: return button; + } +} + /* =================== Key_Event @@ -963,6 +992,27 @@ void Key_Event (int key, qboolean down) if (key < 0 || key >= MAX_KEYS) return; + if (IN_IsControllerKey(key)) + { + int emukey = IN_EmulatedKeyForControllerKey(key); + + if (key_dest == key_menu + && !key_inputgrab.active) + { + key = emukey; + } + else + { + // handle keyup when leaving menu with an emulated key + if (!down && + !keydown[key] && + keydown[emukey]) + { + key = emukey; + } + } + } + // handle fullscreen toggle if (down && (key == K_ENTER || key == K_KP_ENTER) && keydown[K_ALT]) {