From 5c1bf36d6b8f661457ae081944e8cd11ab035469 Mon Sep 17 00:00:00 2001 From: GaryOderNichts <12049776+GaryOderNichts@users.noreply.github.com> Date: Tue, 13 Apr 2021 11:57:14 +0200 Subject: [PATCH] Add support for swapping buttons --- moonlight.conf | 5 ++++- src/config.c | 7 +++++++ src/wiiu/input.c | 49 ++++++++++++++++++++++++++++++++++++------------ 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/moonlight.conf b/moonlight.conf index 9c101d75..ee02d7d0 100644 --- a/moonlight.conf +++ b/moonlight.conf @@ -7,7 +7,10 @@ #fps = 60 ## Disables the gamepad so the other controllers are mapped to players 1 to 4 -#disable_gamepad=true +#disable_gamepad = true + +## Swaps the buttons so they match the xbox controller layout +#swap_buttons = true ## Bitrate depends by default on resolution and fps ## Set to -1 to enable default diff --git a/src/config.c b/src/config.c index c6fcce08..6e01bc23 100644 --- a/src/config.c +++ b/src/config.c @@ -33,6 +33,9 @@ #ifdef __WIIU__ extern int disable_gamepad; +extern int swap_buttons; + +extern ssize_t getline(char **buf, size_t *bufsiz, FILE *fp); #define MOONLIGHT_WIIU_PATH "/vol/external01/wiiu/apps/moonlight" #endif @@ -79,6 +82,7 @@ static struct option long_options[] = { {"debug", no_argument, NULL, 'Z'}, #ifdef __WIIU__ {"disable_gamepad", no_argument, NULL, 'A'}, + {"swap_buttons", no_argument, NULL, 'B'}, #endif {0, 0, 0, 0}, }; @@ -248,6 +252,9 @@ static void parse_argument(int c, char* value, PCONFIGURATION config) { case 'A': disable_gamepad = true; break; + case 'B': + swap_buttons = true; + break; #endif case 1: if (config->action == NULL) diff --git a/src/wiiu/input.c b/src/wiiu/input.c index 8209eec8..e187c8d8 100644 --- a/src/wiiu/input.c +++ b/src/wiiu/input.c @@ -5,6 +5,7 @@ #include int disable_gamepad = 0; +int swap_buttons = 0; void wiiu_input_init(void) { @@ -26,10 +27,18 @@ void wiiu_input_update(void) { uint32_t btns = vpad.hold; short buttonFlags = 0; #define CHECKBTN(v, f) if (btns & v) buttonFlags |= f; - CHECKBTN(VPAD_BUTTON_A, A_FLAG); - CHECKBTN(VPAD_BUTTON_B, B_FLAG); - CHECKBTN(VPAD_BUTTON_X, X_FLAG); - CHECKBTN(VPAD_BUTTON_Y, Y_FLAG); + if (swap_buttons) { + CHECKBTN(VPAD_BUTTON_A, B_FLAG); + CHECKBTN(VPAD_BUTTON_B, A_FLAG); + CHECKBTN(VPAD_BUTTON_X, Y_FLAG); + CHECKBTN(VPAD_BUTTON_Y, X_FLAG); + } + else { + CHECKBTN(VPAD_BUTTON_A, A_FLAG); + CHECKBTN(VPAD_BUTTON_B, B_FLAG); + CHECKBTN(VPAD_BUTTON_X, X_FLAG); + CHECKBTN(VPAD_BUTTON_Y, Y_FLAG); + } CHECKBTN(VPAD_BUTTON_UP, UP_FLAG); CHECKBTN(VPAD_BUTTON_DOWN, DOWN_FLAG); CHECKBTN(VPAD_BUTTON_LEFT, LEFT_FLAG); @@ -58,10 +67,18 @@ void wiiu_input_update(void) { uint32_t btns = kpad_data.pro.hold; short buttonFlags = 0; #define CHECKBTN(v, f) if (btns & v) buttonFlags |= f; - CHECKBTN(WPAD_PRO_BUTTON_A, A_FLAG); - CHECKBTN(WPAD_PRO_BUTTON_B, B_FLAG); - CHECKBTN(WPAD_PRO_BUTTON_X, X_FLAG); - CHECKBTN(WPAD_PRO_BUTTON_Y, Y_FLAG); + if (swap_buttons) { + CHECKBTN(WPAD_PRO_BUTTON_A, B_FLAG); + CHECKBTN(WPAD_PRO_BUTTON_B, A_FLAG); + CHECKBTN(WPAD_PRO_BUTTON_X, Y_FLAG); + CHECKBTN(WPAD_PRO_BUTTON_Y, X_FLAG); + } + else { + CHECKBTN(WPAD_PRO_BUTTON_A, A_FLAG); + CHECKBTN(WPAD_PRO_BUTTON_B, B_FLAG); + CHECKBTN(WPAD_PRO_BUTTON_X, X_FLAG); + CHECKBTN(WPAD_PRO_BUTTON_Y, Y_FLAG); + } CHECKBTN(WPAD_PRO_BUTTON_UP, UP_FLAG); CHECKBTN(WPAD_PRO_BUTTON_DOWN, DOWN_FLAG); CHECKBTN(WPAD_PRO_BUTTON_LEFT, LEFT_FLAG); @@ -84,10 +101,18 @@ void wiiu_input_update(void) { uint32_t btns = kpad_data.classic.hold; short buttonFlags = 0; #define CHECKBTN(v, f) if (btns & v) buttonFlags |= f; - CHECKBTN(WPAD_CLASSIC_BUTTON_A, A_FLAG); - CHECKBTN(WPAD_CLASSIC_BUTTON_B, B_FLAG); - CHECKBTN(WPAD_CLASSIC_BUTTON_X, X_FLAG); - CHECKBTN(WPAD_CLASSIC_BUTTON_Y, Y_FLAG); + if (swap_buttons) { + CHECKBTN(WPAD_CLASSIC_BUTTON_A, B_FLAG); + CHECKBTN(WPAD_CLASSIC_BUTTON_B, A_FLAG); + CHECKBTN(WPAD_CLASSIC_BUTTON_X, Y_FLAG); + CHECKBTN(WPAD_CLASSIC_BUTTON_Y, X_FLAG); + } + else { + CHECKBTN(WPAD_CLASSIC_BUTTON_A, A_FLAG); + CHECKBTN(WPAD_CLASSIC_BUTTON_B, B_FLAG); + CHECKBTN(WPAD_CLASSIC_BUTTON_X, X_FLAG); + CHECKBTN(WPAD_CLASSIC_BUTTON_Y, Y_FLAG); + } CHECKBTN(WPAD_CLASSIC_BUTTON_UP, UP_FLAG); CHECKBTN(WPAD_CLASSIC_BUTTON_DOWN, DOWN_FLAG); CHECKBTN(WPAD_CLASSIC_BUTTON_LEFT, LEFT_FLAG);