Skip to content

Commit

Permalink
Added SDL_GameControllerMappingForDeviceIndex() to get the mapping fo…
Browse files Browse the repository at this point in the history
…r a controller before it's opened
  • Loading branch information
slouken committed Mar 7, 2018
1 parent 9e651b6 commit a8ac588
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 22 deletions.
8 changes: 8 additions & 0 deletions WhatsNew.txt
@@ -1,6 +1,14 @@

This is a list of major changes in SDL's version history.

---------------------------------------------------------------------------
2.0.9:
---------------------------------------------------------------------------

General:
* Added SDL_GameControllerMappingForDeviceIndex() to get the mapping for a controller before it's opened


---------------------------------------------------------------------------
2.0.8:
---------------------------------------------------------------------------
Expand Down
8 changes: 8 additions & 0 deletions include/SDL_gamecontroller.h
Expand Up @@ -175,6 +175,14 @@ extern DECLSPEC SDL_bool SDLCALL SDL_IsGameController(int joystick_index);
*/
extern DECLSPEC const char *SDLCALL SDL_GameControllerNameForIndex(int joystick_index);

/**
* Get the mapping of a game controller.
* This can be called before any controllers are opened.
*
* \return the mapping string. Must be freed with SDL_free(). Returns NULL if no mapping is available
*/
extern DECLSPEC char *SDLCALL SDL_GameControllerMappingForDeviceIndex(int joystick_index);

/**
* Open a game controller for use.
* The index passed as an argument refers to the N'th game controller on the system.
Expand Down
1 change: 1 addition & 0 deletions src/dynapi/SDL_dynapi_overrides.h
Expand Up @@ -669,3 +669,4 @@
#define SDL_WinRTGetDeviceFamily SDL_WinRTGetDeviceFamily_REAL
#define SDL_log10 SDL_log10_REAL
#define SDL_log10f SDL_log10f_REAL
#define SDL_GameControllerMappingForDeviceIndex SDL_GameControllerMappingForDeviceIndex_REAL
1 change: 1 addition & 0 deletions src/dynapi/SDL_dynapi_procs.h
Expand Up @@ -707,3 +707,4 @@ SDL_DYNAPI_PROC(SDL_bool,SDL_IsAndroidTV,(void),(),return)
#endif
SDL_DYNAPI_PROC(double,SDL_log10,(double a),(a),return)
SDL_DYNAPI_PROC(float,SDL_log10f,(float a),(a),return)
SDL_DYNAPI_PROC(char*,SDL_GameControllerMappingForDeviceIndex,(int a),(a),return)
45 changes: 40 additions & 5 deletions src/joystick/SDL_gamecontroller.c
Expand Up @@ -425,6 +425,12 @@ static ControllerMapping_t *SDL_PrivateGetControllerMappingForGUID(SDL_JoystickG
}
pSupportedController = pSupportedController->next;
}
#if SDL_JOYSTICK_XINPUT
if (guid->data[14] == 'x') {
/* This is an XInput device */
return s_pXInputMapping;
}
#endif
return NULL;
}

Expand Down Expand Up @@ -1033,11 +1039,6 @@ static ControllerMapping_t *SDL_PrivateGetControllerMapping(int device_index)
name = SDL_JoystickNameForIndex(device_index);
guid = SDL_JoystickGetDeviceGUID(device_index);
mapping = SDL_PrivateGetControllerMappingForNameAndGUID(name, guid);
#if SDL_JOYSTICK_XINPUT
if (!mapping && SDL_SYS_IsXInputGamepad_DeviceIndex(device_index)) {
mapping = s_pXInputMapping;
}
#endif
SDL_UnlockJoysticks();
return mapping;
}
Expand Down Expand Up @@ -1374,6 +1375,40 @@ SDL_GameControllerNameForIndex(int device_index)
}


/**
* Get the mapping of a game controller.
* This can be called before any controllers are opened.
* If no mapping can be found, this function returns NULL.
*/
char *
SDL_GameControllerMappingForDeviceIndex(int joystick_index)
{
char *pMappingString = NULL;
ControllerMapping_t *mapping;

SDL_LockJoysticks();
mapping = SDL_PrivateGetControllerMapping(joystick_index);
if (mapping) {
SDL_JoystickGUID guid;
char pchGUID[33];
size_t needed;
guid = SDL_JoystickGetDeviceGUID(joystick_index);
SDL_JoystickGetGUIDString(guid, pchGUID, sizeof(pchGUID));
/* allocate enough memory for GUID + ',' + name + ',' + mapping + \0 */
needed = SDL_strlen(pchGUID) + 1 + SDL_strlen(mapping->name) + 1 + SDL_strlen(mapping->mapping) + 1;
pMappingString = SDL_malloc(needed);
if (!pMappingString) {
SDL_OutOfMemory();
SDL_UnlockJoysticks();
return NULL;
}
SDL_snprintf(pMappingString, needed, "%s,%s,%s", pchGUID, mapping->name, mapping->mapping);
}
SDL_UnlockJoysticks();
return pMappingString;
}


/*
* Return 1 if the joystick with this name and GUID is a supported controller
*/
Expand Down
5 changes: 0 additions & 5 deletions src/joystick/SDL_sysjoystick.h
Expand Up @@ -121,11 +121,6 @@ extern SDL_JoystickGUID SDL_SYS_JoystickGetDeviceGUID(int device_index);
/* Function to return the stable GUID for a opened joystick */
extern SDL_JoystickGUID SDL_SYS_JoystickGetGUID(SDL_Joystick * joystick);

#if SDL_JOYSTICK_XINPUT
/* Function returns SDL_TRUE if this device is an XInput gamepad */
extern SDL_bool SDL_SYS_IsXInputGamepad_DeviceIndex(int device_index);
#endif

#endif /* SDL_sysjoystick_h_ */

/* vi: set ts=4 sw=4 expandtab: */
12 changes: 0 additions & 12 deletions src/joystick/windows/SDL_xinputjoystick.c
Expand Up @@ -464,18 +464,6 @@ SDL_XINPUT_JoystickQuit(void)
}
}

SDL_bool
SDL_SYS_IsXInputGamepad_DeviceIndex(int device_index)
{
JoyStick_DeviceData *device = SYS_Joystick;
int index;

for (index = device_index; index > 0; index--)
device = device->pNext;

return device->bXInputDevice;
}

#else /* !SDL_JOYSTICK_XINPUT */

typedef struct JoyStick_DeviceData JoyStick_DeviceData;
Expand Down

0 comments on commit a8ac588

Please sign in to comment.