diff --git a/code/client/keycodes.h b/code/client/keycodes.h index c460ef50..d0a188e6 100644 --- a/code/client/keycodes.h +++ b/code/client/keycodes.h @@ -261,8 +261,6 @@ typedef enum { K_UNDO, // Gamepad controls - // Ordered to match SDL2 game controller buttons and axes - // Do not change this order without also changing IN_GamepadMove() in SDL_input.c K_PAD0_A, K_PAD0_B, K_PAD0_X, diff --git a/code/sdl/sdl_input.c b/code/sdl/sdl_input.c index 145f39bb..b828db82 100644 --- a/code/sdl/sdl_input.c +++ b/code/sdl/sdl_input.c @@ -641,6 +641,47 @@ static qboolean KeyToAxisAndSign(int keynum, int *outAxis, int *outSign) return *outSign != 0; } +/* +=============== +IN_KeyFor +=============== +*/ +static keyNum_t IN_KeyFor( SDL_GameControllerButton sdlButton ) +{ + switch(sdlButton) + { + case SDL_CONTROLLER_BUTTON_A: return K_PAD0_A; + case SDL_CONTROLLER_BUTTON_B: return K_PAD0_B; + case SDL_CONTROLLER_BUTTON_X: return K_PAD0_X; + case SDL_CONTROLLER_BUTTON_Y: return K_PAD0_Y; + case SDL_CONTROLLER_BUTTON_BACK: return K_PAD0_BACK; + case SDL_CONTROLLER_BUTTON_GUIDE: return K_PAD0_GUIDE; + case SDL_CONTROLLER_BUTTON_START: return K_PAD0_START; + case SDL_CONTROLLER_BUTTON_LEFTSTICK: return K_PAD0_LEFTSTICK_CLICK; + case SDL_CONTROLLER_BUTTON_RIGHTSTICK: return K_PAD0_RIGHTSTICK_CLICK; + case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: return K_PAD0_LEFTSHOULDER; + case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: return K_PAD0_RIGHTSHOULDER; + case SDL_CONTROLLER_BUTTON_DPAD_UP: return K_PAD0_DPAD_UP; + case SDL_CONTROLLER_BUTTON_DPAD_DOWN: return K_PAD0_DPAD_DOWN; + case SDL_CONTROLLER_BUTTON_DPAD_LEFT: return K_PAD0_DPAD_LEFT; + case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: return K_PAD0_DPAD_RIGHT; +#if SDL_VERSION_ATLEAST( 2, 0, 14 ) + case SDL_CONTROLLER_BUTTON_MISC1: return K_PAD0_MISC1; + case SDL_CONTROLLER_BUTTON_PADDLE1: return K_PAD0_PADDLE1; + case SDL_CONTROLLER_BUTTON_PADDLE2: return K_PAD0_PADDLE2; + case SDL_CONTROLLER_BUTTON_PADDLE3: return K_PAD0_PADDLE3; + case SDL_CONTROLLER_BUTTON_PADDLE4: return K_PAD0_PADDLE4; + case SDL_CONTROLLER_BUTTON_TOUCHPAD: return K_PAD0_TOUCHPAD; +#endif + + default: + Com_Error(ERR_DROP, "IN_KeyFor: unhandled SDL button: %d", sdlButton); + break; + } + + return 0; +} + /* =============== IN_GamepadMove @@ -657,17 +698,11 @@ static void IN_GamepadMove( void ) // check buttons for (i = 0; i < SDL_CONTROLLER_BUTTON_MAX; i++) { - qboolean pressed = SDL_GameControllerGetButton(gamepad, SDL_CONTROLLER_BUTTON_A + i); + SDL_GameControllerButton sdlButton = SDL_CONTROLLER_BUTTON_A + i; + qboolean pressed = SDL_GameControllerGetButton(gamepad, sdlButton); if (pressed != stick_state.buttons[i]) { -#if SDL_VERSION_ATLEAST( 2, 0, 14 ) - if ( i >= SDL_CONTROLLER_BUTTON_MISC1 ) { - Com_QueueEvent(in_eventTime, SE_KEY, K_PAD0_MISC1 + i - SDL_CONTROLLER_BUTTON_MISC1, pressed, 0, NULL); - } else -#endif - { - Com_QueueEvent(in_eventTime, SE_KEY, K_PAD0_A + i, pressed, 0, NULL); - } + Com_QueueEvent(in_eventTime, SE_KEY, IN_KeyFor(sdlButton), pressed, 0, NULL); stick_state.buttons[i] = pressed; } }