# HG changeset patch # User Ethan Lee # Date 1577764782 18000 # Mon Dec 30 22:59:42 2019 -0500 # Node ID dd932a9956ae223afc7e92a7a378b5062ccec1bd # Parent 4ad8a63ec49abce4c4415c094377f400a450506a SDL_hidapi_gamecube: Only swap B/X with USE_BUTTON_LABELS diff -r 4ad8a63ec49a -r dd932a9956ae src/joystick/hidapi/SDL_hidapi_gamecube.c --- a/src/joystick/hidapi/SDL_hidapi_gamecube.c Mon Dec 30 17:56:56 2019 -0800 +++ b/src/joystick/hidapi/SDL_hidapi_gamecube.c Mon Dec 30 22:59:42 2019 -0500 @@ -31,6 +31,7 @@ #include "SDL_gamecontroller.h" #include "../SDL_sysjoystick.h" #include "SDL_hidapijoystick_c.h" +#include "../../SDL_hints_c.h" #ifdef SDL_JOYSTICK_HIDAPI_GAMECUBE @@ -47,6 +48,7 @@ Uint32 rumbleExpiration[MAX_CONTROLLERS]; /* Without this variable, hid_write starts to lag a TON */ SDL_bool rumbleUpdate; + SDL_bool m_bUseButtonLabels; } SDL_DriverGameCube_Context; static SDL_bool @@ -95,6 +97,27 @@ return C + (D - C) * (val - A) / (B - A); } +static void SDLCALL SDL_GameControllerButtonReportingHintChanged(void *userdata, const char *name, const char *oldValue, const char *hint) +{ + SDL_DriverGameCube_Context *ctx = (SDL_DriverGameCube_Context *)userdata; + ctx->m_bUseButtonLabels = SDL_GetStringBoolean(hint, SDL_TRUE); +} + +static Uint8 RemapButton(SDL_DriverGameCube_Context *ctx, Uint8 button) +{ + if (ctx->m_bUseButtonLabels) { + switch (button) { + case SDL_CONTROLLER_BUTTON_B: + return SDL_CONTROLLER_BUTTON_X; + case SDL_CONTROLLER_BUTTON_X: + return SDL_CONTROLLER_BUTTON_B; + default: + break; + } + } + return button; +} + static SDL_bool HIDAPI_DriverGameCube_InitDevice(SDL_HIDAPI_Device *device) { @@ -164,6 +187,9 @@ } } + SDL_AddHintCallback(SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS, + SDL_GameControllerButtonReportingHintChanged, ctx); + return SDL_TRUE; error: @@ -244,12 +270,12 @@ #define READ_BUTTON(off, flag, button) \ SDL_PrivateJoystickButton( \ joystick, \ - button, \ + RemapButton(ctx, button), \ (curSlot[off] & flag) ? SDL_PRESSED : SDL_RELEASED \ ); READ_BUTTON(1, 0x01, 0) /* A */ - READ_BUTTON(1, 0x04, 1) /* B */ - READ_BUTTON(1, 0x02, 2) /* X */ + READ_BUTTON(1, 0x02, 1) /* B */ + READ_BUTTON(1, 0x04, 2) /* X */ READ_BUTTON(1, 0x08, 3) /* Y */ READ_BUTTON(1, 0x10, 4) /* DPAD_LEFT */ READ_BUTTON(1, 0x20, 5) /* DPAD_RIGHT */ @@ -377,9 +403,14 @@ static void HIDAPI_DriverGameCube_FreeDevice(SDL_HIDAPI_Device *device) { + SDL_DriverGameCube_Context *ctx = (SDL_DriverGameCube_Context *)device->context; + hid_close(device->dev); device->dev = NULL; + SDL_DelHintCallback(SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS, + SDL_GameControllerButtonReportingHintChanged, ctx); + SDL_free(device->context); device->context = NULL; }