From cdcee78fcbb4bdb84629e671bf1d57c39fc45937 Mon Sep 17 00:00:00 2001 From: Grublady Date: Wed, 5 Mar 2025 16:10:33 -0500 Subject: [PATCH] Swap Nintendo face buttons on macOS --- drivers/apple/joypad_apple.h | 1 + drivers/apple/joypad_apple.mm | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/drivers/apple/joypad_apple.h b/drivers/apple/joypad_apple.h index 909648e253d..d89707c03d7 100644 --- a/drivers/apple/joypad_apple.h +++ b/drivers/apple/joypad_apple.h @@ -43,6 +43,7 @@ struct GameController { RumbleContext *rumble_context API_AVAILABLE(macos(11.0), ios(14.0), tvos(14.0)) = nil; NSInteger ff_effect_timestamp = 0; bool force_feedback = false; + bool nintendo_button_layout = false; GameController(int p_joy_id, GCController *p_controller); ~GameController(); diff --git a/drivers/apple/joypad_apple.mm b/drivers/apple/joypad_apple.mm index 148ec4cb271..e14fc96a284 100644 --- a/drivers/apple/joypad_apple.mm +++ b/drivers/apple/joypad_apple.mm @@ -144,6 +144,12 @@ GameController::GameController(int p_joy_id, GCController *p_controller) : } } + if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)) { + if ([controller.productCategory isEqualToString:@"Switch Pro Controller"] || [controller.productCategory isEqualToString:@"Nintendo Switch Joy-Con (L/R)"]) { + nintendo_button_layout = true; + } + } + int l_joy_id = joy_id; auto BUTTON = [l_joy_id](JoyButton p_button) { @@ -155,10 +161,18 @@ GameController::GameController(int p_joy_id, GCController *p_controller) : if (controller.extendedGamepad != nil) { GCExtendedGamepad *gamepad = controller.extendedGamepad; - gamepad.buttonA.pressedChangedHandler = BUTTON(JoyButton::A); - gamepad.buttonB.pressedChangedHandler = BUTTON(JoyButton::B); - gamepad.buttonX.pressedChangedHandler = BUTTON(JoyButton::X); - gamepad.buttonY.pressedChangedHandler = BUTTON(JoyButton::Y); + if (nintendo_button_layout) { + gamepad.buttonA.pressedChangedHandler = BUTTON(JoyButton::B); + gamepad.buttonB.pressedChangedHandler = BUTTON(JoyButton::A); + gamepad.buttonX.pressedChangedHandler = BUTTON(JoyButton::Y); + gamepad.buttonY.pressedChangedHandler = BUTTON(JoyButton::X); + } else { + gamepad.buttonA.pressedChangedHandler = BUTTON(JoyButton::A); + gamepad.buttonB.pressedChangedHandler = BUTTON(JoyButton::B); + gamepad.buttonX.pressedChangedHandler = BUTTON(JoyButton::X); + gamepad.buttonY.pressedChangedHandler = BUTTON(JoyButton::Y); + } + gamepad.leftShoulder.pressedChangedHandler = BUTTON(JoyButton::LEFT_SHOULDER); gamepad.rightShoulder.pressedChangedHandler = BUTTON(JoyButton::RIGHT_SHOULDER); gamepad.dpad.up.pressedChangedHandler = BUTTON(JoyButton::DPAD_UP);