From 8a449de20d5e8f648bda271ad88412af4b29ed3f Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 27 Nov 2020 10:44:47 -0800 Subject: [PATCH] Fixed Xbox 360 wireless controller being picked up by WGI when it's being managed by RAWINPUT --- src/joystick/windows/SDL_dinputjoystick.c | 2 +- src/joystick/windows/SDL_rawinputjoystick.c | 11 +++++++++-- src/joystick/windows/SDL_rawinputjoystick_c.h | 2 +- src/joystick/windows/SDL_windows_gaming_input.c | 2 +- src/joystick/windows/SDL_xinputjoystick.c | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/joystick/windows/SDL_dinputjoystick.c b/src/joystick/windows/SDL_dinputjoystick.c index daa7590ac..6852910fb 100644 --- a/src/joystick/windows/SDL_dinputjoystick.c +++ b/src/joystick/windows/SDL_dinputjoystick.c @@ -674,7 +674,7 @@ EnumJoysticksCallback(const DIDEVICEINSTANCE * pdidInstance, VOID * pContext) #endif #ifdef SDL_JOYSTICK_RAWINPUT - if (RAWINPUT_IsDevicePresent(vendor, product, 0)) { + if (RAWINPUT_IsDevicePresent(vendor, product, 0, pNewJoystick->joystickname)) { /* The RAWINPUT driver is taking care of this device */ SDL_free(pNewJoystick); return DIENUM_CONTINUE; diff --git a/src/joystick/windows/SDL_rawinputjoystick.c b/src/joystick/windows/SDL_rawinputjoystick.c index 2970187b6..77a1f3d58 100644 --- a/src/joystick/windows/SDL_rawinputjoystick.c +++ b/src/joystick/windows/SDL_rawinputjoystick.c @@ -923,7 +923,7 @@ RAWINPUT_IsEnabled() } SDL_bool -RAWINPUT_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version) +RAWINPUT_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version, const char *name) { SDL_RAWINPUT_Device *device; @@ -932,9 +932,16 @@ RAWINPUT_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version) device = SDL_RAWINPUT_devices; while (device) { - if (device->vendor_id == vendor_id && device->product_id == product_id) { + if (vendor_id == device->vendor_id && product_id == device->product_id ) { return SDL_TRUE; } + + /* The Xbox 360 wireless controller shows up as product 0 in WGI */ + if (vendor_id == device->vendor_id && product_id == 0 && + name && SDL_strstr(device->name, name) != NULL) { + return SDL_TRUE; + } + device = device->next; } return SDL_FALSE; diff --git a/src/joystick/windows/SDL_rawinputjoystick_c.h b/src/joystick/windows/SDL_rawinputjoystick_c.h index b7d2e6302..4543798ba 100644 --- a/src/joystick/windows/SDL_rawinputjoystick_c.h +++ b/src/joystick/windows/SDL_rawinputjoystick_c.h @@ -25,7 +25,7 @@ extern SDL_bool RAWINPUT_IsEnabled(); /* Return true if a RawInput device is present and supported as a joystick */ -extern SDL_bool RAWINPUT_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version); +extern SDL_bool RAWINPUT_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version, const char *name); /* Returns 0 if message was handled */ extern LRESULT RAWINPUT_WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); diff --git a/src/joystick/windows/SDL_windows_gaming_input.c b/src/joystick/windows/SDL_windows_gaming_input.c index 9ae24b9c4..c1c306b72 100644 --- a/src/joystick/windows/SDL_windows_gaming_input.c +++ b/src/joystick/windows/SDL_windows_gaming_input.c @@ -249,7 +249,7 @@ static HRESULT STDMETHODCALLTYPE IEventHandler_CRawGameControllerVtbl_InvokeAdde #endif #ifdef SDL_JOYSTICK_RAWINPUT - if (!ignore_joystick && RAWINPUT_IsDevicePresent(vendor, product, version)) { + if (!ignore_joystick && RAWINPUT_IsDevicePresent(vendor, product, version, name)) { ignore_joystick = SDL_TRUE; } #endif diff --git a/src/joystick/windows/SDL_xinputjoystick.c b/src/joystick/windows/SDL_xinputjoystick.c index 715b54759..bd71c5414 100644 --- a/src/joystick/windows/SDL_xinputjoystick.c +++ b/src/joystick/windows/SDL_xinputjoystick.c @@ -302,7 +302,7 @@ AddXInputDevice(Uint8 userid, BYTE SubType, JoyStick_DeviceData **pContext) #endif #ifdef SDL_JOYSTICK_RAWINPUT - if (RAWINPUT_IsDevicePresent(vendor, product, version)) { + if (RAWINPUT_IsDevicePresent(vendor, product, version, pNewJoystick->joystickname)) { /* The RAWINPUT driver is taking care of this device */ SDL_free(pNewJoystick); return;