@@ -68,13 +68,13 @@ internal final class MFIGamePadInterpreter: GamePadInterpreter {
6868 guard let gcController = gamePad. identifier as? GCController else { return }
6969
7070 switch gcController. productCategory {
71- case " DualShock 4 " , " DualSense " :
71+ case GCProductCategoryDualShock4 , GCProductCategoryDualSense :
7272 gamePad. symbols = . sonyPlaystation
73- case " Xbox One " :
73+ case GCProductCategoryXboxOne :
7474 gamePad. symbols = . microsoftXbox
7575 case " Switch Pro Controller " :
7676 gamePad. symbols = . nintendoSwitch
77- case " MFi " :
77+ case GCProductCategoryMFi :
7878 gamePad. symbols = . appleMFI
7979 default :
8080 gamePad. symbols = . unknown
@@ -99,18 +99,45 @@ internal final class MFIGamePadInterpreter: GamePadInterpreter {
9999
100100 gamePad. dpad. right. isPressed = gcGamePad. dpad. right. isPressed
101101 gamePad. dpad. right. value = gcGamePad. dpad. right. value
102-
103- gamePad. button. north. isPressed = gcGamePad. buttonY. isPressed
104- gamePad. button. north. value = gcGamePad. buttonY. value
105-
106- gamePad. button. east. isPressed = gcGamePad. buttonB. isPressed
107- gamePad. button. east. value = gcGamePad. buttonB. value
108-
109- gamePad. button. south. isPressed = gcGamePad. buttonA. isPressed
110- gamePad. button. south. value = gcGamePad. buttonA. value
111102
112- gamePad. button. west. isPressed = gcGamePad. buttonX. isPressed
113- gamePad. button. west. value = gcGamePad. buttonX. value
103+ switch gamePad. symbols {
104+ case . nintendoSwitch:
105+ // At some point the nintendo gamepad face button layout changed.
106+ // This could be becuase of Apple meddling,
107+ // or a firmware change from Nintendo
108+ // or Nintendo meddling with Apple.
109+ // It's unclear exactly when this change was made. But it's fucking stupid...
110+ // We'll just assume the change happened in 2024.
111+ if #available( macOS 15 , iOS 18 , tvOS 18 , macCatalyst 18 , * ) {
112+ // Nintendo has buttons in different spots
113+ gamePad. button. north. isPressed = gcGamePad. buttonX. isPressed
114+ gamePad. button. north. value = gcGamePad. buttonX. value
115+
116+ gamePad. button. east. isPressed = gcGamePad. buttonA. isPressed
117+ gamePad. button. east. value = gcGamePad. buttonA. value
118+
119+ gamePad. button. south. isPressed = gcGamePad. buttonB. isPressed
120+ gamePad. button. south. value = gcGamePad. buttonB. value
121+
122+ gamePad. button. west. isPressed = gcGamePad. buttonY. isPressed
123+ gamePad. button. west. value = gcGamePad. buttonY. value
124+ } else {
125+ // Use the default layout if the OS is older
126+ fallthrough
127+ }
128+ default : // Only Nintendo fucks up the layout, every other gamepad is physically identical
129+ gamePad. button. north. isPressed = gcGamePad. buttonY. isPressed
130+ gamePad. button. north. value = gcGamePad. buttonY. value
131+
132+ gamePad. button. east. isPressed = gcGamePad. buttonB. isPressed
133+ gamePad. button. east. value = gcGamePad. buttonB. value
134+
135+ gamePad. button. south. isPressed = gcGamePad. buttonA. isPressed
136+ gamePad. button. south. value = gcGamePad. buttonA. value
137+
138+ gamePad. button. west. isPressed = gcGamePad. buttonX. isPressed
139+ gamePad. button. west. value = gcGamePad. buttonX. value
140+ }
114141
115142 gamePad. shoulder. left. isPressed = gcGamePad. leftShoulder. isPressed
116143 gamePad. shoulder. left. value = gcGamePad. leftShoulder. value
0 commit comments