Added an API to get the joystick instance ID before opening the device: SDL_JoystickGetDeviceInstanceID()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
diff --git a/include/SDL_joystick.h b/include/SDL_joystick.h
index 1ee2480..698b09c 100644
--- a/include/SDL_joystick.h
+++ b/include/SDL_joystick.h
@@ -71,6 +71,13 @@ typedef struct {
Uint8 data[16];
} SDL_JoystickGUID;
+/**
+ * This is a unique ID for a joystick for the time it is connected to the system,
+ * and is never reused for the lifetime of the application. If the joystick is
+ * disconnected and reconnected, it will get a new ID.
+ *
+ * The ID value starts at 0 and increments from there. The value -1 is an invalid ID.
+ */
typedef Sint32 SDL_JoystickID;
typedef enum
@@ -145,6 +152,13 @@ extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceProductVersion(int device_in
extern DECLSPEC SDL_JoystickType SDLCALL SDL_JoystickGetDeviceType(int device_index);
/**
+ * Get the instance ID of a joystick.
+ * This can be called before any joysticks are opened.
+ * If the index is out of range, this function will return -1.
+ */
+extern DECLSPEC SDL_JoystickID SDLCALL SDL_JoystickGetDeviceInstanceID(int device_index);
+
+/**
* Open a joystick for use.
* The index passed as an argument refers to the N'th joystick on the system.
* This index is not the value which will identify this joystick in future
diff --git a/src/dynapi/SDL_dynapi_overrides.h b/src/dynapi/SDL_dynapi_overrides.h
index 942737a..1817e7f 100644
--- a/src/dynapi/SDL_dynapi_overrides.h
+++ b/src/dynapi/SDL_dynapi_overrides.h
@@ -623,3 +623,4 @@
#define SDL_JoystickGetType SDL_JoystickGetType_REAL
#define SDL_MemoryBarrierReleaseFunction SDL_MemoryBarrierReleaseFunction_REAL
#define SDL_MemoryBarrierAcquireFunction SDL_MemoryBarrierAcquireFunction_REAL
+#define SDL_JoystickGetDeviceInstanceID SDL_JoystickGetDeviceInstanceID_REAL
diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h
index b54cdff..457001b 100644
--- a/src/dynapi/SDL_dynapi_procs.h
+++ b/src/dynapi/SDL_dynapi_procs.h
@@ -655,3 +655,4 @@ SDL_DYNAPI_PROC(SDL_JoystickType,SDL_JoystickGetDeviceType,(int a),(a),return)
SDL_DYNAPI_PROC(SDL_JoystickType,SDL_JoystickGetType,(SDL_Joystick *a),(a),return)
SDL_DYNAPI_PROC(void,SDL_MemoryBarrierReleaseFunction,(void),(),)
SDL_DYNAPI_PROC(void,SDL_MemoryBarrierAcquireFunction,(void),(),)
+SDL_DYNAPI_PROC(SDL_JoystickID,SDL_JoystickGetDeviceInstanceID,(int a),(a),return)
diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c
index 12eccf2..8ff9dde 100644
--- a/src/joystick/SDL_joystick.c
+++ b/src/joystick/SDL_joystick.c
@@ -108,7 +108,7 @@ SDL_NumJoysticks(void)
const char *
SDL_JoystickNameForIndex(int device_index)
{
- if ((device_index < 0) || (device_index >= SDL_NumJoysticks())) {
+ if (device_index < 0 || device_index >= SDL_NumJoysticks()) {
SDL_SetError("There are %d joysticks available", SDL_NumJoysticks());
return (NULL);
}
@@ -170,10 +170,10 @@ SDL_JoystickOpen(int device_index)
joysticklist = SDL_joysticks;
/* If the joystick is already open, return it
- * it is important that we have a single joystick * for each instance id
- */
+ * it is important that we have a single joystick * for each instance id
+ */
while (joysticklist) {
- if (SDL_SYS_GetInstanceIdOfDeviceIndex(device_index) == joysticklist->instance_id) {
+ if (SDL_JoystickGetDeviceInstanceID(device_index) == joysticklist->instance_id) {
joystick = joysticklist;
++joystick->ref_count;
SDL_UnlockJoystickList();
@@ -1078,7 +1078,7 @@ static SDL_JoystickType SDL_GetJoystickGUIDType(SDL_JoystickGUID guid)
/* return the guid for this index */
SDL_JoystickGUID SDL_JoystickGetDeviceGUID(int device_index)
{
- if ((device_index < 0) || (device_index >= SDL_NumJoysticks())) {
+ if (device_index < 0 || device_index >= SDL_NumJoysticks()) {
SDL_JoystickGUID emptyGUID;
SDL_SetError("There are %d joysticks available", SDL_NumJoysticks());
SDL_zero(emptyGUID);
@@ -1128,7 +1128,15 @@ SDL_JoystickType SDL_JoystickGetDeviceType(int device_index)
return type;
}
-/* return the guid for this opened device */
+SDL_JoystickID SDL_JoystickGetDeviceInstanceID(int device_index)
+{
+ if (device_index < 0 || device_index >= SDL_NumJoysticks()) {
+ SDL_SetError("There are %d joysticks available", SDL_NumJoysticks());
+ return -1;
+ }
+ return SDL_SYS_GetInstanceIdOfDeviceIndex(device_index);
+}
+
SDL_JoystickGUID SDL_JoystickGetGUID(SDL_Joystick * joystick)
{
if (!SDL_PrivateJoystickValid(joystick)) {