From 82af42761e131341503789cfceaa1612e5a81b79 Mon Sep 17 00:00:00 2001 From: Zack Middleton Date: Sat, 8 Jun 2019 13:36:59 -0700 Subject: [PATCH] hidapi: Use GameCube adapter controller port for player index The Nintendo USB GameCube adapter has four controller ports. Return the port number as 0 to 3 from SDL_JoystickGetPlayerIndex() and SDL_JoystickGetDevicePlayerIndex(). --- src/joystick/hidapi/SDL_hidapi_gamecube.c | 18 ++++++++++++++++++ src/joystick/hidapi/SDL_hidapi_ps4.c | 7 +++++++ src/joystick/hidapi/SDL_hidapi_switch.c | 7 +++++++ src/joystick/hidapi/SDL_hidapi_xbox360.c | 7 +++++++ src/joystick/hidapi/SDL_hidapi_xboxone.c | 7 +++++++ src/joystick/hidapi/SDL_hidapijoystick.c | 14 +++++++++++++- src/joystick/hidapi/SDL_hidapijoystick_c.h | 2 ++ 7 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/joystick/hidapi/SDL_hidapi_gamecube.c b/src/joystick/hidapi/SDL_hidapi_gamecube.c index d1abfff5fb2d5..40314f2e2aeaf 100644 --- a/src/joystick/hidapi/SDL_hidapi_gamecube.c +++ b/src/joystick/hidapi/SDL_hidapi_gamecube.c @@ -267,6 +267,22 @@ HIDAPI_DriverGameCube_NumJoysticks(SDL_HIDAPI_DriverData *context) return joysticks; } +static int +HIDAPI_DriverGameCube_PlayerIndexForIndex(SDL_HIDAPI_DriverData *context, int index) +{ + SDL_DriverGameCube_Context *ctx = (SDL_DriverGameCube_Context *)context->context; + Uint8 i; + for (i = 0; i < 4; i += 1) { + if (ctx->joysticks[i] != -1) { + if (index == 0) { + return i; + } + index -= 1; + } + } + return -1; /* Should never get here! */ +} + static SDL_JoystickID HIDAPI_DriverGameCube_InstanceIDForIndex(SDL_HIDAPI_DriverData *context, int index) { @@ -294,6 +310,7 @@ HIDAPI_DriverGameCube_OpenJoystick(SDL_HIDAPI_DriverData *context, SDL_Joystick joystick->nbuttons = 12; joystick->naxes = 6; joystick->epowerlevel = SDL_JOYSTICK_POWER_WIRED; + joystick->player_index = i; return SDL_TRUE; } } @@ -334,6 +351,7 @@ SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverGameCube = HIDAPI_DriverGameCube_QuitDriver, HIDAPI_DriverGameCube_UpdateDriver, HIDAPI_DriverGameCube_NumJoysticks, + HIDAPI_DriverGameCube_PlayerIndexForIndex, HIDAPI_DriverGameCube_InstanceIDForIndex, HIDAPI_DriverGameCube_OpenJoystick, HIDAPI_DriverGameCube_Rumble diff --git a/src/joystick/hidapi/SDL_hidapi_ps4.c b/src/joystick/hidapi/SDL_hidapi_ps4.c index e6732004e5d0a..282f94efb1c96 100644 --- a/src/joystick/hidapi/SDL_hidapi_ps4.c +++ b/src/joystick/hidapi/SDL_hidapi_ps4.c @@ -338,6 +338,12 @@ HIDAPI_DriverPS4_NumJoysticks(SDL_HIDAPI_DriverData *context) return 1; } +static int +HIDAPI_DriverPS4_PlayerIndexForIndex(SDL_HIDAPI_DriverData *context, int index) +{ + return -1; +} + static SDL_JoystickID HIDAPI_DriverPS4_InstanceIDForIndex(SDL_HIDAPI_DriverData *context, int index) { @@ -592,6 +598,7 @@ SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverPS4 = HIDAPI_DriverPS4_QuitDriver, HIDAPI_DriverPS4_UpdateDriver, HIDAPI_DriverPS4_NumJoysticks, + HIDAPI_DriverPS4_PlayerIndexForIndex, HIDAPI_DriverPS4_InstanceIDForIndex, HIDAPI_DriverPS4_OpenJoystick, HIDAPI_DriverPS4_Rumble diff --git a/src/joystick/hidapi/SDL_hidapi_switch.c b/src/joystick/hidapi/SDL_hidapi_switch.c index b81112ba7eead..d2f246b017ccc 100644 --- a/src/joystick/hidapi/SDL_hidapi_switch.c +++ b/src/joystick/hidapi/SDL_hidapi_switch.c @@ -914,6 +914,12 @@ HIDAPI_DriverSwitch_NumJoysticks(SDL_HIDAPI_DriverData *context) return 1; } +static int +HIDAPI_DriverSwitch_PlayerIndexForIndex(SDL_HIDAPI_DriverData *context, int index) +{ + return -1; +} + static SDL_JoystickID HIDAPI_DriverSwitch_InstanceIDForIndex(SDL_HIDAPI_DriverData *context, int index) { @@ -931,6 +937,7 @@ SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverSwitch = HIDAPI_DriverSwitch_QuitDriver, HIDAPI_DriverSwitch_UpdateDriver, HIDAPI_DriverSwitch_NumJoysticks, + HIDAPI_DriverSwitch_PlayerIndexForIndex, HIDAPI_DriverSwitch_InstanceIDForIndex, HIDAPI_DriverSwitch_OpenJoystick, HIDAPI_DriverSwitch_Rumble diff --git a/src/joystick/hidapi/SDL_hidapi_xbox360.c b/src/joystick/hidapi/SDL_hidapi_xbox360.c index 346b12d506a2f..eb67089c084c6 100644 --- a/src/joystick/hidapi/SDL_hidapi_xbox360.c +++ b/src/joystick/hidapi/SDL_hidapi_xbox360.c @@ -330,6 +330,12 @@ HIDAPI_DriverXbox360_NumJoysticks(SDL_HIDAPI_DriverData *context) return 1; } +static int +HIDAPI_DriverXbox360_PlayerIndexForIndex(SDL_HIDAPI_DriverData *context, int index) +{ + return -1; +} + static SDL_JoystickID HIDAPI_DriverXbox360_InstanceIDForIndex(SDL_HIDAPI_DriverData *context, int index) { @@ -813,6 +819,7 @@ SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXbox360 = HIDAPI_DriverXbox360_QuitDriver, HIDAPI_DriverXbox360_UpdateDriver, HIDAPI_DriverXbox360_NumJoysticks, + HIDAPI_DriverXbox360_PlayerIndexForIndex, HIDAPI_DriverXbox360_InstanceIDForIndex, HIDAPI_DriverXbox360_OpenJoystick, HIDAPI_DriverXbox360_Rumble diff --git a/src/joystick/hidapi/SDL_hidapi_xboxone.c b/src/joystick/hidapi/SDL_hidapi_xboxone.c index 90c2aa3bf13f5..734c76ed72539 100644 --- a/src/joystick/hidapi/SDL_hidapi_xboxone.c +++ b/src/joystick/hidapi/SDL_hidapi_xboxone.c @@ -207,6 +207,12 @@ HIDAPI_DriverXboxOne_NumJoysticks(SDL_HIDAPI_DriverData *context) return 1; } +static int +HIDAPI_DriverXboxOne_PlayerIndexForIndex(SDL_HIDAPI_DriverData *context, int index) +{ + return -1; +} + static SDL_JoystickID HIDAPI_DriverXboxOne_InstanceIDForIndex(SDL_HIDAPI_DriverData *context, int index) { @@ -350,6 +356,7 @@ SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXboxOne = HIDAPI_DriverXboxOne_QuitDriver, HIDAPI_DriverXboxOne_UpdateDriver, HIDAPI_DriverXboxOne_NumJoysticks, + HIDAPI_DriverXboxOne_PlayerIndexForIndex, HIDAPI_DriverXboxOne_InstanceIDForIndex, HIDAPI_DriverXboxOne_OpenJoystick, HIDAPI_DriverXboxOne_Rumble diff --git a/src/joystick/hidapi/SDL_hidapijoystick.c b/src/joystick/hidapi/SDL_hidapijoystick.c index 7cbd9f44e2948..319cf3ac02ef1 100644 --- a/src/joystick/hidapi/SDL_hidapijoystick.c +++ b/src/joystick/hidapi/SDL_hidapijoystick.c @@ -948,7 +948,19 @@ HIDAPI_JoystickGetDeviceName(int device_index) static int HIDAPI_JoystickGetDevicePlayerIndex(int device_index) { - return -1; + SDL_HIDAPI_Device *device = SDL_HIDAPI_devices; + int joysticks; + while (device) { + if (device->driver) { + joysticks = device->driver->NumJoysticks(&device->devdata); + if (device_index < joysticks) { + break; + } + device_index -= joysticks; + } + device = device->next; + } + return device->driver->PlayerIndexForIndex(&device->devdata, device_index); } static SDL_JoystickGUID diff --git a/src/joystick/hidapi/SDL_hidapijoystick_c.h b/src/joystick/hidapi/SDL_hidapijoystick_c.h index 807a301cd9b72..5b2f73619fa67 100644 --- a/src/joystick/hidapi/SDL_hidapijoystick_c.h +++ b/src/joystick/hidapi/SDL_hidapijoystick_c.h @@ -65,6 +65,8 @@ typedef struct _SDL_HIDAPI_DeviceDriver SDL_bool (*UpdateDriver)(SDL_HIDAPI_DriverData *context, int *num_joysticks); int (*NumJoysticks)(SDL_HIDAPI_DriverData *context); + int (*PlayerIndexForIndex)(SDL_HIDAPI_DriverData *context, + int index); SDL_JoystickID (*InstanceIDForIndex)(SDL_HIDAPI_DriverData *context, int index); SDL_bool (*OpenJoystick)(SDL_HIDAPI_DriverData *context,