diff options
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++) { |
