Browse Source

Fixed the default mapping on Windows for the HORI Fighting Commander

Sam Lantinga 2 years ago
parent
commit
e6cb082232
3 changed files with 26 additions and 2 deletions
  1. 11 2
      src/joystick/SDL_gamecontroller.c
  2. 12 0
      src/joystick/SDL_joystick.c
  3. 3 0
      src/joystick/SDL_joystick_c.h

+ 11 - 2
src/joystick/SDL_gamecontroller.c

@@ -646,12 +646,21 @@ static ControllerMapping_t *SDL_CreateMappingForHIDAPIController(SDL_JoystickGUI
  */
 static ControllerMapping_t *SDL_CreateMappingForRAWINPUTController(SDL_JoystickGUID guid)
 {
+    Uint16 vendor;
+    Uint16 product;
+    Uint16 version;
     SDL_bool existing;
     char mapping_string[1024];
 
-    SDL_strlcpy(mapping_string, "none,*,", sizeof(mapping_string));
-    SDL_strlcat(mapping_string, "a:b0,b:b1,x:b2,y:b3,back:b6,guide:b10,start:b7,leftstick:b8,rightstick:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,", sizeof(mapping_string));
+    SDL_GetJoystickGUIDInfo(guid, &vendor, &product, &version);
 
+    SDL_strlcpy(mapping_string, "none,*,", sizeof(mapping_string));
+    if (SDL_JoystickUsesButtonLabelHint(vendor, product) &&
+        SDL_GetHintBoolean(SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS, SDL_TRUE)) {
+        SDL_strlcat(mapping_string, "a:b1,b:b0,x:b3,y:b2,back:b6,guide:b10,start:b7,leftstick:b8,rightstick:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,", sizeof(mapping_string));
+    } else {
+        SDL_strlcat(mapping_string, "a:b0,b:b1,x:b2,y:b3,back:b6,guide:b10,start:b7,leftstick:b8,rightstick:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,", sizeof(mapping_string));
+    }
     return SDL_PrivateAddMappingForGUID(guid, mapping_string,
                       &existing, SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT);
 }

+ 12 - 0
src/joystick/SDL_joystick.c

@@ -2186,6 +2186,18 @@ SDL_IsJoystickSteamController(Uint16 vendor_id, Uint16 product_id)
             eType == k_eControllerType_SteamControllerV2);
 }
 
+SDL_bool
+SDL_JoystickUsesButtonLabelHint(Uint16 vendor_id, Uint16 product_id)
+{
+    EControllerType eType = GuessControllerType(vendor_id, product_id);
+    return (eType == k_eControllerType_SwitchProController ||
+            eType == k_eControllerType_SwitchInputOnlyController ||
+            eType == k_eControllerType_XInputSwitchController ||
+            (vendor_id == USB_VENDOR_NINTENDO && product_id == USB_PRODUCT_NINTENDO_SWITCH_JOY_CON_GRIP) ||
+            (vendor_id == USB_VENDOR_NINTENDO && product_id == USB_PRODUCT_NINTENDO_GAMECUBE_ADAPTER) ||
+            (vendor_id == USB_VENDOR_SHENZHEN && product_id == USB_PRODUCT_EVORETRO_GAMECUBE_ADAPTER));
+}
+
 SDL_bool
 SDL_IsJoystickXInput(SDL_JoystickGUID guid)
 {

+ 3 - 0
src/joystick/SDL_joystick_c.h

@@ -90,6 +90,9 @@ extern SDL_bool SDL_IsJoystickNintendoSwitchJoyConRight(Uint16 vendor_id, Uint16
 /* Function to return whether a joystick is a Steam Controller */
 extern SDL_bool SDL_IsJoystickSteamController(Uint16 vendor_id, Uint16 product_id);
 
+/* Function to return whether a joystick uses SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS */
+extern SDL_bool SDL_JoystickUsesButtonLabelHint(Uint16 vendor_id, Uint16 product_id);
+
 /* Function to return whether a joystick guid comes from the XInput driver */
 extern SDL_bool SDL_IsJoystickXInput(SDL_JoystickGUID guid);