mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-03-20 15:51:07 +01:00
Improved XInput controller detection
Sometimes we'll get a Windows.Gaming.Input callback before the raw input device is even in the list, so try some other methods to better detect XInput devices.
(cherry picked from commit 55a75875f0)
This commit is contained in:
@@ -110,7 +110,7 @@ extern SDL_bool SDL_XINPUT_Enabled(void);
|
||||
extern SDL_bool SDL_DINPUT_JoystickPresent(Uint16 vendor, Uint16 product, Uint16 version);
|
||||
|
||||
|
||||
static SDL_bool SDL_IsXInputDevice(Uint16 vendor, Uint16 product)
|
||||
static SDL_bool SDL_IsXInputDevice(Uint16 vendor, Uint16 product, const char* name)
|
||||
{
|
||||
#if defined(SDL_JOYSTICK_XINPUT) || defined(SDL_JOYSTICK_RAWINPUT)
|
||||
PRAWINPUTDEVICELIST raw_devices = NULL;
|
||||
@@ -126,6 +126,13 @@ static SDL_bool SDL_IsXInputDevice(Uint16 vendor, Uint16 product)
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
/* Sometimes we'll get a Windows.Gaming.Input callback before the raw input device is even in the list,
|
||||
* so try to do some checks up front to catch these cases. */
|
||||
if (SDL_IsJoystickXboxOne(vendor, product) ||
|
||||
(name && SDL_strncmp(name, "Xbox ", 5) == 0)) {
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
/* Go through RAWINPUT (WinXP and later) to find HID devices. */
|
||||
if ((GetRawInputDeviceList(NULL, &raw_device_count, sizeof(RAWINPUTDEVICELIST)) == -1) || (!raw_device_count)) {
|
||||
return SDL_FALSE; /* oh well. */
|
||||
@@ -508,7 +515,7 @@ static HRESULT STDMETHODCALLTYPE IEventHandler_CRawGameControllerVtbl_InvokeAdde
|
||||
ignore_joystick = SDL_TRUE;
|
||||
}
|
||||
|
||||
if (!ignore_joystick && SDL_IsXInputDevice(vendor, product)) {
|
||||
if (!ignore_joystick && SDL_IsXInputDevice(vendor, product, name)) {
|
||||
ignore_joystick = SDL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user