From 009b62f1c267ccd7475a17946d2f21c1aa1becd9 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 7 Nov 2020 02:22:15 -0800 Subject: [PATCH] Be explicit about mapping the new game controller paddle buttons --- .../tests/controllermap/controllermap.vcxproj | 20 +++- .../testgamecontroller.vcxproj | 20 +++- .../TestiPhoneOS.xcodeproj/project.pbxproj | 8 ++ include/SDL_config_iphoneos.h | 2 +- include/SDL_gamecontroller.h | 9 +- src/joystick/SDL_gamecontroller.c | 17 +-- src/joystick/SDL_gamecontrollerdb.h | 20 ++-- src/joystick/android/SDL_sysjoystick.c | 10 +- src/joystick/hidapi/SDL_hidapi_steam.c | 10 +- src/joystick/hidapi/SDL_hidapi_switch.c | 6 +- src/joystick/hidapi/SDL_hidapi_xboxone.c | 32 ++--- src/joystick/iphoneos/SDL_sysjoystick.m | 22 ++-- test/controllermap.bmp | Bin 163450 -> 163450 bytes test/controllermap.c | 32 +++-- test/controllermap_back.bmp | Bin 0 -> 487034 bytes test/testgamecontroller.c | 110 ++++++++++-------- 16 files changed, 190 insertions(+), 128 deletions(-) create mode 100644 test/controllermap_back.bmp diff --git a/VisualC/tests/controllermap/controllermap.vcxproj b/VisualC/tests/controllermap/controllermap.vcxproj index fedaf6cc8..f0eb15564 100644 --- a/VisualC/tests/controllermap/controllermap.vcxproj +++ b/VisualC/tests/controllermap/controllermap.vcxproj @@ -242,6 +242,24 @@ $(ProjectDir)\%(Filename)%(Extension);%(Outputs) Copying %(Filename)%(Extension) copy %(FullPath) $(ProjectDir)\ + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + + + Copying %(Filename)%(Extension) + copy %(FullPath) $(ProjectDir)\ + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + Copying %(Filename)%(Extension) + copy %(FullPath) $(ProjectDir)\ + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + Copying %(Filename)%(Extension) + copy %(FullPath) $(ProjectDir)\ + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + Copying %(Filename)%(Extension) + copy %(FullPath) $(ProjectDir)\ $(ProjectDir)\%(Filename)%(Extension);%(Outputs) @@ -252,4 +270,4 @@ - \ No newline at end of file + diff --git a/VisualC/tests/testgamecontroller/testgamecontroller.vcxproj b/VisualC/tests/testgamecontroller/testgamecontroller.vcxproj index 1b91b8774..54fcaa97f 100644 --- a/VisualC/tests/testgamecontroller/testgamecontroller.vcxproj +++ b/VisualC/tests/testgamecontroller/testgamecontroller.vcxproj @@ -242,6 +242,24 @@ $(ProjectDir)\%(Filename)%(Extension);%(Outputs) Copying %(Filename)%(Extension) copy %(FullPath) $(ProjectDir)\ + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + + + Copying %(Filename)%(Extension) + copy %(FullPath) $(ProjectDir)\ + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + Copying %(Filename)%(Extension) + copy %(FullPath) $(ProjectDir)\ + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + Copying %(Filename)%(Extension) + copy %(FullPath) $(ProjectDir)\ + + $(ProjectDir)\%(Filename)%(Extension);%(Outputs) + Copying %(Filename)%(Extension) + copy %(FullPath) $(ProjectDir)\ $(ProjectDir)\%(Filename)%(Extension);%(Outputs) @@ -252,4 +270,4 @@ - \ No newline at end of file + diff --git a/Xcode-iOS/Test/TestiPhoneOS.xcodeproj/project.pbxproj b/Xcode-iOS/Test/TestiPhoneOS.xcodeproj/project.pbxproj index 952faf2ff..d437660dc 100644 --- a/Xcode-iOS/Test/TestiPhoneOS.xcodeproj/project.pbxproj +++ b/Xcode-iOS/Test/TestiPhoneOS.xcodeproj/project.pbxproj @@ -161,6 +161,9 @@ F3A499CD255618AF00E92A8B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDA8A89C0E2D111A00EA573E /* UIKit.framework */; }; F3A499CF255618AF00E92A8B /* hidapi.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F3A492F32555E1F100E92A8B /* hidapi.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; F3A49A822556190000E92A8B /* controllermap.c in Sources */ = {isa = PBXBuildFile; fileRef = F3A49A4C255618DD00E92A8B /* controllermap.c */; }; + F3A49AFE2556A47500E92A8B /* controllermap_back.bmp in Resources */ = {isa = PBXBuildFile; fileRef = F3A49AFD2556A47500E92A8B /* controllermap_back.bmp */; }; + F3A49AFF2556A47500E92A8B /* controllermap_back.bmp in Resources */ = {isa = PBXBuildFile; fileRef = F3A49AFD2556A47500E92A8B /* controllermap_back.bmp */; }; + F3A49B002556A47500E92A8B /* controllermap_back.bmp in Resources */ = {isa = PBXBuildFile; fileRef = F3A49AFD2556A47500E92A8B /* controllermap_back.bmp */; }; F3F758D322AC561A001D97F2 /* libSDL2test.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AA1EE452176059230029C7A5 /* libSDL2test.a */; }; F3F758D422AC575F001D97F2 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA2F57A91FDB544800832AD7 /* Metal.framework */; }; F3F758D522AC57D8001D97F2 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AA2F57A91FDB544800832AD7 /* Metal.framework */; }; @@ -628,6 +631,7 @@ F3A499D3255618AF00E92A8B /* controllermap.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = controllermap.app; sourceTree = BUILT_PRODUCTS_DIR; }; F3A499D4255618AF00E92A8B /* testgamecontroller copy-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "testgamecontroller copy-Info.plist"; path = "/Users/valve/projects/SDL/Xcode-iOS/Test/testgamecontroller copy-Info.plist"; sourceTree = ""; }; F3A49A4C255618DD00E92A8B /* controllermap.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = controllermap.c; sourceTree = ""; }; + F3A49AFD2556A47500E92A8B /* controllermap_back.bmp */ = {isa = PBXFileReference; lastKnownFileType = image.bmp; path = controllermap_back.bmp; sourceTree = ""; }; FA0EF2221BAF43DE000E07A6 /* testgamecontroller.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = testgamecontroller.c; sourceTree = ""; }; FA0EF2281BAF4487000E07A6 /* axis.bmp */ = {isa = PBXFileReference; lastKnownFileType = image.bmp; path = axis.bmp; sourceTree = ""; }; FA0EF2291BAF4487000E07A6 /* button.bmp */ = {isa = PBXFileReference; lastKnownFileType = image.bmp; path = button.bmp; sourceTree = ""; }; @@ -1439,6 +1443,7 @@ FA0EF2281BAF4487000E07A6 /* axis.bmp */, FA0EF2291BAF4487000E07A6 /* button.bmp */, FA0EF22A1BAF4487000E07A6 /* controllermap.bmp */, + F3A49AFD2556A47500E92A8B /* controllermap_back.bmp */, FDA8AAD90E2D33B000EA573E /* icon.bmp */, FDA8AADA0E2D33BA00EA573E /* moose.dat */, FDA8AADB0E2D33BA00EA573E /* picture.xbm */, @@ -2278,6 +2283,7 @@ buildActionMask = 2147483647; files = ( F3A499B9255618AF00E92A8B /* controllermap.bmp in Resources */, + F3A49AFE2556A47500E92A8B /* controllermap_back.bmp in Resources */, F3A499BA255618AF00E92A8B /* icon.bmp in Resources */, F3A499BB255618AF00E92A8B /* axis.bmp in Resources */, F3A499BC255618AF00E92A8B /* button.bmp in Resources */, @@ -2289,6 +2295,7 @@ buildActionMask = 2147483647; files = ( FA3D99521BC4E70C002C96C8 /* controllermap.bmp in Resources */, + F3A49B002556A47500E92A8B /* controllermap_back.bmp in Resources */, FA3D99541BC4E70F002C96C8 /* button.bmp in Resources */, FA3D99531BC4E70E002C96C8 /* axis.bmp in Resources */, FA3D99551BC4E712002C96C8 /* icon.bmp in Resources */, @@ -2315,6 +2322,7 @@ buildActionMask = 2147483647; files = ( FAE0E9961BAF9B650098DFA4 /* controllermap.bmp in Resources */, + F3A49AFF2556A47500E92A8B /* controllermap_back.bmp in Resources */, FAE0E9821BAF9B230098DFA4 /* icon.bmp in Resources */, FAE0E9981BAF9B6E0098DFA4 /* axis.bmp in Resources */, FAE0E9971BAF9B6A0098DFA4 /* button.bmp in Resources */, diff --git a/include/SDL_config_iphoneos.h b/include/SDL_config_iphoneos.h index e9cf01717..f3b74a637 100644 --- a/include/SDL_config_iphoneos.h +++ b/include/SDL_config_iphoneos.h @@ -137,7 +137,7 @@ #define SDL_HAPTIC_DUMMY 1 /* Enable MFi joystick support */ -/*#define SDL_JOYSTICK_HIDAPI 1*/ +#define SDL_JOYSTICK_HIDAPI 1 #define SDL_JOYSTICK_MFI 1 #define SDL_JOYSTICK_VIRTUAL 1 diff --git a/include/SDL_gamecontroller.h b/include/SDL_gamecontroller.h index 807d50dda..342d94fd3 100644 --- a/include/SDL_gamecontroller.h +++ b/include/SDL_gamecontroller.h @@ -363,10 +363,11 @@ typedef enum SDL_CONTROLLER_BUTTON_DPAD_DOWN, SDL_CONTROLLER_BUTTON_DPAD_LEFT, SDL_CONTROLLER_BUTTON_DPAD_RIGHT, - SDL_CONTROLLER_BUTTON_AUX1, // Xbox Elite paddle upper left, PS4/PS5 touchpad button, Nintendo Switch Pro capture button - SDL_CONTROLLER_BUTTON_AUX2, // Xbox Elite paddle upper right - SDL_CONTROLLER_BUTTON_AUX3, // Xbox Elite paddle lower left - SDL_CONTROLLER_BUTTON_AUX4, // Xbox Elite paddle lower right + SDL_CONTROLLER_BUTTON_MISC1, // Xbox Series X share button, PS4/PS5 touchpad button, Nintendo Switch Pro capture button + SDL_CONTROLLER_BUTTON_PADDLE1, // Xbox Elite paddle P1 + SDL_CONTROLLER_BUTTON_PADDLE2, // Xbox Elite paddle P3 + SDL_CONTROLLER_BUTTON_PADDLE3, // Xbox Elite paddle P2 + SDL_CONTROLLER_BUTTON_PADDLE4, // Xbox Elite paddle P4 SDL_CONTROLLER_BUTTON_MAX } SDL_GameControllerButton; diff --git a/src/joystick/SDL_gamecontroller.c b/src/joystick/SDL_gamecontroller.c index 4967ce583..b37f4c191 100644 --- a/src/joystick/SDL_gamecontroller.c +++ b/src/joystick/SDL_gamecontroller.c @@ -570,20 +570,20 @@ static ControllerMapping_t *SDL_CreateMappingForHIDAPIController(SDL_JoystickGUI if (SDL_IsJoystickXboxOneElite(vendor, product)) { /* XBox One Elite Controllers have 4 back paddle buttons */ - SDL_strlcat(mapping_string, "aux1:b15,aux2:b16,aux3:b17,aux4:b18,", sizeof(mapping_string)); + SDL_strlcat(mapping_string, "paddle1:b15,paddle2:b17,paddle3:b16,paddle4:b18,", sizeof(mapping_string)); } else if (SDL_IsJoystickSteamController(vendor, product)) { /* Steam controllers have 2 back paddle buttons */ - SDL_strlcat(mapping_string, "aux1:b15,aux2:b16,", sizeof(mapping_string)); + SDL_strlcat(mapping_string, "paddle1:b16,paddle2:b15,", sizeof(mapping_string)); } else { switch (SDL_GetJoystickGameControllerTypeFromGUID(guid, NULL)) { case SDL_CONTROLLER_TYPE_PS4: case SDL_CONTROLLER_TYPE_PS5: /* PS4/PS5 controllers have an additional touchpad button */ - SDL_strlcat(mapping_string, "aux1:b15,", sizeof(mapping_string)); + SDL_strlcat(mapping_string, "misc1:b15,", sizeof(mapping_string)); break; case SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO: /* Nintendo Switch Pro controllers have a screenshot button */ - SDL_strlcat(mapping_string, "aux1:b15,", sizeof(mapping_string)); + SDL_strlcat(mapping_string, "misc1:b15,", sizeof(mapping_string)); break; default: break; @@ -705,10 +705,11 @@ static const char* map_StringForControllerButton[] = { "dpdown", "dpleft", "dpright", - "aux1", - "aux2", - "aux3", - "aux4", + "misc1", + "paddle1", + "paddle2", + "paddle3", + "paddle4", NULL }; diff --git a/src/joystick/SDL_gamecontrollerdb.h b/src/joystick/SDL_gamecontrollerdb.h index 204c2bd55..fbfa0bc8a 100644 --- a/src/joystick/SDL_gamecontrollerdb.h +++ b/src/joystick/SDL_gamecontrollerdb.h @@ -701,13 +701,13 @@ static const char *s_ControllerMappings [] = "030000005e0400008e02000020200000,SpeedLink XEOX Pro Analog Gamepad pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,", "030000005e0400008e02000073050000,Speedlink TORID Wireless Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,", "03000000d11800000094000011010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,", - "03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", - "03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", - "03000000de2800004211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", + "03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", + "03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", + "03000000de2800004211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", "03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,", - "05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", - "05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", - "05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", + "05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", + "05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", + "05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", "03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,", "0500000011010000311400001b010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b32,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,", "03000000ad1b000038f0000090040000,Street Fighter IV FightStick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,", @@ -810,8 +810,6 @@ static const char *s_ControllerMappings [] = "050000003215000005070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,", "050000003215000007070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,", "050000003215000000090000bf7f3f00,Razer Serval,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,", - "05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", - "05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", "050000004f0400000ed00000fffe3f00,ThrustMaster eSwap PRO Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,", "050000005e040000fd020000ff7f3f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,", "050000005e040000e00200000ffe3f00,Xbox One Wireless Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,", @@ -829,11 +827,9 @@ static const char *s_ControllerMappings [] = "05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,", "050000004c050000cc090000df070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,", "050000004c050000cc090000ff070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,", - "050000004c050000cc090000ff876d01,PS4 Controller,a:b0,aux1:b11,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,", + "050000004c050000cc090000ff876d01,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,", "05000000ac0500000300000043006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,", - "05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", - "05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,", - "050000005e040000050b0000ff876d01,Xbox Elite Wireless Controller,a:b0,aux1:b11,aux2:b12,aux3:b13,aux4:b13,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,", + "050000005e040000050b0000ff876d01,Xbox Elite Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b13,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,", "050000005e040000e0020000df070000,Xbox Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,", "050000005e040000e0020000ff070000,Xbox Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,", #endif diff --git a/src/joystick/android/SDL_sysjoystick.c b/src/joystick/android/SDL_sysjoystick.c index 23107f005..32fc1d82a 100644 --- a/src/joystick/android/SDL_sysjoystick.c +++ b/src/joystick/android/SDL_sysjoystick.c @@ -138,16 +138,16 @@ keycode_to_SDL(int keycode) button = SDL_CONTROLLER_BUTTON_GUIDE; break; case AKEYCODE_BUTTON_L2: - button = SDL_CONTROLLER_BUTTON_AUX1; + button = 15; break; case AKEYCODE_BUTTON_R2: - button = SDL_CONTROLLER_BUTTON_AUX2; + button = 16; break; case AKEYCODE_BUTTON_C: - button = SDL_CONTROLLER_BUTTON_AUX3; + button = 17; break; case AKEYCODE_BUTTON_Z: - button = SDL_CONTROLLER_BUTTON_AUX4; + button = 18; break; /* D-Pad key codes (API 1) */ @@ -165,7 +165,7 @@ keycode_to_SDL(int keycode) break; case AKEYCODE_DPAD_CENTER: /* This is handled better by applications as the A button */ - /*button = 19;*/ /* Not supported by GameController */ + /*button = 19;*/ button = SDL_CONTROLLER_BUTTON_A; break; diff --git a/src/joystick/hidapi/SDL_hidapi_steam.c b/src/joystick/hidapi/SDL_hidapi_steam.c index 8089b22e2..6e3bb0317 100644 --- a/src/joystick/hidapi/SDL_hidapi_steam.c +++ b/src/joystick/hidapi/SDL_hidapi_steam.c @@ -137,8 +137,8 @@ typedef struct SteamControllerStateInternal_t #define STEAM_BUTTON_RIGHTPAD_CLICKED_MASK 0x00040000 #define STEAM_LEFTPAD_FINGERDOWN_MASK 0x00080000 #define STEAM_RIGHTPAD_FINGERDOWN_MASK 0x00100000 -#define STEAM_JOYSTICK_BUTTON_MASK 0x00400000 -#define STEAM_LEFTPAD_AND_JOYSTICK_MASK 0x00800000 +#define STEAM_JOYSTICK_BUTTON_MASK 0x00400000 +#define STEAM_LEFTPAD_AND_JOYSTICK_MASK 0x00800000 // Look for report version 0x0001, type WIRELESS (3), length >= 1 byte @@ -1111,9 +1111,9 @@ HIDAPI_DriverSteam_UpdateDevice(SDL_HIDAPI_Device *device) SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_LEFTSTICK, (ctx->m_state.ulButtons & STEAM_JOYSTICK_BUTTON_MASK) ? SDL_PRESSED : SDL_RELEASED); - SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_AUX1, + SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_MISC1 + 0, (ctx->m_state.ulButtons & STEAM_BUTTON_BACK_LEFT_MASK) ? SDL_PRESSED : SDL_RELEASED); - SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_AUX2, + SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_MISC1 + 1, (ctx->m_state.ulButtons & STEAM_BUTTON_BACK_RIGHT_MASK) ? SDL_PRESSED : SDL_RELEASED); } { @@ -1186,7 +1186,7 @@ SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverSteam = HIDAPI_DriverSteam_SetJoystickLED, HIDAPI_DriverSteam_CloseJoystick, HIDAPI_DriverSteam_FreeDevice, - NULL + NULL }; #endif /* SDL_JOYSTICK_HIDAPI_STEAM */ diff --git a/src/joystick/hidapi/SDL_hidapi_switch.c b/src/joystick/hidapi/SDL_hidapi_switch.c index 32a298eea..80a560d93 100644 --- a/src/joystick/hidapi/SDL_hidapi_switch.c +++ b/src/joystick/hidapi/SDL_hidapi_switch.c @@ -964,7 +964,7 @@ static void HandleInputOnlyControllerState(SDL_Joystick *joystick, SDL_DriverSwi SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_LEFTSTICK, (data & 0x04) ? SDL_PRESSED : SDL_RELEASED); SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_RIGHTSTICK, (data & 0x08) ? SDL_PRESSED : SDL_RELEASED); SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_GUIDE, (data & 0x10) ? SDL_PRESSED : SDL_RELEASED); - SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_AUX1, (data & 0x20) ? SDL_PRESSED : SDL_RELEASED); + SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_MISC1, (data & 0x20) ? SDL_PRESSED : SDL_RELEASED); } if (packet->ucStickHat != ctx->m_lastInputOnlyState.ucStickHat) { @@ -1063,7 +1063,7 @@ static void HandleSimpleControllerState(SDL_Joystick *joystick, SDL_DriverSwitch SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_LEFTSTICK, (data & 0x04) ? SDL_PRESSED : SDL_RELEASED); SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_RIGHTSTICK, (data & 0x08) ? SDL_PRESSED : SDL_RELEASED); SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_GUIDE, (data & 0x10) ? SDL_PRESSED : SDL_RELEASED); - SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_AUX1, (data & 0x20) ? SDL_PRESSED : SDL_RELEASED); + SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_MISC1, (data & 0x20) ? SDL_PRESSED : SDL_RELEASED); } if (packet->ucStickHat != ctx->m_lastSimpleState.ucStickHat) { @@ -1148,7 +1148,7 @@ static void HandleFullControllerState(SDL_Joystick *joystick, SDL_DriverSwitch_C SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_LEFTSTICK, (data & 0x08) ? SDL_PRESSED : SDL_RELEASED); SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_GUIDE, (data & 0x10) ? SDL_PRESSED : SDL_RELEASED); - SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_AUX1, (data & 0x20) ? SDL_PRESSED : SDL_RELEASED); + SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_MISC1, (data & 0x20) ? SDL_PRESSED : SDL_RELEASED); } if (packet->controllerState.rgucButtons[2] != ctx->m_lastFullState.controllerState.rgucButtons[2]) { diff --git a/src/joystick/hidapi/SDL_hidapi_xboxone.c b/src/joystick/hidapi/SDL_hidapi_xboxone.c index c60b9a1ff..5a82a1098 100644 --- a/src/joystick/hidapi/SDL_hidapi_xboxone.c +++ b/src/joystick/hidapi/SDL_hidapi_xboxone.c @@ -383,12 +383,12 @@ HIDAPI_DriverXboxOne_HandleStatePacket(SDL_Joystick *joystick, hid_device *dev, /* Xbox One S report is 18 bytes Xbox One Elite Series 1 report is 33 bytes, paddles in data[32], mode in data[32] & 0x10, both modes have mapped paddles by default Paddle bits: - UL: 0x01 (A) UR: 0x02 (B) - LL: 0x04 (X) LR: 0x08 (Y) + P3: 0x01 (A) P1: 0x02 (B) + P4: 0x04 (X) P2: 0x08 (Y) Xbox One Elite Series 2 report is 38 bytes, paddles in data[18], mode in data[19], mode 0 has no mapped paddles by default Paddle bits: - UL: 0x04 (A) UR: 0x01 (B) - LL: 0x08 (X) LR: 0x02 (Y) + P3: 0x04 (A) P1: 0x01 (B) + P4: 0x08 (X) P2: 0x02 (Y) */ if (ctx->has_paddles && (size == 33 || size == 38)) { int paddle_index; @@ -401,10 +401,10 @@ HIDAPI_DriverXboxOne_HandleStatePacket(SDL_Joystick *joystick, hid_device *dev, if (size == 33) { /* XBox One Elite Series 1 */ paddle_index = 32; - button1_bit = 0x01; - button2_bit = 0x02; - button3_bit = 0x04; - button4_bit = 0x08; + button1_bit = 0x02; + button2_bit = 0x08; + button3_bit = 0x01; + button4_bit = 0x04; /* The mapped controller state is at offset 4, the raw state is at offset 18, compare them to see if the paddles are mapped */ paddles_mapped = (SDL_memcmp(&data[4], &data[18], 14) != 0); @@ -412,10 +412,10 @@ HIDAPI_DriverXboxOne_HandleStatePacket(SDL_Joystick *joystick, hid_device *dev, } else /* if (size == 38) */ { /* XBox One Elite Series 2 */ paddle_index = 18; - button1_bit = 0x04; - button2_bit = 0x01; - button3_bit = 0x08; - button4_bit = 0x02; + button1_bit = 0x01; + button2_bit = 0x02; + button3_bit = 0x04; + button4_bit = 0x08; paddles_mapped = (data[19] != 0); } #ifdef DEBUG_XBOX_PROTOCOL @@ -434,10 +434,10 @@ HIDAPI_DriverXboxOne_HandleStatePacket(SDL_Joystick *joystick, hid_device *dev, } if (ctx->last_state[paddle_index] != data[paddle_index]) { - SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_AUX1, (data[paddle_index] & button1_bit) ? SDL_PRESSED : SDL_RELEASED); - SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_AUX2, (data[paddle_index] & button2_bit) ? SDL_PRESSED : SDL_RELEASED); - SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_AUX3, (data[paddle_index] & button3_bit) ? SDL_PRESSED : SDL_RELEASED); - SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_AUX4, (data[paddle_index] & button4_bit) ? SDL_PRESSED : SDL_RELEASED); + SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_MISC1 + 0, (data[paddle_index] & button1_bit) ? SDL_PRESSED : SDL_RELEASED); + SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_MISC1 + 1, (data[paddle_index] & button2_bit) ? SDL_PRESSED : SDL_RELEASED); + SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_MISC1 + 2, (data[paddle_index] & button3_bit) ? SDL_PRESSED : SDL_RELEASED); + SDL_PrivateJoystickButton(joystick, SDL_CONTROLLER_BUTTON_MISC1 + 3, (data[paddle_index] & button4_bit) ? SDL_PRESSED : SDL_RELEASED); } } diff --git a/src/joystick/iphoneos/SDL_sysjoystick.m b/src/joystick/iphoneos/SDL_sysjoystick.m index 960151728..732577a51 100644 --- a/src/joystick/iphoneos/SDL_sysjoystick.m +++ b/src/joystick/iphoneos/SDL_sysjoystick.m @@ -193,27 +193,27 @@ IOS_AddMFIJoystickDevice(SDL_JoystickDeviceItem *device, GCController *controlle if ([controller respondsToSelector:@selector(physicalInputProfile)]) { if (controller.physicalInputProfile.buttons[GCInputDualShockTouchpadButton] != nil) { device->has_dualshock_touchpad = SDL_TRUE; - device->button_mask |= (1 << SDL_CONTROLLER_BUTTON_AUX1); + device->button_mask |= (1 << SDL_CONTROLLER_BUTTON_MISC1); ++nbuttons; } if (controller.physicalInputProfile.buttons[GCInputXboxPaddleOne] != nil) { device->has_xbox_paddles = SDL_TRUE; - device->button_mask |= (1 << SDL_CONTROLLER_BUTTON_AUX1); + device->button_mask |= (1 << SDL_CONTROLLER_BUTTON_PADDLE1); ++nbuttons; } if (controller.physicalInputProfile.buttons[GCInputXboxPaddleTwo] != nil) { device->has_xbox_paddles = SDL_TRUE; - device->button_mask |= (1 << SDL_CONTROLLER_BUTTON_AUX2); + device->button_mask |= (1 << SDL_CONTROLLER_BUTTON_PADDLE2); ++nbuttons; } if (controller.physicalInputProfile.buttons[GCInputXboxPaddleThree] != nil) { device->has_xbox_paddles = SDL_TRUE; - device->button_mask |= (1 << SDL_CONTROLLER_BUTTON_AUX3); + device->button_mask |= (1 << SDL_CONTROLLER_BUTTON_PADDLE3); ++nbuttons; } if (controller.physicalInputProfile.buttons[GCInputXboxPaddleFour] != nil) { device->has_xbox_paddles = SDL_TRUE; - device->button_mask |= (1 << SDL_CONTROLLER_BUTTON_AUX4); + device->button_mask |= (1 << SDL_CONTROLLER_BUTTON_PADDLE4); ++nbuttons; } } @@ -747,22 +747,20 @@ IOS_MFIJoystickUpdate(SDL_Joystick * joystick) #ifdef ENABLE_PHYSICAL_INPUT_PROFILE if (joystick->hwdata->has_dualshock_touchpad) { - if (joystick->hwdata->button_mask & (1 << SDL_CONTROLLER_BUTTON_AUX1)) { - buttons[button_count++] = controller.physicalInputProfile.buttons[GCInputDualShockTouchpadButton].isPressed; - } + buttons[button_count++] = controller.physicalInputProfile.buttons[GCInputDualShockTouchpadButton].isPressed; } if (joystick->hwdata->has_xbox_paddles) { - if (joystick->hwdata->button_mask & (1 << SDL_CONTROLLER_BUTTON_AUX1)) { + if (joystick->hwdata->button_mask & (1 << SDL_CONTROLLER_BUTTON_PADDLE1)) { buttons[button_count++] = controller.physicalInputProfile.buttons[GCInputXboxPaddleOne].isPressed; } - if (joystick->hwdata->button_mask & (1 << SDL_CONTROLLER_BUTTON_AUX2)) { + if (joystick->hwdata->button_mask & (1 << SDL_CONTROLLER_BUTTON_PADDLE2)) { buttons[button_count++] = controller.physicalInputProfile.buttons[GCInputXboxPaddleTwo].isPressed; } - if (joystick->hwdata->button_mask & (1 << SDL_CONTROLLER_BUTTON_AUX3)) { + if (joystick->hwdata->button_mask & (1 << SDL_CONTROLLER_BUTTON_PADDLE3)) { buttons[button_count++] = controller.physicalInputProfile.buttons[GCInputXboxPaddleThree].isPressed; } - if (joystick->hwdata->button_mask & (1 << SDL_CONTROLLER_BUTTON_AUX4)) { + if (joystick->hwdata->button_mask & (1 << SDL_CONTROLLER_BUTTON_PADDLE4)) { buttons[button_count++] = controller.physicalInputProfile.buttons[GCInputXboxPaddleFour].isPressed; } diff --git a/test/controllermap.bmp b/test/controllermap.bmp index df167f677804eec5746a33f048b564d19db9ab8f..ee9629c2b85cb88bd44f7f7c2ac99b7b1ae6dd44 100644 GIT binary patch delta 1229 zcmXw&e@v8h9LM+O?tnYNL-~=OBrrxu%1De3LUv=sh~OenMsWP_Kn@7eGZ78331qIV zrMGA9iw+Dmkt`eaRG+m`S*vkCxtc9vm4=L=vu40hLF)Q^AJ+YG&+GO6exL96`96C; zi%Z7ECF8(bW4fWCA=NYXFZ|?n+z0UG*J&8MUwl6JjWTgFO!fRe1(Wy3#%Jus`X>iQ z)gw3N5j>ood~V^v{n@Wwkv&({j)@tBjC5PxUYebezk9cBg`;Zcr+yb+Hu7B%@dUX0vh`to85?`huR6Tk7H&!cFiz`-ysp8H!#Dz43iLdxi?fUB% z)^w@q2v<+t9b?Uqnt=%Q^vut!HmNqOQM>1UV$GDAiM49a{594rscEpNXYRB1Wy_7S zVNtG_^y=A#A2`a9kCKCR$`cX(>iLIPIm$(dZvK!{X?Mk_7yjX-KaUSHS5PE8L3m7k z*Ea(5aC7AJymsi>haPj6(!RKXE&(G5{;uDedcx=P^*$f({+9DibXkXC7{C9l+7c1I z{o*yHa3PsKG{6hL(GlKcD^UOj4I=s&j+5U?G(n<5ej(VU;Yrf1M!kloNFRn;4ZFz@ zfokw`hw8jTUS*>04f0eix_CgO2e zj{1w8>yS&A6ELu>HIL$1dT%2>l4=muQLL8||5s-Wa;QHEA48PKBA>WG6626Z+@4Pu zxJ6>7hA9%WG_>+=+zj5WEKR04 z_>|X8m+R(oieXWffh-KunLG^gB%7RM*KW;}SfF8+#6k_TkuM@^5J(?v!~1+g4tx32 zFe~o%1iD^~HqLU9ue|9>rRyd9wuB=OcCo$|R=QCthaGmwp? zLN_bW%26Q-l;};VG+BjLSht~w)k;%N9AGU*J5OFgw`#B-qN0R#AUc^sT(Gm2qJuSw zR@UPMh)Rd1i4^=2iXf^g(8;5ZQ_wDKhuBf2=>}S{8^x?n9Oaec$mB)|gtG?6SYyce zGD;z;Ytcu6&0I54Q-^mbpaqo>wGB8+{s*xG!qtdg@^9tdiuxw>kf9AbAsY68+x#kA o5RH3rnhZx|-JABIiwqs|BiOs2zX$zma6>d7zzNd7j+O`i0TCzCUjP6A delta 1069 zcmYMzZA^_}7zgnE>pZ=oonft&bXreKfOpK5;%nUO_UhnIv=G*W8zprPzpJ&%I{L6Ltmut`dKF8juz0%tE z2M)bn()#2t&@Qb{-@rDo z%#$a6-i6IHYreGq))6MV|K5f$?!zKF4cy|xa60Qaq6oU6p_jWQM9#RTi7nnZKo0IG zgDCfbjU0^F2(if*jq1Lh%O$s|SObw4jCggWXnOC9Y6wdR z;#6EpZ~agMv2Lz@8c9R`s8=ymKV3|N0UXzcAzqjY5kUiiXjFNjnhx=Brn5olfyfC* zJlSXBs$v8)7zB|Wi3GBT=!{~{)fvqU)fvMK!xac~EE1_}AucP%VL92unOO;{wMXbo zL<}8`#C6psaT}$#$;@b-Da;t1saQc>vACpW)0uJHnlscuR{|tNW+sxUI}sPvfEg>P zJ4t7bYELEOf@*V-LZ?%3UeSUyI+uzwiuu@0{ptJxvI@~m&oh|j^@=Yt(V$p@7J6xB zW|yLsUge+;wi|8+v93%#I+%;v(O9kqhb-8}`>F{`CHBzUd{m9Zye;Tby$czOki?af z$gjdl1!r= SDL_CONTROLLER_BUTTON_PADDLE1 && + s_arrBindingOrder[s_iCurrentBinding] <= SDL_CONTROLLER_BUTTON_PADDLE4) { + SDL_RenderCopy(screen, background_back, NULL, NULL); + } else { + SDL_RenderCopy(screen, background_front, NULL, NULL); + } SDL_SetTextureAlphaMod(marker, alpha); SDL_SetTextureColorMod(marker, 10, 255, 21); SDL_RenderCopyEx(screen, marker, NULL, &dst, s_arrBindingDisplay[iElement].angle, NULL, SDL_FLIP_NONE); diff --git a/test/controllermap_back.bmp b/test/controllermap_back.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bfaed6f026621ed2c0d921462aca5eb08e4654c8 GIT binary patch literal 487034 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 HKH~oe94kFB literal 0 HcmV?d00001 diff --git a/test/testgamecontroller.c b/test/testgamecontroller.c index 0394e5c50..3d6a371b6 100644 --- a/test/testgamecontroller.c +++ b/test/testgamecontroller.c @@ -29,42 +29,43 @@ /* This is indexed by SDL_GameControllerButton. */ static const struct { int x; int y; } button_positions[] = { - {387, 167}, /* A */ - {431, 132}, /* B */ - {342, 132}, /* X */ - {389, 101}, /* Y */ - {174, 132}, /* BACK */ - {233, 132}, /* GUIDE */ - {289, 132}, /* START */ - {75, 154}, /* LEFTSTICK */ - {305, 230}, /* RIGHTSTICK */ - {77, 40}, /* LEFTSHOULDER */ - {396, 36}, /* RIGHTSHOULDER */ - {154, 188}, /* DPAD_UP */ - {154, 249}, /* DPAD_DOWN */ - {116, 217}, /* DPAD_LEFT */ - {186, 217}, /* DPAD_RIGHT */ - {158, 0}, /* AUX1 */ - {208, 0}, /* AUX2 */ - {258, 0}, /* AUX3 */ - {308, 0}, /* AUX4 */ + {387, 167}, /* SDL_CONTROLLER_BUTTON_A */ + {431, 132}, /* SDL_CONTROLLER_BUTTON_B */ + {342, 132}, /* SDL_CONTROLLER_BUTTON_X */ + {389, 101}, /* SDL_CONTROLLER_BUTTON_Y */ + {174, 132}, /* SDL_CONTROLLER_BUTTON_BACK */ + {232, 128}, /* SDL_CONTROLLER_BUTTON_GUIDE */ + {289, 132}, /* SDL_CONTROLLER_BUTTON_START */ + {75, 154}, /* SDL_CONTROLLER_BUTTON_LEFTSTICK */ + {305, 230}, /* SDL_CONTROLLER_BUTTON_RIGHTSTICK */ + {77, 40}, /* SDL_CONTROLLER_BUTTON_LEFTSHOULDER */ + {396, 36}, /* SDL_CONTROLLER_BUTTON_RIGHTSHOULDER */ + {154, 188}, /* SDL_CONTROLLER_BUTTON_DPAD_UP */ + {154, 249}, /* SDL_CONTROLLER_BUTTON_DPAD_DOWN */ + {116, 217}, /* SDL_CONTROLLER_BUTTON_DPAD_LEFT */ + {186, 217}, /* SDL_CONTROLLER_BUTTON_DPAD_RIGHT */ + {232, 174}, /* SDL_CONTROLLER_BUTTON_MISC1 */ + {132, 135}, /* SDL_CONTROLLER_BUTTON_PADDLE1 */ + {330, 135}, /* SDL_CONTROLLER_BUTTON_PADDLE2 */ + {132, 175}, /* SDL_CONTROLLER_BUTTON_PADDLE3 */ + {330, 175}, /* SDL_CONTROLLER_BUTTON_PADDLE4 */ }; /* This is indexed by SDL_GameControllerAxis. */ static const struct { int x; int y; double angle; } axis_positions[] = { {74, 153, 270.0}, /* LEFTX */ - {74, 153, 0.0}, /* LEFTY */ + {74, 153, 0.0}, /* LEFTY */ {306, 231, 270.0}, /* RIGHTX */ - {306, 231, 0.0}, /* RIGHTY */ - {91, -20, 0.0}, /* TRIGGERLEFT */ - {375, -20, 0.0}, /* TRIGGERRIGHT */ + {306, 231, 0.0}, /* RIGHTY */ + {91, -20, 0.0}, /* TRIGGERLEFT */ + {375, -20, 0.0}, /* TRIGGERRIGHT */ }; SDL_Window *window = NULL; SDL_Renderer *screen = NULL; SDL_bool retval = SDL_FALSE; SDL_bool done = SDL_FALSE; -SDL_Texture *background, *button, *axis; +SDL_Texture *background_front, *background_back, *button, *axis; SDL_GameController *gamecontroller; static SDL_Texture * @@ -118,11 +119,7 @@ loop(void *arg) { SDL_Event event; int i; - - /* blank screen, set up for drawing this frame. */ - SDL_SetRenderDrawColor(screen, 0xFF, 0xFF, 0xFF, SDL_ALPHA_OPAQUE); - SDL_RenderClear(screen); - SDL_RenderCopy(screen, background, NULL, NULL); + SDL_bool showing_front = SDL_TRUE; while (SDL_PollEvent(&event)) { switch (event.type) { @@ -169,26 +166,46 @@ loop(void *arg) } } + if (gamecontroller) { + /* Show the back of the controller if the paddles are being held */ + for (i = SDL_CONTROLLER_BUTTON_PADDLE1; i <= SDL_CONTROLLER_BUTTON_PADDLE4; ++i) { + if (SDL_GameControllerGetButton(gamecontroller, (SDL_GameControllerButton)i) == SDL_PRESSED) { + showing_front = SDL_FALSE; + break; + } + } + } + + /* blank screen, set up for drawing this frame. */ + SDL_SetRenderDrawColor(screen, 0xFF, 0xFF, 0xFF, SDL_ALPHA_OPAQUE); + SDL_RenderClear(screen); + SDL_RenderCopy(screen, showing_front ? background_front : background_back, NULL, NULL); + if (gamecontroller) { /* Update visual controller state */ for (i = 0; i < SDL_CONTROLLER_BUTTON_MAX; ++i) { if (SDL_GameControllerGetButton(gamecontroller, (SDL_GameControllerButton)i) == SDL_PRESSED) { - const SDL_Rect dst = { button_positions[i].x, button_positions[i].y, 50, 50 }; - SDL_RenderCopyEx(screen, button, NULL, &dst, 0, NULL, SDL_FLIP_NONE); + SDL_bool on_front = (i < SDL_CONTROLLER_BUTTON_PADDLE1 || i > SDL_CONTROLLER_BUTTON_PADDLE4); + if (on_front == showing_front) { + const SDL_Rect dst = { button_positions[i].x, button_positions[i].y, 50, 50 }; + SDL_RenderCopyEx(screen, button, NULL, &dst, 0, NULL, SDL_FLIP_NONE); + } } } - for (i = 0; i < SDL_CONTROLLER_AXIS_MAX; ++i) { - const Sint16 deadzone = 8000; /* !!! FIXME: real deadzone */ - const Sint16 value = SDL_GameControllerGetAxis(gamecontroller, (SDL_GameControllerAxis)(i)); - if (value < -deadzone) { - const SDL_Rect dst = { axis_positions[i].x, axis_positions[i].y, 50, 50 }; - const double angle = axis_positions[i].angle; - SDL_RenderCopyEx(screen, axis, NULL, &dst, angle, NULL, SDL_FLIP_NONE); - } else if (value > deadzone) { - const SDL_Rect dst = { axis_positions[i].x, axis_positions[i].y, 50, 50 }; - const double angle = axis_positions[i].angle + 180.0; - SDL_RenderCopyEx(screen, axis, NULL, &dst, angle, NULL, SDL_FLIP_NONE); + if (showing_front) { + for (i = 0; i < SDL_CONTROLLER_AXIS_MAX; ++i) { + const Sint16 deadzone = 8000; /* !!! FIXME: real deadzone */ + const Sint16 value = SDL_GameControllerGetAxis(gamecontroller, (SDL_GameControllerAxis)(i)); + if (value < -deadzone) { + const SDL_Rect dst = { axis_positions[i].x, axis_positions[i].y, 50, 50 }; + const double angle = axis_positions[i].angle; + SDL_RenderCopyEx(screen, axis, NULL, &dst, angle, NULL, SDL_FLIP_NONE); + } else if (value > deadzone) { + const SDL_Rect dst = { axis_positions[i].x, axis_positions[i].y, 50, 50 }; + const double angle = axis_positions[i].angle + 180.0; + SDL_RenderCopyEx(screen, axis, NULL, &dst, angle, NULL, SDL_FLIP_NONE); + } } } @@ -321,11 +338,12 @@ main(int argc, char *argv[]) /* scale for platforms that don't give you the window size you asked for. */ SDL_RenderSetLogicalSize(screen, SCREEN_WIDTH, SCREEN_HEIGHT); - background = LoadTexture(screen, "controllermap.bmp", SDL_FALSE); + background_front = LoadTexture(screen, "controllermap.bmp", SDL_FALSE); + background_back = LoadTexture(screen, "controllermap_back.bmp", SDL_FALSE); button = LoadTexture(screen, "button.bmp", SDL_TRUE); axis = LoadTexture(screen, "axis.bmp", SDL_TRUE); - if (!background || !button || !axis) { + if (!background_front || !background_back || !button || !axis) { SDL_DestroyRenderer(screen); SDL_DestroyWindow(window); return 2; @@ -346,10 +364,6 @@ main(int argc, char *argv[]) #endif SDL_DestroyRenderer(screen); - screen = NULL; - background = NULL; - button = NULL; - axis = NULL; SDL_DestroyWindow(window); SDL_QuitSubSystem(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER);