mirror of
				https://github.com/libsdl-org/SDL.git
				synced 2025-11-04 01:34:38 +00:00 
			
		
		
		
	Removed SDL_GamepadBinding from the API
The text format is more expressive and widely used than the binary structure
This commit is contained in:
		@@ -250,6 +250,8 @@ The SDL_EVENT_GAMEPAD_ADDED event now provides the joystick instance ID in the w
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
The functions SDL_GetGamepads(), SDL_GetGamepadInstanceName(), SDL_GetGamepadInstancePath(), SDL_GetGamepadInstancePlayerIndex(), SDL_GetGamepadInstanceGUID(), SDL_GetGamepadInstanceVendor(), SDL_GetGamepadInstanceProduct(), SDL_GetGamepadInstanceProductVersion(), and SDL_GetGamepadInstanceType() have been added to directly query the list of available gamepads.
 | 
					The functions SDL_GetGamepads(), SDL_GetGamepadInstanceName(), SDL_GetGamepadInstancePath(), SDL_GetGamepadInstancePlayerIndex(), SDL_GetGamepadInstanceGUID(), SDL_GetGamepadInstanceVendor(), SDL_GetGamepadInstanceProduct(), SDL_GetGamepadInstanceProductVersion(), and SDL_GetGamepadInstanceType() have been added to directly query the list of available gamepads.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The gamepad binding structure has been removed in favor of exchanging bindings in text format.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SDL_GameControllerGetSensorDataWithTimestamp() has been removed. If you want timestamps for the sensor data, you should use the sensor_timestamp member of SDL_EVENT_GAMEPAD_SENSOR_UPDATE events.
 | 
					SDL_GameControllerGetSensorDataWithTimestamp() has been removed. If you want timestamps for the sensor data, you should use the sensor_timestamp member of SDL_EVENT_GAMEPAD_SENSOR_UPDATE events.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The following enums have been renamed:
 | 
					The following enums have been renamed:
 | 
				
			||||||
@@ -318,6 +320,8 @@ The following functions have been renamed:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
The following functions have been removed:
 | 
					The following functions have been removed:
 | 
				
			||||||
* SDL_GameControllerEventState() - replaced with SDL_SetGamepadEventsEnabled() and SDL_GamepadEventsEnabled()
 | 
					* SDL_GameControllerEventState() - replaced with SDL_SetGamepadEventsEnabled() and SDL_GamepadEventsEnabled()
 | 
				
			||||||
 | 
					* SDL_GameControllerGetBindForAxis()
 | 
				
			||||||
 | 
					* SDL_GameControllerGetBindForButton()
 | 
				
			||||||
* SDL_GameControllerMappingForDeviceIndex() - replaced with SDL_GetGamepadInstanceMapping()
 | 
					* SDL_GameControllerMappingForDeviceIndex() - replaced with SDL_GetGamepadInstanceMapping()
 | 
				
			||||||
* SDL_GameControllerNameForIndex() - replaced with SDL_GetGamepadInstanceName()
 | 
					* SDL_GameControllerNameForIndex() - replaced with SDL_GetGamepadInstanceName()
 | 
				
			||||||
* SDL_GameControllerPathForIndex() - replaced with SDL_GetGamepadInstancePath()
 | 
					* SDL_GameControllerPathForIndex() - replaced with SDL_GetGamepadInstancePath()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -127,33 +127,6 @@ typedef enum
 | 
				
			|||||||
    SDL_GAMEPAD_AXIS_MAX
 | 
					    SDL_GAMEPAD_AXIS_MAX
 | 
				
			||||||
} SDL_GamepadAxis;
 | 
					} SDL_GamepadAxis;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef enum
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    SDL_GAMEPAD_BINDTYPE_NONE = 0,
 | 
					 | 
				
			||||||
    SDL_GAMEPAD_BINDTYPE_BUTTON,
 | 
					 | 
				
			||||||
    SDL_GAMEPAD_BINDTYPE_AXIS,
 | 
					 | 
				
			||||||
    SDL_GAMEPAD_BINDTYPE_HAT
 | 
					 | 
				
			||||||
} SDL_GamepadBindingType;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 *  Get the SDL joystick layer binding for this gamepad button/axis mapping
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
typedef struct SDL_GamepadBinding
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    SDL_GamepadBindingType bindType;
 | 
					 | 
				
			||||||
    union
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        int button;
 | 
					 | 
				
			||||||
        int axis;
 | 
					 | 
				
			||||||
        struct {
 | 
					 | 
				
			||||||
            int hat;
 | 
					 | 
				
			||||||
            int hat_mask;
 | 
					 | 
				
			||||||
        } hat;
 | 
					 | 
				
			||||||
    } value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
} SDL_GamepadBinding;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Add support for gamepads that SDL is unaware of or change the binding of an
 | 
					 * Add support for gamepads that SDL is unaware of or change the binding of an
 | 
				
			||||||
 * existing gamepad.
 | 
					 * existing gamepad.
 | 
				
			||||||
@@ -748,21 +721,6 @@ extern DECLSPEC SDL_GamepadAxis SDLCALL SDL_GetGamepadAxisFromString(const char
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
extern DECLSPEC const char* SDLCALL SDL_GetGamepadStringForAxis(SDL_GamepadAxis axis);
 | 
					extern DECLSPEC const char* SDLCALL SDL_GetGamepadStringForAxis(SDL_GamepadAxis axis);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Get the SDL joystick layer binding for a gamepad axis mapping.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * \param gamepad a gamepad
 | 
					 | 
				
			||||||
 * \param axis an axis enum value (one of the SDL_GamepadAxis values)
 | 
					 | 
				
			||||||
 * \returns a SDL_GamepadBinding describing the bind. On failure (like the
 | 
					 | 
				
			||||||
 *          given Controller axis doesn't exist on the device), its
 | 
					 | 
				
			||||||
 *          `.bindType` will be `SDL_GAMEPAD_BINDTYPE_NONE`.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * \since This function is available since SDL 3.0.0.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * \sa SDL_GetGamepadBindForButton
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
extern DECLSPEC SDL_GamepadBinding SDLCALL SDL_GetGamepadBindForAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Query whether a gamepad has a given axis.
 | 
					 * Query whether a gamepad has a given axis.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@@ -828,21 +786,6 @@ extern DECLSPEC SDL_GamepadButton SDLCALL SDL_GetGamepadButtonFromString(const c
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
extern DECLSPEC const char* SDLCALL SDL_GetGamepadStringForButton(SDL_GamepadButton button);
 | 
					extern DECLSPEC const char* SDLCALL SDL_GetGamepadStringForButton(SDL_GamepadButton button);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Get the SDL joystick layer binding for a gamepad button mapping.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * \param gamepad a gamepad
 | 
					 | 
				
			||||||
 * \param button an button enum value (an SDL_GamepadButton value)
 | 
					 | 
				
			||||||
 * \returns a SDL_GamepadBinding describing the bind. On failure (like the
 | 
					 | 
				
			||||||
 *          given Controller button doesn't exist on the device), its
 | 
					 | 
				
			||||||
 *          `.bindType` will be `SDL_GAMEPAD_BINDTYPE_NONE`.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * \since This function is available since SDL 3.0.0.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * \sa SDL_GetGamepadBindForAxis
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
extern DECLSPEC SDL_GamepadBinding SDLCALL SDL_GetGamepadBindForButton(SDL_Gamepad *gamepad, SDL_GamepadButton button);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Query whether a gamepad has a given button.
 | 
					 * Query whether a gamepad has a given button.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -189,8 +189,6 @@ SDL3_0.0.0 {
 | 
				
			|||||||
    SDL_GetGamepadAppleSFSymbolsNameForButton;
 | 
					    SDL_GetGamepadAppleSFSymbolsNameForButton;
 | 
				
			||||||
    SDL_GetGamepadAxis;
 | 
					    SDL_GetGamepadAxis;
 | 
				
			||||||
    SDL_GetGamepadAxisFromString;
 | 
					    SDL_GetGamepadAxisFromString;
 | 
				
			||||||
    SDL_GetGamepadBindForAxis;
 | 
					 | 
				
			||||||
    SDL_GetGamepadBindForButton;
 | 
					 | 
				
			||||||
    SDL_GetGamepadButton;
 | 
					    SDL_GetGamepadButton;
 | 
				
			||||||
    SDL_GetGamepadButtonFromString;
 | 
					    SDL_GetGamepadButtonFromString;
 | 
				
			||||||
    SDL_GetGamepadFirmwareVersion;
 | 
					    SDL_GetGamepadFirmwareVersion;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -213,8 +213,6 @@
 | 
				
			|||||||
#define SDL_GetGamepadAppleSFSymbolsNameForButton SDL_GetGamepadAppleSFSymbolsNameForButton_REAL
 | 
					#define SDL_GetGamepadAppleSFSymbolsNameForButton SDL_GetGamepadAppleSFSymbolsNameForButton_REAL
 | 
				
			||||||
#define SDL_GetGamepadAxis SDL_GetGamepadAxis_REAL
 | 
					#define SDL_GetGamepadAxis SDL_GetGamepadAxis_REAL
 | 
				
			||||||
#define SDL_GetGamepadAxisFromString SDL_GetGamepadAxisFromString_REAL
 | 
					#define SDL_GetGamepadAxisFromString SDL_GetGamepadAxisFromString_REAL
 | 
				
			||||||
#define SDL_GetGamepadBindForAxis SDL_GetGamepadBindForAxis_REAL
 | 
					 | 
				
			||||||
#define SDL_GetGamepadBindForButton SDL_GetGamepadBindForButton_REAL
 | 
					 | 
				
			||||||
#define SDL_GetGamepadButton SDL_GetGamepadButton_REAL
 | 
					#define SDL_GetGamepadButton SDL_GetGamepadButton_REAL
 | 
				
			||||||
#define SDL_GetGamepadButtonFromString SDL_GetGamepadButtonFromString_REAL
 | 
					#define SDL_GetGamepadButtonFromString SDL_GetGamepadButtonFromString_REAL
 | 
				
			||||||
#define SDL_GetGamepadFirmwareVersion SDL_GetGamepadFirmwareVersion_REAL
 | 
					#define SDL_GetGamepadFirmwareVersion SDL_GetGamepadFirmwareVersion_REAL
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -288,8 +288,6 @@ SDL_DYNAPI_PROC(const char*,SDL_GetGamepadAppleSFSymbolsNameForAxis,(SDL_Gamepad
 | 
				
			|||||||
SDL_DYNAPI_PROC(const char*,SDL_GetGamepadAppleSFSymbolsNameForButton,(SDL_Gamepad *a, SDL_GamepadButton b),(a,b),return)
 | 
					SDL_DYNAPI_PROC(const char*,SDL_GetGamepadAppleSFSymbolsNameForButton,(SDL_Gamepad *a, SDL_GamepadButton b),(a,b),return)
 | 
				
			||||||
SDL_DYNAPI_PROC(Sint16,SDL_GetGamepadAxis,(SDL_Gamepad *a, SDL_GamepadAxis b),(a,b),return)
 | 
					SDL_DYNAPI_PROC(Sint16,SDL_GetGamepadAxis,(SDL_Gamepad *a, SDL_GamepadAxis b),(a,b),return)
 | 
				
			||||||
SDL_DYNAPI_PROC(SDL_GamepadAxis,SDL_GetGamepadAxisFromString,(const char *a),(a),return)
 | 
					SDL_DYNAPI_PROC(SDL_GamepadAxis,SDL_GetGamepadAxisFromString,(const char *a),(a),return)
 | 
				
			||||||
SDL_DYNAPI_PROC(SDL_GamepadBinding,SDL_GetGamepadBindForAxis,(SDL_Gamepad *a, SDL_GamepadAxis b),(a,b),return)
 | 
					 | 
				
			||||||
SDL_DYNAPI_PROC(SDL_GamepadBinding,SDL_GetGamepadBindForButton,(SDL_Gamepad *a, SDL_GamepadButton b),(a,b),return)
 | 
					 | 
				
			||||||
SDL_DYNAPI_PROC(Uint8,SDL_GetGamepadButton,(SDL_Gamepad *a, SDL_GamepadButton b),(a,b),return)
 | 
					SDL_DYNAPI_PROC(Uint8,SDL_GetGamepadButton,(SDL_Gamepad *a, SDL_GamepadButton b),(a,b),return)
 | 
				
			||||||
SDL_DYNAPI_PROC(SDL_GamepadButton,SDL_GetGamepadButtonFromString,(const char *a),(a),return)
 | 
					SDL_DYNAPI_PROC(SDL_GamepadButton,SDL_GetGamepadButtonFromString,(const char *a),(a),return)
 | 
				
			||||||
SDL_DYNAPI_PROC(Uint16,SDL_GetGamepadFirmwareVersion,(SDL_Gamepad *a),(a),return)
 | 
					SDL_DYNAPI_PROC(Uint16,SDL_GetGamepadFirmwareVersion,(SDL_Gamepad *a),(a),return)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,6 +55,14 @@
 | 
				
			|||||||
/* a list of currently opened gamepads */
 | 
					/* a list of currently opened gamepads */
 | 
				
			||||||
static SDL_Gamepad *SDL_gamepads SDL_GUARDED_BY(SDL_joystick_lock) = NULL;
 | 
					static SDL_Gamepad *SDL_gamepads SDL_GUARDED_BY(SDL_joystick_lock) = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SDL_GAMEPAD_BINDTYPE_NONE = 0,
 | 
				
			||||||
 | 
					    SDL_GAMEPAD_BINDTYPE_BUTTON,
 | 
				
			||||||
 | 
					    SDL_GAMEPAD_BINDTYPE_AXIS,
 | 
				
			||||||
 | 
					    SDL_GAMEPAD_BINDTYPE_HAT
 | 
				
			||||||
 | 
					} SDL_GamepadBindingType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct
 | 
					typedef struct
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SDL_GamepadBindingType inputType;
 | 
					    SDL_GamepadBindingType inputType;
 | 
				
			||||||
@@ -91,7 +99,7 @@ typedef struct
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    } output;
 | 
					    } output;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} SDL_ExtendedGamepadBind;
 | 
					} SDL_GamepadBinding;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* our hard coded list of mapping support */
 | 
					/* our hard coded list of mapping support */
 | 
				
			||||||
typedef enum
 | 
					typedef enum
 | 
				
			||||||
@@ -133,8 +141,8 @@ struct SDL_Gamepad
 | 
				
			|||||||
    const char *name _guarded;
 | 
					    const char *name _guarded;
 | 
				
			||||||
    GamepadMapping_t *mapping _guarded;
 | 
					    GamepadMapping_t *mapping _guarded;
 | 
				
			||||||
    int num_bindings _guarded;
 | 
					    int num_bindings _guarded;
 | 
				
			||||||
    SDL_ExtendedGamepadBind *bindings _guarded;
 | 
					    SDL_GamepadBinding *bindings _guarded;
 | 
				
			||||||
    SDL_ExtendedGamepadBind **last_match_axis _guarded;
 | 
					    SDL_GamepadBinding **last_match_axis _guarded;
 | 
				
			||||||
    Uint8 *last_hat_mask _guarded;
 | 
					    Uint8 *last_hat_mask _guarded;
 | 
				
			||||||
    Uint64 guide_button_down _guarded;
 | 
					    Uint64 guide_button_down _guarded;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -168,7 +176,7 @@ static GamepadMapping_t *SDL_PrivateAddMappingForGUID(SDL_JoystickGUID jGUID, co
 | 
				
			|||||||
static int SDL_SendGamepadAxis(Uint64 timestamp, SDL_Gamepad *gamepad, SDL_GamepadAxis axis, Sint16 value);
 | 
					static int SDL_SendGamepadAxis(Uint64 timestamp, SDL_Gamepad *gamepad, SDL_GamepadAxis axis, Sint16 value);
 | 
				
			||||||
static int SDL_SendGamepadButton(Uint64 timestamp, SDL_Gamepad *gamepad, SDL_GamepadButton button, Uint8 state);
 | 
					static int SDL_SendGamepadButton(Uint64 timestamp, SDL_Gamepad *gamepad, SDL_GamepadButton button, Uint8 state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static SDL_bool HasSameOutput(SDL_ExtendedGamepadBind *a, SDL_ExtendedGamepadBind *b)
 | 
					static SDL_bool HasSameOutput(SDL_GamepadBinding *a, SDL_GamepadBinding *b)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (a->outputType != b->outputType) {
 | 
					    if (a->outputType != b->outputType) {
 | 
				
			||||||
        return SDL_FALSE;
 | 
					        return SDL_FALSE;
 | 
				
			||||||
@@ -181,7 +189,7 @@ static SDL_bool HasSameOutput(SDL_ExtendedGamepadBind *a, SDL_ExtendedGamepadBin
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void ResetOutput(Uint64 timestamp, SDL_Gamepad *gamepad, SDL_ExtendedGamepadBind *bind)
 | 
					static void ResetOutput(Uint64 timestamp, SDL_Gamepad *gamepad, SDL_GamepadBinding *bind)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (bind->outputType == SDL_GAMEPAD_BINDTYPE_AXIS) {
 | 
					    if (bind->outputType == SDL_GAMEPAD_BINDTYPE_AXIS) {
 | 
				
			||||||
        SDL_SendGamepadAxis(timestamp, gamepad, bind->output.axis.axis, 0);
 | 
					        SDL_SendGamepadAxis(timestamp, gamepad, bind->output.axis.axis, 0);
 | 
				
			||||||
@@ -193,14 +201,14 @@ static void ResetOutput(Uint64 timestamp, SDL_Gamepad *gamepad, SDL_ExtendedGame
 | 
				
			|||||||
static void HandleJoystickAxis(Uint64 timestamp, SDL_Gamepad *gamepad, int axis, int value)
 | 
					static void HandleJoystickAxis(Uint64 timestamp, SDL_Gamepad *gamepad, int axis, int value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
    SDL_ExtendedGamepadBind *last_match;
 | 
					    SDL_GamepadBinding *last_match;
 | 
				
			||||||
    SDL_ExtendedGamepadBind *match = NULL;
 | 
					    SDL_GamepadBinding *match = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SDL_AssertJoysticksLocked();
 | 
					    SDL_AssertJoysticksLocked();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    last_match = gamepad->last_match_axis[axis];
 | 
					    last_match = gamepad->last_match_axis[axis];
 | 
				
			||||||
    for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
					    for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
				
			||||||
        SDL_ExtendedGamepadBind *binding = &gamepad->bindings[i];
 | 
					        SDL_GamepadBinding *binding = &gamepad->bindings[i];
 | 
				
			||||||
        if (binding->inputType == SDL_GAMEPAD_BINDTYPE_AXIS &&
 | 
					        if (binding->inputType == SDL_GAMEPAD_BINDTYPE_AXIS &&
 | 
				
			||||||
            axis == binding->input.axis.axis) {
 | 
					            axis == binding->input.axis.axis) {
 | 
				
			||||||
            if (binding->input.axis.axis_min < binding->input.axis.axis_max) {
 | 
					            if (binding->input.axis.axis_min < binding->input.axis.axis_max) {
 | 
				
			||||||
@@ -252,7 +260,7 @@ static void HandleJoystickButton(Uint64 timestamp, SDL_Gamepad *gamepad, int but
 | 
				
			|||||||
    SDL_AssertJoysticksLocked();
 | 
					    SDL_AssertJoysticksLocked();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
					    for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
				
			||||||
        SDL_ExtendedGamepadBind *binding = &gamepad->bindings[i];
 | 
					        SDL_GamepadBinding *binding = &gamepad->bindings[i];
 | 
				
			||||||
        if (binding->inputType == SDL_GAMEPAD_BINDTYPE_BUTTON &&
 | 
					        if (binding->inputType == SDL_GAMEPAD_BINDTYPE_BUTTON &&
 | 
				
			||||||
            button == binding->input.button) {
 | 
					            button == binding->input.button) {
 | 
				
			||||||
            if (binding->outputType == SDL_GAMEPAD_BINDTYPE_AXIS) {
 | 
					            if (binding->outputType == SDL_GAMEPAD_BINDTYPE_AXIS) {
 | 
				
			||||||
@@ -276,7 +284,7 @@ static void HandleJoystickHat(Uint64 timestamp, SDL_Gamepad *gamepad, int hat, U
 | 
				
			|||||||
    last_mask = gamepad->last_hat_mask[hat];
 | 
					    last_mask = gamepad->last_hat_mask[hat];
 | 
				
			||||||
    changed_mask = (last_mask ^ value);
 | 
					    changed_mask = (last_mask ^ value);
 | 
				
			||||||
    for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
					    for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
				
			||||||
        SDL_ExtendedGamepadBind *binding = &gamepad->bindings[i];
 | 
					        SDL_GamepadBinding *binding = &gamepad->bindings[i];
 | 
				
			||||||
        if (binding->inputType == SDL_GAMEPAD_BINDTYPE_HAT && hat == binding->input.hat.hat) {
 | 
					        if (binding->inputType == SDL_GAMEPAD_BINDTYPE_HAT && hat == binding->input.hat.hat) {
 | 
				
			||||||
            if ((changed_mask & binding->input.hat.hat_mask) != 0) {
 | 
					            if ((changed_mask & binding->input.hat.hat_mask) != 0) {
 | 
				
			||||||
                if (value & binding->input.hat.hat_mask) {
 | 
					                if (value & binding->input.hat.hat_mask) {
 | 
				
			||||||
@@ -962,7 +970,7 @@ const char *SDL_GetGamepadStringForButton(SDL_GamepadButton button)
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
static int SDL_PrivateParseGamepadElement(SDL_Gamepad *gamepad, const char *szGameButton, const char *szJoystickButton)
 | 
					static int SDL_PrivateParseGamepadElement(SDL_Gamepad *gamepad, const char *szGameButton, const char *szJoystickButton)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SDL_ExtendedGamepadBind bind;
 | 
					    SDL_GamepadBinding bind;
 | 
				
			||||||
    SDL_GamepadButton button;
 | 
					    SDL_GamepadButton button;
 | 
				
			||||||
    SDL_GamepadAxis axis;
 | 
					    SDL_GamepadAxis axis;
 | 
				
			||||||
    SDL_bool invert_input = SDL_FALSE;
 | 
					    SDL_bool invert_input = SDL_FALSE;
 | 
				
			||||||
@@ -1042,7 +1050,7 @@ static int SDL_PrivateParseGamepadElement(SDL_Gamepad *gamepad, const char *szGa
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ++gamepad->num_bindings;
 | 
					    ++gamepad->num_bindings;
 | 
				
			||||||
    gamepad->bindings = (SDL_ExtendedGamepadBind *)SDL_realloc(gamepad->bindings, gamepad->num_bindings * sizeof(*gamepad->bindings));
 | 
					    gamepad->bindings = (SDL_GamepadBinding *)SDL_realloc(gamepad->bindings, gamepad->num_bindings * sizeof(*gamepad->bindings));
 | 
				
			||||||
    if (!gamepad->bindings) {
 | 
					    if (!gamepad->bindings) {
 | 
				
			||||||
        gamepad->num_bindings = 0;
 | 
					        gamepad->num_bindings = 0;
 | 
				
			||||||
        return SDL_OutOfMemory();
 | 
					        return SDL_OutOfMemory();
 | 
				
			||||||
@@ -1121,7 +1129,7 @@ static void SDL_PrivateLoadButtonMapping(SDL_Gamepad *gamepad, GamepadMapping_t
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /* Set the zero point for triggers */
 | 
					    /* Set the zero point for triggers */
 | 
				
			||||||
    for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
					    for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
				
			||||||
        SDL_ExtendedGamepadBind *binding = &gamepad->bindings[i];
 | 
					        SDL_GamepadBinding *binding = &gamepad->bindings[i];
 | 
				
			||||||
        if (binding->inputType == SDL_GAMEPAD_BINDTYPE_AXIS &&
 | 
					        if (binding->inputType == SDL_GAMEPAD_BINDTYPE_AXIS &&
 | 
				
			||||||
            binding->outputType == SDL_GAMEPAD_BINDTYPE_AXIS &&
 | 
					            binding->outputType == SDL_GAMEPAD_BINDTYPE_AXIS &&
 | 
				
			||||||
            (binding->output.axis.axis == SDL_GAMEPAD_AXIS_LEFT_TRIGGER ||
 | 
					            (binding->output.axis.axis == SDL_GAMEPAD_AXIS_LEFT_TRIGGER ||
 | 
				
			||||||
@@ -2196,7 +2204,7 @@ SDL_Gamepad *SDL_OpenGamepad(SDL_JoystickID instance_id)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (gamepad->joystick->naxes) {
 | 
					    if (gamepad->joystick->naxes) {
 | 
				
			||||||
        gamepad->last_match_axis = (SDL_ExtendedGamepadBind **)SDL_calloc(gamepad->joystick->naxes, sizeof(*gamepad->last_match_axis));
 | 
					        gamepad->last_match_axis = (SDL_GamepadBinding **)SDL_calloc(gamepad->joystick->naxes, sizeof(*gamepad->last_match_axis));
 | 
				
			||||||
        if (!gamepad->last_match_axis) {
 | 
					        if (!gamepad->last_match_axis) {
 | 
				
			||||||
            SDL_OutOfMemory();
 | 
					            SDL_OutOfMemory();
 | 
				
			||||||
            SDL_CloseJoystick(gamepad->joystick);
 | 
					            SDL_CloseJoystick(gamepad->joystick);
 | 
				
			||||||
@@ -2244,17 +2252,25 @@ void SDL_UpdateGamepads(void)
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
SDL_bool SDL_GamepadHasAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis)
 | 
					SDL_bool SDL_GamepadHasAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SDL_GamepadBinding bind;
 | 
					    SDL_bool retval = SDL_FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SDL_LockJoysticks();
 | 
					    SDL_LockJoysticks();
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        CHECK_GAMEPAD_MAGIC(gamepad, SDL_FALSE);
 | 
					        CHECK_GAMEPAD_MAGIC(gamepad, SDL_FALSE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        bind = SDL_GetGamepadBindForAxis(gamepad, axis);
 | 
					        for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
				
			||||||
 | 
					            SDL_GamepadBinding *binding = &gamepad->bindings[i];
 | 
				
			||||||
 | 
					            if (binding->outputType == SDL_GAMEPAD_BINDTYPE_AXIS && binding->output.axis.axis == axis) {
 | 
				
			||||||
 | 
					                retval = SDL_TRUE;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    SDL_UnlockJoysticks();
 | 
					    SDL_UnlockJoysticks();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (bind.bindType != SDL_GAMEPAD_BINDTYPE_NONE) ? SDL_TRUE : SDL_FALSE;
 | 
					    return retval;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -2271,7 +2287,7 @@ Sint16 SDL_GetGamepadAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis)
 | 
				
			|||||||
        CHECK_GAMEPAD_MAGIC(gamepad, 0);
 | 
					        CHECK_GAMEPAD_MAGIC(gamepad, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
					        for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
				
			||||||
            SDL_ExtendedGamepadBind *binding = &gamepad->bindings[i];
 | 
					            SDL_GamepadBinding *binding = &gamepad->bindings[i];
 | 
				
			||||||
            if (binding->outputType == SDL_GAMEPAD_BINDTYPE_AXIS && binding->output.axis.axis == axis) {
 | 
					            if (binding->outputType == SDL_GAMEPAD_BINDTYPE_AXIS && binding->output.axis.axis == axis) {
 | 
				
			||||||
                int value = 0;
 | 
					                int value = 0;
 | 
				
			||||||
                SDL_bool valid_input_range;
 | 
					                SDL_bool valid_input_range;
 | 
				
			||||||
@@ -2327,17 +2343,25 @@ Sint16 SDL_GetGamepadAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis)
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
SDL_bool SDL_GamepadHasButton(SDL_Gamepad *gamepad, SDL_GamepadButton button)
 | 
					SDL_bool SDL_GamepadHasButton(SDL_Gamepad *gamepad, SDL_GamepadButton button)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SDL_GamepadBinding bind;
 | 
					    SDL_bool retval = SDL_FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    SDL_LockJoysticks();
 | 
					    SDL_LockJoysticks();
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        CHECK_GAMEPAD_MAGIC(gamepad, SDL_FALSE);
 | 
					        CHECK_GAMEPAD_MAGIC(gamepad, SDL_FALSE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        bind = SDL_GetGamepadBindForButton(gamepad, button);
 | 
					        for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
				
			||||||
 | 
					            SDL_GamepadBinding *binding = &gamepad->bindings[i];
 | 
				
			||||||
 | 
					            if (binding->outputType == SDL_GAMEPAD_BINDTYPE_BUTTON && binding->output.button == button) {
 | 
				
			||||||
 | 
					                retval = SDL_TRUE;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    SDL_UnlockJoysticks();
 | 
					    SDL_UnlockJoysticks();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (bind.bindType != SDL_GAMEPAD_BINDTYPE_NONE) ? SDL_TRUE : SDL_FALSE;
 | 
					    return retval;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@@ -2354,7 +2378,7 @@ Uint8 SDL_GetGamepadButton(SDL_Gamepad *gamepad, SDL_GamepadButton button)
 | 
				
			|||||||
        CHECK_GAMEPAD_MAGIC(gamepad, 0);
 | 
					        CHECK_GAMEPAD_MAGIC(gamepad, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
					        for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
				
			||||||
            SDL_ExtendedGamepadBind *binding = &gamepad->bindings[i];
 | 
					            SDL_GamepadBinding *binding = &gamepad->bindings[i];
 | 
				
			||||||
            if (binding->outputType == SDL_GAMEPAD_BINDTYPE_BUTTON && binding->output.button == button) {
 | 
					            if (binding->outputType == SDL_GAMEPAD_BINDTYPE_BUTTON && binding->output.button == button) {
 | 
				
			||||||
                if (binding->inputType == SDL_GAMEPAD_BINDTYPE_AXIS) {
 | 
					                if (binding->inputType == SDL_GAMEPAD_BINDTYPE_AXIS) {
 | 
				
			||||||
                    SDL_bool valid_input_range;
 | 
					                    SDL_bool valid_input_range;
 | 
				
			||||||
@@ -2859,81 +2883,6 @@ SDL_Gamepad *SDL_GetGamepadFromPlayerIndex(int player_index)
 | 
				
			|||||||
    return retval;
 | 
					    return retval;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Get the SDL joystick layer binding for this gamepad axis mapping
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
SDL_GamepadBinding SDL_GetGamepadBindForAxis(SDL_Gamepad *gamepad, SDL_GamepadAxis axis)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    SDL_GamepadBinding bind;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SDL_zero(bind);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SDL_LockJoysticks();
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        CHECK_GAMEPAD_MAGIC(gamepad, bind);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (axis != SDL_GAMEPAD_AXIS_INVALID) {
 | 
					 | 
				
			||||||
            int i;
 | 
					 | 
				
			||||||
            for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
					 | 
				
			||||||
                SDL_ExtendedGamepadBind *binding = &gamepad->bindings[i];
 | 
					 | 
				
			||||||
                if (binding->outputType == SDL_GAMEPAD_BINDTYPE_AXIS && binding->output.axis.axis == axis) {
 | 
					 | 
				
			||||||
                    bind.bindType = binding->inputType;
 | 
					 | 
				
			||||||
                    if (binding->inputType == SDL_GAMEPAD_BINDTYPE_AXIS) {
 | 
					 | 
				
			||||||
                        /* FIXME: There might be multiple axes bound now that we have axis ranges... */
 | 
					 | 
				
			||||||
                        bind.value.axis = binding->input.axis.axis;
 | 
					 | 
				
			||||||
                    } else if (binding->inputType == SDL_GAMEPAD_BINDTYPE_BUTTON) {
 | 
					 | 
				
			||||||
                        bind.value.button = binding->input.button;
 | 
					 | 
				
			||||||
                    } else if (binding->inputType == SDL_GAMEPAD_BINDTYPE_HAT) {
 | 
					 | 
				
			||||||
                        bind.value.hat.hat = binding->input.hat.hat;
 | 
					 | 
				
			||||||
                        bind.value.hat.hat_mask = binding->input.hat.hat_mask;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    SDL_UnlockJoysticks();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return bind;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Get the SDL joystick layer binding for this gamepad button mapping
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
SDL_GamepadBinding SDL_GetGamepadBindForButton(SDL_Gamepad *gamepad, SDL_GamepadButton button)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    SDL_GamepadBinding bind;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SDL_zero(bind);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    SDL_LockJoysticks();
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        CHECK_GAMEPAD_MAGIC(gamepad, bind);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (button != SDL_GAMEPAD_BUTTON_INVALID) {
 | 
					 | 
				
			||||||
            int i;
 | 
					 | 
				
			||||||
            for (i = 0; i < gamepad->num_bindings; ++i) {
 | 
					 | 
				
			||||||
                SDL_ExtendedGamepadBind *binding = &gamepad->bindings[i];
 | 
					 | 
				
			||||||
                if (binding->outputType == SDL_GAMEPAD_BINDTYPE_BUTTON && binding->output.button == button) {
 | 
					 | 
				
			||||||
                    bind.bindType = binding->inputType;
 | 
					 | 
				
			||||||
                    if (binding->inputType == SDL_GAMEPAD_BINDTYPE_AXIS) {
 | 
					 | 
				
			||||||
                        bind.value.axis = binding->input.axis.axis;
 | 
					 | 
				
			||||||
                    } else if (binding->inputType == SDL_GAMEPAD_BINDTYPE_BUTTON) {
 | 
					 | 
				
			||||||
                        bind.value.button = binding->input.button;
 | 
					 | 
				
			||||||
                    } else if (binding->inputType == SDL_GAMEPAD_BINDTYPE_HAT) {
 | 
					 | 
				
			||||||
                        bind.value.hat.hat = binding->input.hat.hat;
 | 
					 | 
				
			||||||
                        bind.value.hat.hat_mask = binding->input.hat.hat_mask;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    break;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    SDL_UnlockJoysticks();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return bind;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms)
 | 
					int SDL_RumbleGamepad(SDL_Gamepad *gamepad, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    SDL_Joystick *joystick = SDL_GetGamepadJoystick(gamepad);
 | 
					    SDL_Joystick *joystick = SDL_GetGamepadJoystick(gamepad);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user