@@ -29,6 +29,7 @@
#include " SDL_haptic.h"
#include " SDL_joystick.h"
#include " SDL_gamecontroller.h"
#include " ../../SDL_hints_c.h"
#include " ../SDL_sysjoystick.h"
#include " SDL_hidapijoystick_c.h"
#include " SDL_hidapi_rumble.h"
@@ -47,6 +48,7 @@ typedef struct {
Uint8 rumble[1 +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 @@ static float RemapVal(float val, float A, float B, float C, float D)
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 @@ HIDAPI_DriverGameCube_InitDevice(SDL_HIDAPI_Device *device)
}
}
SDL_AddHintCallback (SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS,
SDL_GameControllerButtonReportingHintChanged, ctx);
return SDL_TRUE;
error:
@@ -244,12 +270,12 @@ HIDAPI_DriverGameCube_UpdateDevice(SDL_HIDAPI_Device *device)
#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 */
@@ -352,9 +378,14 @@ HIDAPI_DriverGameCube_CloseJoystick(SDL_HIDAPI_Device *device, SDL_Joystick *joy
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 ;
}