Map SDL gamepad buttons to keys explicitly

This commit is contained in:
Tim Angus 2025-08-05 11:11:09 +01:00
parent 1df2825cf1
commit 6367fdfe28
2 changed files with 44 additions and 11 deletions

View File

@ -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,

View File

@ -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;
}
}