From dec7875a6e23212021e4d9080330a42832dfe02a Mon Sep 17 00:00:00 2001
From: Edward Rudd <urkle@outoforder.cc>
Date: Tue, 15 Jun 2021 01:40:19 +0000
Subject: [PATCH] update SDL soruce to 2.0.14
---
source/src/joystick/hidapi/SDL_hidapi_xbox360.c | 501 +++++--------------------------------------------------
1 files changed, 48 insertions(+), 453 deletions(-)
diff --git a/source/src/joystick/hidapi/SDL_hidapi_xbox360.c b/source/src/joystick/hidapi/SDL_hidapi_xbox360.c
index 1be44a0..e3b3919 100644
--- a/source/src/joystick/hidapi/SDL_hidapi_xbox360.c
+++ b/source/src/joystick/hidapi/SDL_hidapi_xbox360.c
@@ -23,7 +23,6 @@
#ifdef SDL_JOYSTICK_HIDAPI
#include "SDL_hints.h"
-#include "SDL_log.h"
#include "SDL_events.h"
#include "SDL_timer.h"
#include "SDL_joystick.h"
@@ -35,214 +34,13 @@
#ifdef SDL_JOYSTICK_HIDAPI_XBOX360
-#ifdef __WIN32__
-#define SDL_JOYSTICK_HIDAPI_WINDOWS_XINPUT
-/* This requires the Windows 10 SDK to build */
-/*#define SDL_JOYSTICK_HIDAPI_WINDOWS_GAMING_INPUT*/
-#endif
-
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_XINPUT
-#include "../../core/windows/SDL_xinput.h"
-#endif
-
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_GAMING_INPUT
-#include "../../core/windows/SDL_windows.h"
-#define COBJMACROS
-#include "windows.gaming.input.h"
-#endif
+/* Define this if you want to log all packets from the controller */
+/*#define DEBUG_XBOX_PROTOCOL*/
typedef struct {
Uint8 last_state[USB_PACKET_LENGTH];
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_XINPUT
- SDL_bool xinput_enabled;
- Uint8 xinput_slot;
-#endif
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_GAMING_INPUT
- SDL_bool coinitialized;
- __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics *gamepad_statics;
- __x_ABI_CWindows_CGaming_CInput_CIGamepad *gamepad;
- struct __x_ABI_CWindows_CGaming_CInput_CGamepadVibration vibration;
-#endif
} SDL_DriverXbox360_Context;
-
-
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_XINPUT
-static Uint8 xinput_slots;
-
-static void
-HIDAPI_DriverXbox360_MarkXInputSlotUsed(Uint8 xinput_slot)
-{
- if (xinput_slot != XUSER_INDEX_ANY) {
- xinput_slots |= (0x01 << xinput_slot);
- }
-}
-
-static void
-HIDAPI_DriverXbox360_MarkXInputSlotFree(Uint8 xinput_slot)
-{
- if (xinput_slot != XUSER_INDEX_ANY) {
- xinput_slots &= ~(0x01 << xinput_slot);
- }
-}
-
-static SDL_bool
-HIDAPI_DriverXbox360_MissingXInputSlot()
-{
- return xinput_slots != 0x0F;
-}
-
-static Uint8
-HIDAPI_DriverXbox360_GuessXInputSlot(WORD wButtons)
-{
- DWORD user_index;
- int match_count;
- Uint8 match_slot;
-
- if (!XINPUTGETSTATE) {
- return XUSER_INDEX_ANY;
- }
-
- match_count = 0;
- for (user_index = 0; user_index < XUSER_MAX_COUNT; ++user_index) {
- XINPUT_STATE_EX xinput_state;
-
- if (XINPUTGETSTATE(user_index, &xinput_state) == ERROR_SUCCESS) {
- if (xinput_state.Gamepad.wButtons == wButtons) {
- ++match_count;
- match_slot = (Uint8)user_index;
- }
- }
- }
- if (match_count == 1) {
- return match_slot;
- }
- return XUSER_INDEX_ANY;
-}
-
-#endif /* SDL_JOYSTICK_HIDAPI_WINDOWS_XINPUT */
-
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_GAMING_INPUT
-
-static void
-HIDAPI_DriverXbox360_InitWindowsGamingInput(SDL_DriverXbox360_Context *ctx)
-{
- /* I think this takes care of RoInitialize() in a way that is compatible with the rest of SDL */
- if (FAILED(WIN_CoInitialize())) {
- return;
- }
- ctx->coinitialized = SDL_TRUE;
-
- {
- static const IID SDL_IID_IGamepadStatics = { 0x8BBCE529, 0xD49C, 0x39E9, { 0x95, 0x60, 0xE4, 0x7D, 0xDE, 0x96, 0xB7, 0xC8 } };
- HRESULT hr;
- HMODULE hModule = LoadLibraryA("combase.dll");
- if (hModule != NULL) {
- typedef HRESULT (WINAPI *WindowsCreateString_t)(PCNZWCH sourceString, UINT32 length, HSTRING* string);
- typedef HRESULT (WINAPI *WindowsDeleteString_t)(HSTRING string);
- typedef HRESULT (WINAPI *RoGetActivationFactory_t)(HSTRING activatableClassId, REFIID iid, void** factory);
-
- WindowsCreateString_t WindowsCreateStringFunc = (WindowsCreateString_t)GetProcAddress(hModule, "WindowsCreateString");
- WindowsDeleteString_t WindowsDeleteStringFunc = (WindowsDeleteString_t)GetProcAddress(hModule, "WindowsDeleteString");
- RoGetActivationFactory_t RoGetActivationFactoryFunc = (RoGetActivationFactory_t)GetProcAddress(hModule, "RoGetActivationFactory");
- if (WindowsCreateStringFunc && WindowsDeleteStringFunc && RoGetActivationFactoryFunc) {
- LPTSTR pNamespace = L"Windows.Gaming.Input.Gamepad";
- HSTRING hNamespaceString;
-
- hr = WindowsCreateStringFunc(pNamespace, SDL_wcslen(pNamespace), &hNamespaceString);
- if (SUCCEEDED(hr)) {
- RoGetActivationFactoryFunc(hNamespaceString, &SDL_IID_IGamepadStatics, &ctx->gamepad_statics);
- WindowsDeleteStringFunc(hNamespaceString);
- }
- }
- FreeLibrary(hModule);
- }
- }
-}
-
-static Uint8
-HIDAPI_DriverXbox360_GetGamepadButtonsForMatch(__x_ABI_CWindows_CGaming_CInput_CIGamepad *gamepad)
-{
- HRESULT hr;
- struct __x_ABI_CWindows_CGaming_CInput_CGamepadReading state;
- Uint8 buttons = 0;
-
- hr = __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetCurrentReading(gamepad, &state);
- if (SUCCEEDED(hr)) {
- if (state.Buttons & GamepadButtons_A) {
- buttons |= (1 << SDL_CONTROLLER_BUTTON_A);
- }
- if (state.Buttons & GamepadButtons_B) {
- buttons |= (1 << SDL_CONTROLLER_BUTTON_B);
- }
- if (state.Buttons & GamepadButtons_X) {
- buttons |= (1 << SDL_CONTROLLER_BUTTON_X);
- }
- if (state.Buttons & GamepadButtons_Y) {
- buttons |= (1 << SDL_CONTROLLER_BUTTON_Y);
- }
- }
- return buttons;
-}
-
-static void
-HIDAPI_DriverXbox360_GuessGamepad(SDL_DriverXbox360_Context *ctx, Uint8 buttons)
-{
- HRESULT hr;
- __FIVectorView_1_Windows__CGaming__CInput__CGamepad *gamepads;
-
- hr = __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_get_Gamepads(ctx->gamepad_statics, &gamepads);
- if (SUCCEEDED(hr)) {
- unsigned int i, num_gamepads;
-
- hr = __FIVectorView_1_Windows__CGaming__CInput__CGamepad_get_Size(gamepads, &num_gamepads);
- if (SUCCEEDED(hr)) {
- int match_count;
- unsigned int match_slot;
-
- match_count = 0;
- for (i = 0; i < num_gamepads; ++i) {
- __x_ABI_CWindows_CGaming_CInput_CIGamepad *gamepad;
-
- hr = __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetAt(gamepads, i, &gamepad);
- if (SUCCEEDED(hr)) {
- Uint8 gamepad_buttons = HIDAPI_DriverXbox360_GetGamepadButtonsForMatch(gamepad);
- if (buttons == gamepad_buttons) {
- ++match_count;
- match_slot = i;
- }
- __x_ABI_CWindows_CGaming_CInput_CIGamepad_Release(gamepad);
- }
- }
- if (match_count == 1) {
- hr = __FIVectorView_1_Windows__CGaming__CInput__CGamepad_GetAt(gamepads, match_slot, &ctx->gamepad);
- if (SUCCEEDED(hr)) {
- }
- }
- }
- __FIVectorView_1_Windows__CGaming__CInput__CGamepad_Release(gamepads);
- }
-}
-
-static void
-HIDAPI_DriverXbox360_QuitWindowsGamingInput(SDL_DriverXbox360_Context *ctx)
-{
- if (ctx->gamepad_statics) {
- __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics_Release(ctx->gamepad_statics);
- ctx->gamepad_statics = NULL;
- }
- if (ctx->gamepad) {
- __x_ABI_CWindows_CGaming_CInput_CIGamepad_Release(ctx->gamepad);
- ctx->gamepad = NULL;
- }
-
- if (ctx->coinitialized) {
- WIN_CoUninitialize();
- ctx->coinitialized = SDL_FALSE;
- }
-}
-
-#endif /* SDL_JOYSTICK_HIDAPI_WINDOWS_GAMING_INPUT */
#if defined(__MACOSX__)
static SDL_bool
@@ -283,6 +81,7 @@
/* This is the Steam Virtual Gamepad, which isn't supported by this driver */
return SDL_FALSE;
}
+#endif
#if defined(__MACOSX__)
/* Wired Xbox One controllers are handled by this driver, interfacing with
the 360Controller driver available from:
@@ -293,10 +92,9 @@
if (IsBluetoothXboxOneController(vendor_id, product_id)) {
return SDL_FALSE;
}
-#endif
- return (type == SDL_CONTROLLER_TYPE_XBOX360 || type == SDL_CONTROLLER_TYPE_XBOXONE);
+ return (type == SDL_CONTROLLER_TYPE_XBOX360 || type == SDL_CONTROLLER_TYPE_XBOXONE) ? SDL_TRUE : SDL_FALSE;
#else
- return (type == SDL_CONTROLLER_TYPE_XBOX360);
+ return (type == SDL_CONTROLLER_TYPE_XBOX360) ? SDL_TRUE : SDL_FALSE;
#endif
}
@@ -332,9 +130,10 @@
static void
HIDAPI_DriverXbox360_SetDevicePlayerIndex(SDL_HIDAPI_Device *device, SDL_JoystickID instance_id, int player_index)
{
- if (device->dev) {
- SetSlotLED(device->dev, (player_index % 4));
+ if (!device->dev) {
+ return;
}
+ SetSlotLED(device->dev, (player_index % 4));
}
static SDL_bool
@@ -351,22 +150,11 @@
device->dev = hid_open_path(device->path, 0);
if (!device->dev) {
- SDL_free(ctx);
SDL_SetError("Couldn't open %s", device->path);
+ SDL_free(ctx);
return SDL_FALSE;
}
device->context = ctx;
-
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_XINPUT
- ctx->xinput_enabled = SDL_GetHintBoolean(SDL_HINT_XINPUT_ENABLED, SDL_TRUE);
- if (ctx->xinput_enabled && WIN_LoadXInputDLL() < 0) {
- ctx->xinput_enabled = SDL_FALSE;
- }
- ctx->xinput_slot = XUSER_INDEX_ANY;
-#endif
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_GAMING_INPUT
- HIDAPI_DriverXbox360_InitWindowsGamingInput(ctx);
-#endif
/* Set the controller LED */
player_index = SDL_JoystickGetPlayerIndex(joystick);
@@ -375,7 +163,7 @@
}
/* Initialize the joystick capabilities */
- joystick->nbuttons = SDL_CONTROLLER_BUTTON_MAX;
+ joystick->nbuttons = 15;
joystick->naxes = SDL_CONTROLLER_AXIS_MAX;
joystick->epowerlevel = SDL_JOYSTICK_POWER_WIRED;
@@ -385,46 +173,6 @@
static int
HIDAPI_DriverXbox360_RumbleJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble)
{
-#if defined(SDL_JOYSTICK_HIDAPI_WINDOWS_GAMING_INPUT) || defined(SDL_JOYSTICK_HIDAPI_WINDOWS_XINPUT)
- SDL_DriverXbox360_Context *ctx = (SDL_DriverXbox360_Context *)device->context;
-#endif
-
-#ifdef __WIN32__
- SDL_bool rumbled = SDL_FALSE;
-
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_GAMING_INPUT
- if (!rumbled && ctx->gamepad) {
- HRESULT hr;
-
- ctx->vibration.LeftMotor = (DOUBLE)low_frequency_rumble / SDL_MAX_UINT16;
- ctx->vibration.RightMotor = (DOUBLE)high_frequency_rumble / SDL_MAX_UINT16;
- hr = __x_ABI_CWindows_CGaming_CInput_CIGamepad_put_Vibration(ctx->gamepad, ctx->vibration);
- if (SUCCEEDED(hr)) {
- rumbled = SDL_TRUE;
- }
- }
-#endif
-
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_XINPUT
- if (!rumbled && ctx->xinput_slot != XUSER_INDEX_ANY) {
- XINPUT_VIBRATION XVibration;
-
- if (!XINPUTSETSTATE) {
- return SDL_Unsupported();
- }
-
- XVibration.wLeftMotorSpeed = low_frequency_rumble;
- XVibration.wRightMotorSpeed = high_frequency_rumble;
- if (XINPUTSETSTATE(ctx->xinput_slot, &XVibration) == ERROR_SUCCESS) {
- rumbled = SDL_TRUE;
- } else {
- return SDL_SetError("XInputSetState() failed");
- }
- }
-#endif /* SDL_JOYSTICK_HIDAPI_WINDOWS_XINPUT */
-
-#else /* !__WIN32__ */
-
#ifdef __MACOSX__
if (IsBluetoothXboxOneController(device->vendor_id, device->product_id)) {
Uint8 rumble_packet[] = { 0x03, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00 };
@@ -458,185 +206,36 @@
return SDL_SetError("Couldn't send rumble packet");
}
#endif
-#endif /* __WIN32__ */
-
return 0;
}
-#ifdef __WIN32__
- /* This is the packet format for Xbox 360 and Xbox One controllers on Windows,
- however with this interface there is no rumble support, no guide button,
- and the left and right triggers are tied together as a single axis.
-
- We use XInput and Windows.Gaming.Input to make up for these shortcomings.
- */
-static void
-HIDAPI_DriverXbox360_HandleStatePacket(SDL_Joystick *joystick, hid_device *dev, SDL_DriverXbox360_Context *ctx, Uint8 *data, int size)
+static int
+HIDAPI_DriverXbox360_RumbleJoystickTriggers(SDL_HIDAPI_Device *device, SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble)
{
- Sint16 axis;
- SDL_bool has_trigger_data = SDL_FALSE;
-
- if (ctx->last_state[10] != data[10]) {
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_A, (data[10] & 0x01) ? SDL_PRESSED : SDL_RELEASED);
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_B, (data[10] & 0x02) ? SDL_PRESSED : SDL_RELEASED);
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_X, (data[10] & 0x04) ? SDL_PRESSED : SDL_RELEASED);
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_Y, (data[10] & 0x08) ? SDL_PRESSED : SDL_RELEASED);
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_LEFTSHOULDER, (data[10] & 0x10) ? SDL_PRESSED : SDL_RELEASED);
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER, (data[10] & 0x20) ? SDL_PRESSED : SDL_RELEASED);
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_BACK, (data[10] & 0x40) ? SDL_PRESSED : SDL_RELEASED);
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_START, (data[10] & 0x80) ? SDL_PRESSED : SDL_RELEASED);
- }
-
- if (ctx->last_state[11] != data[11]) {
- SDL_bool dpad_up = SDL_FALSE;
- SDL_bool dpad_down = SDL_FALSE;
- SDL_bool dpad_left = SDL_FALSE;
- SDL_bool dpad_right = SDL_FALSE;
-
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_LEFTSTICK, (data[11] & 0x01) ? SDL_PRESSED : SDL_RELEASED);
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_RIGHTSTICK, (data[11] & 0x02) ? SDL_PRESSED : SDL_RELEASED);
-
- switch (data[11] & 0x3C) {
- case 4:
- dpad_up = SDL_TRUE;
- break;
- case 8:
- dpad_up = SDL_TRUE;
- dpad_right = SDL_TRUE;
- break;
- case 12:
- dpad_right = SDL_TRUE;
- break;
- case 16:
- dpad_right = SDL_TRUE;
- dpad_down = SDL_TRUE;
- break;
- case 20:
- dpad_down = SDL_TRUE;
- break;
- case 24:
- dpad_left = SDL_TRUE;
- dpad_down = SDL_TRUE;
- break;
- case 28:
- dpad_left = SDL_TRUE;
- break;
- case 32:
- dpad_up = SDL_TRUE;
- dpad_left = SDL_TRUE;
- break;
- default:
- break;
- }
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_DOWN, dpad_down);
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_UP, dpad_up);
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_RIGHT, dpad_right);
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_DPAD_LEFT, dpad_left);
- }
-
- axis = (int)*(Uint16*)(&data[0]) - 0x8000;
- SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_LEFTX, axis);
- axis = (int)*(Uint16*)(&data[2]) - 0x8000;
- SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_LEFTY, axis);
- axis = (int)*(Uint16*)(&data[4]) - 0x8000;
- SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_RIGHTX, axis);
- axis = (int)*(Uint16*)(&data[6]) - 0x8000;
- SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_RIGHTY, axis);
-
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_GAMING_INPUT
- if (ctx->gamepad_statics && !ctx->gamepad) {
- Uint8 buttons = 0;
-
- if (data[10] & 0x01) {
- buttons |= (1 << SDL_CONTROLLER_BUTTON_A);
- }
- if (data[10] & 0x02) {
- buttons |= (1 << SDL_CONTROLLER_BUTTON_B);
- }
- if (data[10] & 0x04) {
- buttons |= (1 << SDL_CONTROLLER_BUTTON_X);
- }
- if (data[10] & 0x08) {
- buttons |= (1 << SDL_CONTROLLER_BUTTON_Y);
- }
- if (buttons != 0) {
- HIDAPI_DriverXbox360_GuessGamepad(ctx, buttons);
- }
- }
-
- if (ctx->gamepad) {
- HRESULT hr;
- struct __x_ABI_CWindows_CGaming_CInput_CGamepadReading state;
-
- hr = __x_ABI_CWindows_CGaming_CInput_CIGamepad_GetCurrentReading(ctx->gamepad, &state);
- if (SUCCEEDED(hr)) {
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_GUIDE, (state.Buttons & 0x40000000) ? SDL_PRESSED : SDL_RELEASED);
- SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_TRIGGERLEFT, ((int)(state.LeftTrigger * SDL_MAX_UINT16)) - 32768);
- SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, ((int)(state.RightTrigger * SDL_MAX_UINT16)) - 32768);
- has_trigger_data = SDL_TRUE;
- }
- }
-#endif /* SDL_JOYSTICK_HIDAPI_WINDOWS_GAMING_INPUT */
-
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_XINPUT
- if (ctx->xinput_enabled) {
- if (ctx->xinput_slot == XUSER_INDEX_ANY && HIDAPI_DriverXbox360_MissingXInputSlot()) {
- WORD wButtons = 0;
-
- if (data[10] & 0x01) {
- wButtons |= XINPUT_GAMEPAD_A;
- }
- if (data[10] & 0x02) {
- wButtons |= XINPUT_GAMEPAD_B;
- }
- if (data[10] & 0x04) {
- wButtons |= XINPUT_GAMEPAD_X;
- }
- if (data[10] & 0x08) {
- wButtons |= XINPUT_GAMEPAD_Y;
- }
- if (wButtons != 0) {
- Uint8 xinput_slot = HIDAPI_DriverXbox360_GuessXInputSlot(wButtons);
- if (xinput_slot != XUSER_INDEX_ANY) {
- HIDAPI_DriverXbox360_MarkXInputSlotUsed(xinput_slot);
- ctx->xinput_slot = xinput_slot;
- }
- }
- }
-
- if (!has_trigger_data && ctx->xinput_slot != XUSER_INDEX_ANY) {
- XINPUT_STATE_EX xinput_state;
-
- if (XINPUTGETSTATE(ctx->xinput_slot, &xinput_state) == ERROR_SUCCESS) {
- SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_GUIDE, (xinput_state.Gamepad.wButtons & XINPUT_GAMEPAD_GUIDE) ? SDL_PRESSED : SDL_RELEASED);
- SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_TRIGGERLEFT, ((int)xinput_state.Gamepad.bLeftTrigger * 257) - 32768);
- SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, ((int)xinput_state.Gamepad.bRightTrigger * 257) - 32768);
- has_trigger_data = SDL_TRUE;
- }
- }
- }
-#endif /* SDL_JOYSTICK_HIDAPI_WINDOWS_XINPUT */
-
- if (!has_trigger_data) {
- axis = (data[9] * 257) - 32768;
- if (data[9] < 0x80) {
- axis = -axis * 2 - 32769;
- SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, axis);
- } else if (data[9] > 0x80) {
- axis = axis * 2 - 32767;
- SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_TRIGGERLEFT, axis);
- } else {
- SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_TRIGGERLEFT, SDL_MIN_SINT16);
- SDL_PrivateJoystickAxis(joystick, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, SDL_MIN_SINT16);
- }
- }
-
- SDL_memcpy(ctx->last_state, data, SDL_min(size, sizeof(ctx->last_state)));
+ return SDL_Unsupported();
}
-#else
+
+static SDL_bool
+HIDAPI_DriverXbox360_HasJoystickLED(SDL_HIDAPI_Device *device, SDL_Joystick *joystick)
+{
+ /* Doesn't have an RGB LED, so don't return true here */
+ return SDL_FALSE;
+}
+
+static int
+HIDAPI_DriverXbox360_SetJoystickLED(SDL_HIDAPI_Device *device, SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue)
+{
+ return SDL_Unsupported();
+}
+
+static int
+HIDAPI_DriverXbox360_SetJoystickSensorsEnabled(SDL_HIDAPI_Device *device, SDL_Joystick *joystick, SDL_bool enabled)
+{
+ return SDL_Unsupported();
+}
static void
-HIDAPI_DriverXbox360_HandleStatePacket(SDL_Joystick *joystick, hid_device *dev, SDL_DriverXbox360_Context *ctx, Uint8 *data, int size)
+HIDAPI_DriverXbox360_HandleStatePacket(SDL_Joystick *joystick, SDL_DriverXbox360_Context *ctx, Uint8 *data, int size)
{
Sint16 axis;
#ifdef __MACOSX__
@@ -687,7 +286,6 @@
SDL_memcpy(ctx->last_state, data, SDL_min(size, sizeof(ctx->last_state)));
}
-#endif /* __WIN32__ */
static SDL_bool
HIDAPI_DriverXbox360_UpdateDevice(SDL_HIDAPI_Device *device)
@@ -695,7 +293,7 @@
SDL_DriverXbox360_Context *ctx = (SDL_DriverXbox360_Context *)device->context;
SDL_Joystick *joystick = NULL;
Uint8 data[USB_PACKET_LENGTH];
- int size;
+ int size = 0;
if (device->num_joysticks > 0) {
joystick = SDL_JoystickFromInstanceID(device->joysticks[0]);
@@ -705,7 +303,12 @@
}
while ((size = hid_read_timeout(device->dev, data, sizeof(data), 0)) > 0) {
- HIDAPI_DriverXbox360_HandleStatePacket(joystick, device->dev, ctx, data, size);
+#ifdef DEBUG_XBOX_PROTOCOL
+ HIDAPI_DumpPacket("Xbox 360 packet: size = %d", data, size);
+#endif
+ if (data[0] == 0x00) {
+ HIDAPI_DriverXbox360_HandleStatePacket(joystick, ctx, data, size);
+ }
}
if (size < 0) {
@@ -718,22 +321,10 @@
static void
HIDAPI_DriverXbox360_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joystick)
{
-#if defined(SDL_JOYSTICK_HIDAPI_WINDOWS_XINPUT) || defined(SDL_JOYSTICK_HIDAPI_WINDOWS_GAMING_INPUT)
- SDL_DriverXbox360_Context *ctx = (SDL_DriverXbox360_Context *)device->context;
-#endif
-
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_XINPUT
- if (ctx->xinput_enabled) {
- HIDAPI_DriverXbox360_MarkXInputSlotFree(ctx->xinput_slot);
- WIN_UnloadXInputDLL();
+ if (device->dev) {
+ hid_close(device->dev);
+ device->dev = NULL;
}
-#endif
-#ifdef SDL_JOYSTICK_HIDAPI_WINDOWS_GAMING_INPUT
- HIDAPI_DriverXbox360_QuitWindowsGamingInput(ctx);
-#endif
-
- hid_close(device->dev);
- device->dev = NULL;
SDL_free(device->context);
device->context = NULL;
@@ -756,8 +347,12 @@
HIDAPI_DriverXbox360_UpdateDevice,
HIDAPI_DriverXbox360_OpenJoystick,
HIDAPI_DriverXbox360_RumbleJoystick,
+ HIDAPI_DriverXbox360_RumbleJoystickTriggers,
+ HIDAPI_DriverXbox360_HasJoystickLED,
+ HIDAPI_DriverXbox360_SetJoystickLED,
+ HIDAPI_DriverXbox360_SetJoystickSensorsEnabled,
HIDAPI_DriverXbox360_CloseJoystick,
- HIDAPI_DriverXbox360_FreeDevice
+ HIDAPI_DriverXbox360_FreeDevice,
};
#endif /* SDL_JOYSTICK_HIDAPI_XBOX360 */
--
Gitblit v1.9.3