diff options
| author | SND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2014-04-08 02:33:19 +0000 |
|---|---|---|
| committer | SND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97> | 2014-04-08 02:33:19 +0000 |
| commit | c875a3566e340e366553beb2dcd6b2bcf4d5ab18 (patch) | |
| tree | 97dcfbe538af5f282135a27cf889ed32b1d9d54d /plugins/dfinput/sdljoy.c | |
| parent | 0d4ea9238b154a30e8713c7d00d7b6d1b0050d5c (diff) | |
| download | pcsxr-c875a3566e340e366553beb2dcd6b2bcf4d5ab18.tar.gz | |
DFInput: Implement SDL2 GameController support.
This change allows the user to use SDL2’s GameController API instead of the Joystick API.
The Game Controller API maps the buttons similar to an Xbox 360 controller, so some tricky mapping needed to be done.
Note that it currently only supports OS X.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@89828 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'plugins/dfinput/sdljoy.c')
| -rwxr-xr-x | plugins/dfinput/sdljoy.c | 180 |
1 files changed, 129 insertions, 51 deletions
diff --git a/plugins/dfinput/sdljoy.c b/plugins/dfinput/sdljoy.c index 2a763935..ee139517 100755 --- a/plugins/dfinput/sdljoy.c +++ b/plugins/dfinput/sdljoy.c @@ -18,44 +18,44 @@ #include "pad.h" -#if SDL_VERSION_ATLEAST(2,0,0) -static SDL_HapticEffect haptic_rumbleEffect; -#endif - void JoyInitHaptic() { #if SDL_VERSION_ATLEAST(2,0,0) - uint8_t i; + uint8_t i; //unsigned int haptic_query = 0; - for (i = 0; i < 2; i++) - { - if (g.PadState[i].JoyDev && SDL_JoystickIsHaptic(g.PadState[i].JoyDev)) - { - if (g.PadState[i].haptic != NULL) - { - SDL_HapticClose(g.PadState[i].haptic); - g.PadState[i].haptic = NULL; - } - - g.PadState[i].haptic = SDL_HapticOpenFromJoystick(g.PadState[i].JoyDev); - if (g.PadState[i].haptic == NULL) - continue; - - if (SDL_HapticRumbleSupported(g.PadState[i].haptic) == SDL_FALSE) - { - printf("\nRumble not supported\n"); - g.PadState[i].haptic = NULL; - continue; - } - - if (SDL_HapticRumbleInit(g.PadState[i].haptic) != 0) - { - printf("\nFailed to initialize rumble: %s\n", SDL_GetError()); - g.PadState[i].haptic = NULL; - continue; - } - } - } + for (i = 0; i < 2; i++) + { + SDL_Joystick *curJoy = g.PadState[i].JoyDev; + if (!curJoy && g.PadState[i].GCDev) { + curJoy = SDL_GameControllerGetJoystick(g.PadState[i].GCDev); + } + if (SDL_JoystickIsHaptic(curJoy)) + { + if (g.PadState[i].haptic != NULL) + { + SDL_HapticClose(g.PadState[i].haptic); + g.PadState[i].haptic = NULL; + } + + g.PadState[i].haptic = SDL_HapticOpenFromJoystick(curJoy); + if (g.PadState[i].haptic == NULL) + continue; + + if (SDL_HapticRumbleSupported(g.PadState[i].haptic) == SDL_FALSE) + { + printf("\nRumble not supported\n"); + g.PadState[i].haptic = NULL; + continue; + } + + if (SDL_HapticRumbleInit(g.PadState[i].haptic) != 0) + { + printf("\nFailed to initialize rumble: %s\n", SDL_GetError()); + g.PadState[i].haptic = NULL; + continue; + } + } + } #endif } @@ -84,14 +84,22 @@ int JoyHapticRumble(int pad, uint32_t low, uint32_t high) void InitSDLJoy() { uint8_t i; - uint8_t emukeydev; g.PadState[0].JoyKeyStatus = 0xFFFF; g.PadState[1].JoyKeyStatus = 0xFFFF; for (i = 0; i < 2; i++) { if (g.cfg.PadDef[i].DevNum >= 0) { +#if SDL_VERSION_ATLEAST(2,0,0) + if (g.cfg.PadDef[i].UseSDL2) { + g.PadState[i].GCDev = SDL_GameControllerOpen(g.cfg.PadDef[i].DevNum); + } + + if (!g.PadState[i].GCDev) { + g.PadState[i].JoyDev = SDL_JoystickOpen(g.cfg.PadDef[i].DevNum); + } +#else g.PadState[i].JoyDev = SDL_JoystickOpen(g.cfg.PadDef[i].DevNum); - +#endif // Saves an extra call to SDL joystick open if (g.cfg.E.DevNum == g.cfg.PadDef[i].DevNum) { g.cfg.E.EmuKeyDev = g.PadState[i].JoyDev; @@ -106,10 +114,10 @@ void InitSDLJoy() { } #if SDL_VERSION_ATLEAST(2,0,0) - if (has_haptic) - { - JoyInitHaptic(); - } + if (has_haptic) + { + JoyInitHaptic(); + } #endif if (g.cfg.E.EmuKeyDev == 0 && g.cfg.E.DevNum >= 0) { @@ -117,6 +125,9 @@ void InitSDLJoy() { } SDL_JoystickEventState(SDL_IGNORE); +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_GameControllerEventState(SDL_IGNORE); +#endif InitAnalog(); } @@ -126,21 +137,31 @@ void DestroySDLJoy() { if (SDL_WasInit(SDL_INIT_JOYSTICK)) { for (i = 0; i < 2; i++) { - if (g.PadState[i].JoyDev != NULL) { #if SDL_VERSION_ATLEAST(2,0,0) - if (g.PadState[i].haptic != NULL) - { - SDL_HapticClose(g.PadState[i].haptic); - g.PadState[i].haptic = NULL; - } -#endif + if (g.PadState[i].JoyDev != NULL || g.PadState[i].GCDev != NULL) { + if (g.PadState[i].haptic != NULL) { + SDL_HapticClose(g.PadState[i].haptic); + g.PadState[i].haptic = NULL; + } + if (g.PadState[i].GCDev != NULL) { + SDL_GameControllerClose(g.PadState[i].GCDev); + } else { + SDL_JoystickClose(g.PadState[i].JoyDev); + } + } +#else + if (g.PadState[i].JoyDev != NULL) { SDL_JoystickClose(g.PadState[i].JoyDev); } +#endif } } for (i = 0; i < 2; i++) { g.PadState[i].JoyDev = NULL; +#if SDL_VERSION_ATLEAST(2,0,0) + g.PadState[i].GCDev = NULL; +#endif } g.cfg.E.EmuKeyDev = NULL; } @@ -167,14 +188,14 @@ static void bup(int pad, int bit) void CheckJoy() { uint8_t i, j, n; +#if SDL_VERSION_ATLEAST(2,0,0) + SDL_GameControllerUpdate(); +#endif SDL_JoystickUpdate(); for (i = 0; i < 2; i++) { - if (g.PadState[i].JoyDev == NULL) { - continue; - } - + if (g.PadState[i].JoyDev != NULL) { g.PadState[i].JoyKeyStatus = ~0; for (j = 0; j < DKEY_TOTAL; j++) { switch (g.cfg.PadDef[i].KeyDef[j].JoyEvType) { @@ -219,6 +240,63 @@ void CheckJoy() { } } } + +#if SDL_VERSION_ATLEAST(2,0,0) + if (g.PadState[i].GCDev != NULL) { + g.PadState[i].JoyKeyStatus = ~0; + for (j = 0; j < DKEY_TOTAL; j++) { + Sint16 axis2; + switch (j) { + case DKEY_SELECT: + case DKEY_L3: + case DKEY_R3: + case DKEY_START: + case DKEY_UP: + case DKEY_RIGHT: + case DKEY_DOWN: + case DKEY_LEFT: + case DKEY_L1: + case DKEY_R1: + case DKEY_TRIANGLE: + case DKEY_CIRCLE: + case DKEY_CROSS: + case DKEY_SQUARE: + case DKEY_ANALOG: + + if (SDL_GameControllerGetButton(g.PadState[i].GCDev, controllerMap[j])) { + bdown(i, j); + } else { + bup(i, j); + } + break; + + case DKEY_L2: + axis2 = SDL_GameControllerGetAxis(g.PadState[i].GCDev, SDL_CONTROLLER_AXIS_TRIGGERLEFT); + if (axis2 > 0) { + bdown(i, j); + } else { + bup(i, j); + } + + break; + + case DKEY_R2: + axis2 = SDL_GameControllerGetAxis(g.PadState[i].GCDev, SDL_CONTROLLER_AXIS_TRIGGERRIGHT); + if (axis2 > 0) { + bdown(i, j); + } else { + bup(i, j); + } + + break; + + default: + break; + } + } + } +#endif + } // Check for emulator button states for (i=(g.cfg.E.EmuKeyDev == NULL ? EMU_TOTAL : 0) ; i < EMU_TOTAL ; i++) { |
