Commit 1fc7f681187f80ccd6b9625214b47db665cd9aaf

Sam Lantinga 2022-08-24T06:38:36

Document that it's not possible to use the HIDAPI driver for PS3 controllers on Windows

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
 }