|
@@ -32,6 +32,8 @@ |
|
|
#include "../events/SDL_events_c.h" |
|
|
#endif |
|
|
|
|
|
#define MAKE_VIDPID(VID, PID) (((Uint32)(VID))<<16|(PID)) |
|
|
|
|
|
static SDL_bool SDL_joystick_allows_background_events = SDL_FALSE; |
|
|
static SDL_Joystick *SDL_joysticks = NULL; |
|
|
static SDL_bool SDL_updating_joystick = SDL_FALSE; |
|
@@ -121,17 +123,14 @@ SDL_JoystickNameForIndex(int device_index) |
|
|
static SDL_bool |
|
|
SDL_JoystickAxesCenteredAtZero(SDL_Joystick *joystick) |
|
|
{ |
|
|
struct { |
|
|
Uint16 vendor; |
|
|
Uint16 product; |
|
|
} zero_centered_joysticks[] = { |
|
|
{ 0x0e8f, 0x3013 }, /* HuiJia SNES USB adapter */ |
|
|
{ 0x05a0, 0x3232 }, /* 8Bitdo Zero Gamepad */ |
|
|
static Uint32 zero_centered_joysticks[] = { |
|
|
MAKE_VIDPID(0x0e8f, 0x3013), /* HuiJia SNES USB adapter */ |
|
|
MAKE_VIDPID(0x05a0, 0x3232), /* 8Bitdo Zero Gamepad */ |
|
|
}; |
|
|
|
|
|
int i; |
|
|
Uint16 vendor = SDL_JoystickGetVendor(joystick); |
|
|
Uint16 product = SDL_JoystickGetProduct(joystick); |
|
|
Uint32 id = MAKE_VIDPID(SDL_JoystickGetVendor(joystick), |
|
|
SDL_JoystickGetProduct(joystick)); |
|
|
|
|
|
/*printf("JOYSTICK '%s' VID/PID 0x%.4x/0x%.4x AXES: %d\n", joystick->name, vendor, product, joystick->naxes);*/ |
|
|
|
|
@@ -141,8 +140,7 @@ SDL_JoystickAxesCenteredAtZero(SDL_Joystick *joystick) |
|
|
} |
|
|
|
|
|
for (i = 0; i < SDL_arraysize(zero_centered_joysticks); ++i) { |
|
|
if (vendor == zero_centered_joysticks[i].vendor && |
|
|
product == zero_centered_joysticks[i].product) { |
|
|
if (id == zero_centered_joysticks[i]) { |
|
|
return SDL_TRUE; |
|
|
} |
|
|
} |
|
@@ -185,14 +183,13 @@ SDL_JoystickOpen(int device_index) |
|
|
} |
|
|
|
|
|
/* Create and initialize the joystick */ |
|
|
joystick = (SDL_Joystick *) SDL_malloc((sizeof *joystick)); |
|
|
joystick = (SDL_Joystick *) SDL_calloc(sizeof(*joystick), 1); |
|
|
if (joystick == NULL) { |
|
|
SDL_OutOfMemory(); |
|
|
SDL_UnlockJoystickList(); |
|
|
return NULL; |
|
|
} |
|
|
|
|
|
SDL_memset(joystick, 0, (sizeof *joystick)); |
|
|
if (SDL_SYS_JoystickOpen(joystick, device_index) < 0) { |
|
|
SDL_free(joystick); |
|
|
SDL_UnlockJoystickList(); |
|
@@ -237,6 +234,8 @@ SDL_JoystickOpen(int device_index) |
|
|
} |
|
|
} |
|
|
|
|
|
joystick->is_game_controller = SDL_IsGameController(device_index); |
|
|
|
|
|
/* Add joystick to list */ |
|
|
++joystick->ref_count; |
|
|
/* Link the joystick in the list */ |
|
@@ -932,7 +931,7 @@ SDL_JoystickEventState(int state) |
|
|
#endif /* SDL_EVENTS_DISABLED */ |
|
|
} |
|
|
|
|
|
static void GetJoystickGUIDInfo(SDL_JoystickGUID guid, Uint16 *vendor, Uint16 *product, Uint16 *version) |
|
|
static void SDL_GetJoystickGUIDInfo(SDL_JoystickGUID guid, Uint16 *vendor, Uint16 *product, Uint16 *version) |
|
|
{ |
|
|
Uint16 *guid16 = (Uint16 *)guid.data; |
|
|
|
|
@@ -967,6 +966,73 @@ static void GetJoystickGUIDInfo(SDL_JoystickGUID guid, Uint16 *vendor, Uint16 *p |
|
|
} |
|
|
} |
|
|
|
|
|
static SDL_bool SDL_IsJoystickGUIDWheel(SDL_JoystickGUID guid) |
|
|
{ |
|
|
static Uint32 wheel_joysticks[] = { |
|
|
MAKE_VIDPID(0x046d, 0xc294), /* Logitech generic wheel */ |
|
|
MAKE_VIDPID(0x046d, 0xc295), /* Logitech Momo Force */ |
|
|
MAKE_VIDPID(0x046d, 0xc298), /* Logitech Driving Force Pro */ |
|
|
MAKE_VIDPID(0x046d, 0xc299), /* Logitech G25 */ |
|
|
MAKE_VIDPID(0x046d, 0xc29a), /* Logitech Driving Force GT */ |
|
|
MAKE_VIDPID(0x046d, 0xc29b), /* Logitech G27 */ |
|
|
MAKE_VIDPID(0x046d, 0xc261), /* Logitech G920 (initial mode) */ |
|
|
MAKE_VIDPID(0x046d, 0xc262), /* Logitech G920 (active mode) */ |
|
|
MAKE_VIDPID(0x044f, 0xb65d), /* Thrustmaster Wheel FFB */ |
|
|
MAKE_VIDPID(0x044f, 0xb677), /* Thrustmaster T150 */ |
|
|
MAKE_VIDPID(0x044f, 0xb664), /* Thrustmaster TX (initial mode) */ |
|
|
MAKE_VIDPID(0x044f, 0xb669), /* Thrustmaster TX (active mode) */ |
|
|
}; |
|
|
Uint16 vendor; |
|
|
Uint16 product; |
|
|
Uint32 id; |
|
|
int i; |
|
|
|
|
|
SDL_GetJoystickGUIDInfo(guid, &vendor, &product, NULL); |
|
|
id = MAKE_VIDPID(vendor, product); |
|
|
|
|
|
for (i = 0; i < SDL_arraysize(wheel_joysticks); ++i) { |
|
|
if (id == wheel_joysticks[i]) { |
|
|
return SDL_TRUE; |
|
|
} |
|
|
} |
|
|
return SDL_FALSE; |
|
|
} |
|
|
|
|
|
static SDL_JoystickType SDL_GetJoystickGUIDType(SDL_JoystickGUID guid) |
|
|
{ |
|
|
if (guid.data[14] == 'x') { |
|
|
/* XInput GUID, get the type based on the XInput device subtype */ |
|
|
switch (guid.data[15]) { |
|
|
case 0x01: /* XINPUT_DEVSUBTYPE_GAMEPAD */ |
|
|
return SDL_JOYSTICK_TYPE_GAMECONTROLLER; |
|
|
case 0x02: /* XINPUT_DEVSUBTYPE_WHEEL */ |
|
|
return SDL_JOYSTICK_TYPE_WHEEL; |
|
|
case 0x03: /* XINPUT_DEVSUBTYPE_ARCADE_STICK */ |
|
|
return SDL_JOYSTICK_TYPE_ARCADE_STICK; |
|
|
case 0x04: /* XINPUT_DEVSUBTYPE_FLIGHT_STICK */ |
|
|
return SDL_JOYSTICK_TYPE_FLIGHT_STICK; |
|
|
case 0x05: /* XINPUT_DEVSUBTYPE_DANCE_PAD */ |
|
|
return SDL_JOYSTICK_TYPE_DANCE_PAD; |
|
|
case 0x06: /* XINPUT_DEVSUBTYPE_GUITAR */ |
|
|
case 0x07: /* XINPUT_DEVSUBTYPE_GUITAR_ALTERNATE */ |
|
|
case 0x0B: /* XINPUT_DEVSUBTYPE_GUITAR_BASS */ |
|
|
return SDL_JOYSTICK_TYPE_GUITAR; |
|
|
case 0x08: /* XINPUT_DEVSUBTYPE_DRUM_KIT */ |
|
|
return SDL_JOYSTICK_TYPE_DRUM_KIT; |
|
|
case 0x13: /* XINPUT_DEVSUBTYPE_ARCADE_PAD */ |
|
|
return SDL_JOYSTICK_TYPE_ARCADE_PAD; |
|
|
default: |
|
|
return SDL_JOYSTICK_TYPE_UNKNOWN; |
|
|
} |
|
|
} |
|
|
|
|
|
if (SDL_IsJoystickGUIDWheel(guid)) { |
|
|
return SDL_JOYSTICK_TYPE_WHEEL; |
|
|
} |
|
|
|
|
|
return SDL_JOYSTICK_TYPE_UNKNOWN; |
|
|
} |
|
|
|
|
|
/* return the guid for this index */ |
|
|
SDL_JoystickGUID SDL_JoystickGetDeviceGUID(int device_index) |
|
|
{ |
|
@@ -984,7 +1050,7 @@ Uint16 SDL_JoystickGetDeviceVendor(int device_index) |
|
|
Uint16 vendor; |
|
|
SDL_JoystickGUID guid = SDL_JoystickGetDeviceGUID(device_index); |
|
|
|
|
|
GetJoystickGUIDInfo(guid, &vendor, NULL, NULL); |
|
|
SDL_GetJoystickGUIDInfo(guid, &vendor, NULL, NULL); |
|
|
return vendor; |
|
|
} |
|
|
|
|
@@ -993,7 +1059,7 @@ Uint16 SDL_JoystickGetDeviceProduct(int device_index) |
|
|
Uint16 product; |
|
|
SDL_JoystickGUID guid = SDL_JoystickGetDeviceGUID(device_index); |
|
|
|
|
|
GetJoystickGUIDInfo(guid, NULL, &product, NULL); |
|
|
SDL_GetJoystickGUIDInfo(guid, NULL, &product, NULL); |
|
|
return product; |
|
|
} |
|
|
|
|
@@ -1002,10 +1068,24 @@ Uint16 SDL_JoystickGetDeviceProductVersion(int device_index) |
|
|
Uint16 version; |
|
|
SDL_JoystickGUID guid = SDL_JoystickGetDeviceGUID(device_index); |
|
|
|
|
|
GetJoystickGUIDInfo(guid, NULL, NULL, &version); |
|
|
SDL_GetJoystickGUIDInfo(guid, NULL, NULL, &version); |
|
|
return version; |
|
|
} |
|
|
|
|
|
SDL_JoystickType SDL_JoystickGetDeviceType(int device_index) |
|
|
{ |
|
|
SDL_JoystickType type; |
|
|
SDL_JoystickGUID guid = SDL_JoystickGetDeviceGUID(device_index); |
|
|
|
|
|
type = SDL_GetJoystickGUIDType(guid); |
|
|
if (type == SDL_JOYSTICK_TYPE_UNKNOWN) { |
|
|
if (SDL_IsGameController(device_index)) { |
|
|
type = SDL_JOYSTICK_TYPE_GAMECONTROLLER; |
|
|
} |
|
|
} |
|
|
return type; |
|
|
} |
|
|
|
|
|
/* return the guid for this opened device */ |
|
|
SDL_JoystickGUID SDL_JoystickGetGUID(SDL_Joystick * joystick) |
|
|
{ |
|
@@ -1022,7 +1102,7 @@ Uint16 SDL_JoystickGetVendor(SDL_Joystick * joystick) |
|
|
Uint16 vendor; |
|
|
SDL_JoystickGUID guid = SDL_JoystickGetGUID(joystick); |
|
|
|
|
|
GetJoystickGUIDInfo(guid, &vendor, NULL, NULL); |
|
|
SDL_GetJoystickGUIDInfo(guid, &vendor, NULL, NULL); |
|
|
return vendor; |
|
|
} |
|
|
|
|
@@ -1031,7 +1111,7 @@ Uint16 SDL_JoystickGetProduct(SDL_Joystick * joystick) |
|
|
Uint16 product; |
|
|
SDL_JoystickGUID guid = SDL_JoystickGetGUID(joystick); |
|
|
|
|
|
GetJoystickGUIDInfo(guid, NULL, &product, NULL); |
|
|
SDL_GetJoystickGUIDInfo(guid, NULL, &product, NULL); |
|
|
return product; |
|
|
} |
|
|
|
|
@@ -1040,10 +1120,24 @@ Uint16 SDL_JoystickGetProductVersion(SDL_Joystick * joystick) |
|
|
Uint16 version; |
|
|
SDL_JoystickGUID guid = SDL_JoystickGetGUID(joystick); |
|
|
|
|
|
GetJoystickGUIDInfo(guid, NULL, NULL, &version); |
|
|
SDL_GetJoystickGUIDInfo(guid, NULL, NULL, &version); |
|
|
return version; |
|
|
} |
|
|
|
|
|
SDL_JoystickType SDL_JoystickGetType(SDL_Joystick * joystick) |
|
|
{ |
|
|
SDL_JoystickType type; |
|
|
SDL_JoystickGUID guid = SDL_JoystickGetGUID(joystick); |
|
|
|
|
|
type = SDL_GetJoystickGUIDType(guid); |
|
|
if (type == SDL_JOYSTICK_TYPE_UNKNOWN) { |
|
|
if (joystick && joystick->is_game_controller) { |
|
|
type = SDL_JOYSTICK_TYPE_GAMECONTROLLER; |
|
|
} |
|
|
} |
|
|
return type; |
|
|
} |
|
|
|
|
|
/* convert the guid to a printable string */ |
|
|
void SDL_JoystickGetGUIDString(SDL_JoystickGUID guid, char *pszGUID, int cbGUID) |
|
|
{ |
|
|