You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

230 lines
5.9 KiB

#include "controls/devices/kbcontroller.h"
#if HAS_KBCTRL == 1
#include "controls/controller_motion.h"
#include "sdl2_to_1_2_backports.h"
#include "sdl_compat.h"
#include "stubs.h"
namespace dvl {
namespace {
bool IsModifierKey()
{
#ifdef KBCTRL_BUTTON_BACK
return SDLC_GetKeyState()[KBCTRL_BUTTON_BACK];
#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_IGNORE_1
case KBCTRL_IGNORE_1:
return ControllerButton::IGNORE;
#endif
#ifdef KBCTRL_BUTTON_A
case KBCTRL_BUTTON_A:
return ControllerButton::BUTTON_A;
#endif
#ifdef KBCTRL_BUTTON_B
case KBCTRL_BUTTON_B: // Right button
return ControllerButton::BUTTON_B;
#endif
#ifdef KBCTRL_BUTTON_X
case KBCTRL_BUTTON_X: // Left button
return ControllerButton::BUTTON_X;
#endif
#ifdef KBCTRL_BUTTON_Y
case KBCTRL_BUTTON_Y:
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:
if (IsModifierKey())
return ControllerButton::IGNORE;
return ControllerButton::BUTTON_DPAD_UP;
#endif
#ifdef KBCTRL_BUTTON_DPAD_DOWN
case KBCTRL_BUTTON_DPAD_DOWN:
if (IsModifierKey())
return ControllerButton::IGNORE;
return ControllerButton::BUTTON_DPAD_DOWN;
#endif
#ifdef KBCTRL_BUTTON_DPAD_LEFT
case KBCTRL_BUTTON_DPAD_LEFT:
if (IsModifierKey())
return ControllerButton::IGNORE;
return ControllerButton::BUTTON_DPAD_LEFT;
#endif
#ifdef KBCTRL_BUTTON_DPAD_RIGHT
case KBCTRL_BUTTON_DPAD_RIGHT:
if (IsModifierKey())
return ControllerButton::IGNORE;
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;
}
}
bool IsButtonPressed(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
bool IsKbCtrlButtonPressed(ControllerButton button)
{
if (IsModifierKey() && (button == ControllerButton::BUTTON_DPAD_UP || button == ControllerButton::BUTTON_DPAD_DOWN || button == ControllerButton::BUTTON_DPAD_LEFT || button == ControllerButton::BUTTON_DPAD_RIGHT))
return false;
return IsButtonPressed(button);
}
bool ProcessKbCtrlAxisMotion(const SDL_Event &event)
{
if (!IsModifierKey()) {
rightStickX = 0;
rightStickY = 0;
return false;
}
if (event.type != SDL_KEYUP && event.type != SDL_KEYDOWN)
return false;
const auto sym = event.key.keysym.sym;
if (sym != KBCTRL_BUTTON_DPAD_UP && sym != KBCTRL_BUTTON_DPAD_DOWN && sym != KBCTRL_BUTTON_DPAD_LEFT && sym != KBCTRL_BUTTON_DPAD_RIGHT)
return false;
if (IsButtonPressed(ControllerButton::BUTTON_DPAD_LEFT)) {
rightStickX = -1;
} else if (IsButtonPressed(ControllerButton::BUTTON_DPAD_RIGHT)) {
rightStickX = 1;
} else {
rightStickX = 0;
}
if (IsButtonPressed(ControllerButton::BUTTON_DPAD_UP)) {
rightStickY = 1;
} else if (IsButtonPressed(ControllerButton::BUTTON_DPAD_DOWN)) {
rightStickY = -1;
} else {
rightStickY = 0;
}
return true;
}
} // namespace dvl
#endif