Document that it's not possible to use the HIDAPI driver for PS3 controllers on Windows
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
diff --git a/include/SDL_hints.h b/include/SDL_hints.h
index 6f28235..48f4f36 100644
--- a/include/SDL_hints.h
+++ b/include/SDL_hints.h
@@ -712,7 +712,10 @@ extern "C" {
* "0" - HIDAPI driver is not used
* "1" - HIDAPI driver is used
*
- * The default is the value of SDL_HINT_JOYSTICK_HIDAPI
+ * The default is the value of SDL_HINT_JOYSTICK_HIDAPI on macOS, and "0" on other platforms.
+ *
+ * It is not possible to use this driver on Windows, due to limitations in the default drivers
+ * installed. See https://github.com/ViGEm/DsHidMini for an alternative driver on Windows.
*/
#define SDL_HINT_JOYSTICK_HIDAPI_PS3 "SDL_JOYSTICK_HIDAPI_PS3"
diff --git a/src/joystick/hidapi/SDL_hidapi_ps3.c b/src/joystick/hidapi/SDL_hidapi_ps3.c
index ba20e28..c178a9f 100644
--- a/src/joystick/hidapi/SDL_hidapi_ps3.c
+++ b/src/joystick/hidapi/SDL_hidapi_ps3.c
@@ -79,15 +79,27 @@ HIDAPI_DriverPS3_UnregisterHints(SDL_HintCallback callback, void *userdata)
static SDL_bool
HIDAPI_DriverPS3_IsEnabled(void)
{
-#ifdef __MACOSX__
+#if defined(__MACOSX__)
+ /* This works well on macOS */
return SDL_GetHintBoolean(SDL_HINT_JOYSTICK_HIDAPI_PS3,
SDL_GetHintBoolean(SDL_HINT_JOYSTICK_HIDAPI,
SDL_HIDAPI_DEFAULT));
-#else
- /* Linux already has good PS3 drivers and controller initialization fails on Windows,
- * so don't bother using this driver on other platforms.
+#elif defined(__WINDOWS__)
+ /* You can't initialize the controller with the stock Windows drivers
+ * See https://github.com/ViGEm/DsHidMini as an alternative driver
+ */
+ return SDL_FALSE;
+#elif defined(__LINUX__)
+ /* Linux drivers do a better job of managing the transition between
+ * USB and Bluetooth. There are also some quirks in communicating
+ * with PS3 controllers that have been implemented in SDL's hidapi
+ * for libusb, but are not possible to support using hidraw if the
+ * kernel doesn't already know about them.
*/
return SDL_GetHintBoolean(SDL_HINT_JOYSTICK_HIDAPI_PS3, SDL_FALSE);
+#else
+ /* Untested, default off */
+ return SDL_GetHintBoolean(SDL_HINT_JOYSTICK_HIDAPI_PS3, SDL_FALSE);
#endif
}