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