|
|
|
|
#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_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_IGNORE_1
|
|
|
|
|
case KBCTRL_IGNORE_1:
|
|
|
|
|
return ControllerButton::IGNORE;
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef KBCTRL_MODIFIER_KEY
|
|
|
|
|
case KBCTRL_MODIFIER_KEY:
|
|
|
|
|
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
|
|
|
|
|
if (IsModifierKey())
|
|
|
|
|
return ControllerButton::BUTTON_RIGHTSTICK;
|
|
|
|
|
return ControllerButton::BUTTON_B;
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef KBCTRL_BUTTON_X
|
|
|
|
|
case KBCTRL_BUTTON_X: // Left button
|
|
|
|
|
if (IsModifierKey())
|
|
|
|
|
return ControllerButton::BUTTON_BACK;
|
|
|
|
|
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
|