diff --git a/quakespasm/Quake/in_sdl.c b/quakespasm/Quake/in_sdl.c index d756d4dd..1ae0e824 100644 --- a/quakespasm/Quake/in_sdl.c +++ b/quakespasm/Quake/in_sdl.c @@ -557,7 +557,7 @@ static int IN_KeyForControllerButton(SDL_GameControllerButton button) 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_GUIDE: return K_X360_GUIDE; + //case SDL_CONTROLLER_BUTTON_GUIDE: return K_X360_GUIDE; case SDL_CONTROLLER_BUTTON_START: return K_X360_START; case SDL_CONTROLLER_BUTTON_LEFTSTICK: return K_X360_LEFT_THUMB; case SDL_CONTROLLER_BUTTON_RIGHTSTICK: return K_X360_RIGHT_THUMB; @@ -606,6 +606,22 @@ void IN_ControllerButton(SDL_JoystickID instanceid, SDL_GameControllerButton but Key_Event(emulatedkey, down); } +#define DOWN_THRESHOLD 0.5 +#define UP_THRESHOLD 0.25 + +void IN_ControllerAxisButton(float oldval, float newval, int negativekey, int positivekey) +{ + if (!(oldval < -DOWN_THRESHOLD) && (newval < -DOWN_THRESHOLD)) + Key_Event(negativekey, true); + else if (!(oldval > -UP_THRESHOLD) && (newval > -UP_THRESHOLD)) + Key_Event(negativekey, false); + + if (!(oldval > DOWN_THRESHOLD) && (newval > DOWN_THRESHOLD)) + Key_Event(positivekey, true); + else if (!(oldval < UP_THRESHOLD) && (newval < UP_THRESHOLD)) + Key_Event(positivekey, false); +} + void IN_ControllerAxis(SDL_JoystickID instanceid, SDL_GameControllerAxis axis, Sint16 value) { float axisValue = Sint16ToPlusMinusOne( value ); @@ -618,13 +634,21 @@ void IN_ControllerAxis(SDL_JoystickID instanceid, SDL_GameControllerAxis axis, S { // TODO: swap move/look cvar case SDL_CONTROLLER_AXIS_LEFTX: - _rawDualAxis.left.x = axisValue; break; + IN_ControllerAxisButton(_rawDualAxis.left.x, axisValue, K_X360_LEFT_THUMB_LEFT, K_X360_LEFT_THUMB_RIGHT); + _rawDualAxis.left.x = axisValue; + break; case SDL_CONTROLLER_AXIS_LEFTY: - _rawDualAxis.left.y = axisValue; break; + IN_ControllerAxisButton(_rawDualAxis.left.y, axisValue, K_X360_LEFT_THUMB_DOWN, K_X360_LEFT_THUMB_UP); + _rawDualAxis.left.y = axisValue; + break; case SDL_CONTROLLER_AXIS_RIGHTX: - _rawDualAxis.right.x = axisValue; break; + IN_ControllerAxisButton(_rawDualAxis.right.x, axisValue, K_X360_RIGHT_THUMB_LEFT, K_X360_RIGHT_THUMB_RIGHT); + _rawDualAxis.right.x = axisValue; + break; case SDL_CONTROLLER_AXIS_RIGHTY: - _rawDualAxis.right.y = axisValue; break; + IN_ControllerAxisButton(_rawDualAxis.right.y, axisValue, K_X360_RIGHT_THUMB_DOWN, K_X360_RIGHT_THUMB_UP); + _rawDualAxis.right.y = axisValue; + break; case SDL_CONTROLLER_AXIS_TRIGGERLEFT: { diff --git a/quakespasm/Quake/keys.c b/quakespasm/Quake/keys.c index e83bdce4..e8636943 100644 --- a/quakespasm/Quake/keys.c +++ b/quakespasm/Quake/keys.c @@ -177,7 +177,15 @@ keyname_t keynames[] = {"X360_Y", K_X360_Y}, {"X360_LEFT_TRIGGER", K_X360_LEFT_TRIGGER}, {"X360_RIGHT_TRIGGER", K_X360_RIGHT_TRIGGER}, - {"X360_GUIDE", K_X360_GUIDE}, + //{"X360_GUIDE", K_X360_GUIDE}, + {"K_X360_LEFT_THUMB_UP", K_X360_LEFT_THUMB_UP}, + {"K_X360_LEFT_THUMB_DOWN", K_X360_LEFT_THUMB_DOWN}, + {"K_X360_LEFT_THUMB_LEFT", K_X360_LEFT_THUMB_LEFT}, + {"K_X360_LEFT_THUMB_RIGHT", K_X360_LEFT_THUMB_RIGHT}, + {"K_X360_RIGHT_THUMB_UP", K_X360_RIGHT_THUMB_UP}, + {"K_X360_RIGHT_THUMB_DOWN", K_X360_RIGHT_THUMB_DOWN}, + {"K_X360_RIGHT_THUMB_LEFT", K_X360_RIGHT_THUMB_LEFT}, + {"K_X360_RIGHT_THUMB_RIGHT", K_X360_RIGHT_THUMB_RIGHT}, {NULL, 0} };