#include "controls/devices/kbcontroller.h" #if defined(RETROFW) #define HAS_KBCTRL 1 #define KBCTRL_BUTTON_DPAD_LEFT SDLK_LEFT #define KBCTRL_BUTTON_DPAD_RIGHT SDLK_RIGHT #define KBCTRL_BUTTON_DPAD_UP SDLK_UP #define KBCTRL_BUTTON_DPAD_DOWN SDLK_DOWN #define KBCTRL_BUTTON_B SDLK_LCTRL #define KBCTRL_BUTTON_A SDLK_LALT #define KBCTRL_BUTTON_Y SDLK_SPACE #define KBCTRL_BUTTON_X SDLK_LSHIFT #define KBCTRL_BUTTON_RIGHTSHOULDER SDLK_BACKSPACE #define KBCTRL_BUTTON_LEFTSHOULDER SDLK_TAB #define KBCTRL_BUTTON_START SDLK_RETURN #define KBCTRL_BUTTON_BACK SDLK_ESCAPE #define KBCTRL_MODIFIER_KEY SDLK_END // The suspend key on RG300 #endif #if HAS_KBCTRL == 1 #include "sdl2_to_1_2_backports.h" #include "sdl_compat.h" #include "stubs.h" namespace dvl { namespace { bool IsModifierKey() { #ifdef KBCTRL_MODIFIER_KEY return SDLC_GetKeyState()[KBCTRL_MODIFIER_KEY]; #else return false; #endif } } // namespace ControllerButton KbCtrlToControllerButton(const SDL_Event &event) { switch (event.type) { case SDL_KEYDOWN: case SDL_KEYUP: switch (event.key.keysym.sym) { #ifdef KBCTRL_BUTTON_A case KBCTRL_BUTTON_A: return ControllerButton::BUTTON_A; #endif #ifdef KBCTRL_BUTTON_B case KBCTRL_BUTTON_B: return ControllerButton::BUTTON_B; #endif #ifdef KBCTRL_BUTTON_X case KBCTRL_BUTTON_X: if (IsModifierKey()) return ControllerButton::BUTTON_LEFTSTICK; return ControllerButton::BUTTON_X; #endif #ifdef KBCTRL_BUTTON_Y case KBCTRL_BUTTON_Y: if (IsModifierKey()) return ControllerButton::BUTTON_RIGHTSTICK; return ControllerButton::BUTTON_Y; #endif #ifdef KBCTRL_BUTTON_LEFTSTICK case KBCTRL_BUTTON_LEFTSTICK: return ControllerButton::BUTTON_LEFTSTICK; #endif #ifdef KBCTRL_BUTTON_RIGHTSTICK case KBCTRL_BUTTON_RIGHTSTICK: return ControllerButton::BUTTON_RIGHTSTICK; #endif #ifdef KBCTRL_BUTTON_LEFTSHOULDER case KBCTRL_BUTTON_LEFTSHOULDER: if (IsModifierKey()) return ControllerButton::AXIS_TRIGGERLEFT; return ControllerButton::BUTTON_LEFTSHOULDER; #endif #ifdef KBCTRL_BUTTON_RIGHTSHOULDER case KBCTRL_BUTTON_RIGHTSHOULDER: if (IsModifierKey()) return ControllerButton::AXIS_TRIGGERRIGHT; return ControllerButton::BUTTON_RIGHTSHOULDER; #endif #ifdef KBCTRL_BUTTON_START case KBCTRL_BUTTON_START: return ControllerButton::BUTTON_START; #endif #ifdef KBCTRL_BUTTON_BACK case KBCTRL_BUTTON_BACK: return ControllerButton::BUTTON_BACK; #endif #ifdef KBCTRL_BUTTON_DPAD_UP case KBCTRL_BUTTON_DPAD_UP: return ControllerButton::BUTTON_DPAD_UP; #endif #ifdef KBCTRL_BUTTON_DPAD_DOWN case KBCTRL_BUTTON_DPAD_DOWN: return ControllerButton::BUTTON_DPAD_DOWN; #endif #ifdef KBCTRL_BUTTON_DPAD_LEFT case KBCTRL_BUTTON_DPAD_LEFT: return ControllerButton::BUTTON_DPAD_LEFT; #endif #ifdef KBCTRL_BUTTON_DPAD_RIGHT case KBCTRL_BUTTON_DPAD_RIGHT: return ControllerButton::BUTTON_DPAD_RIGHT; #endif default: return ControllerButton::NONE; } default: return ControllerButton::NONE; } } namespace { int ControllerButtonToKbCtrlKeyCode(ControllerButton button) { if (button == ControllerButton::AXIS_TRIGGERLEFT || button == ControllerButton::AXIS_TRIGGERRIGHT) UNIMPLEMENTED(); switch (button) { #ifdef KBCTRL_BUTTON_A case ControllerButton::BUTTON_A: return KBCTRL_BUTTON_A; #endif #ifdef KBCTRL_BUTTON_B case ControllerButton::BUTTON_B: return KBCTRL_BUTTON_B; #endif #ifdef KBCTRL_BUTTON_X case ControllerButton::BUTTON_X: return KBCTRL_BUTTON_X; #endif #ifdef KBCTRL_BUTTON_Y case ControllerButton::BUTTON_Y: return KBCTRL_BUTTON_Y; #endif #ifdef KBCTRL_BUTTON_BACK case ControllerButton::BUTTON_BACK: return KBCTRL_BUTTON_BACK; #endif #ifdef KBCTRL_BUTTON_START case ControllerButton::BUTTON_START: return KBCTRL_BUTTON_START; #endif #ifdef KBCTRL_BUTTON_LEFTSTICK case ControllerButton::BUTTON_LEFTSTICK: return KBCTRL_BUTTON_LEFTSTICK; #endif #ifdef KBCTRL_BUTTON_RIGHTSTICK case ControllerButton::BUTTON_RIGHTSTICK: return KBCTRL_BUTTON_RIGHTSTICK; #endif #ifdef KBCTRL_BUTTON_LEFTSHOULDER case ControllerButton::BUTTON_LEFTSHOULDER: return KBCTRL_BUTTON_LEFTSHOULDER; #endif #ifdef KBCTRL_BUTTON_RIGHTSHOULDER case ControllerButton::BUTTON_RIGHTSHOULDER: return KBCTRL_BUTTON_RIGHTSHOULDER; #endif #ifdef KBCTRL_BUTTON_DPAD_UP case ControllerButton::BUTTON_DPAD_UP: return KBCTRL_BUTTON_DPAD_UP; #endif #ifdef KBCTRL_BUTTON_DPAD_DOWN case ControllerButton::BUTTON_DPAD_DOWN: return KBCTRL_BUTTON_DPAD_DOWN; #endif #ifdef KBCTRL_BUTTON_DPAD_LEFT case ControllerButton::BUTTON_DPAD_LEFT: return KBCTRL_BUTTON_DPAD_LEFT; #endif #ifdef KBCTRL_BUTTON_DPAD_RIGHT case ControllerButton::BUTTON_DPAD_RIGHT: return KBCTRL_BUTTON_DPAD_RIGHT; #endif default: return -1; } } } // namespace bool IsKbCtrlButtonPressed(ControllerButton button) { int key_code = ControllerButtonToKbCtrlKeyCode(button); if (key_code == -1) return false; #ifndef USE_SDL1 return SDL_GetKeyboardState(nullptr)[SDL_GetScancodeFromKey(key_code)]; #else return SDL_GetKeyState(nullptr)[key_code]; #endif } } // namespace dvl #endif