devilutionX/Source/controls/devices/kbcontroller.cpp
Gleb Mazovetskiy 472f86588e OpenDingux: Update RG350 package to OD Beta
Unfortunately, OD Beta has a major regression with SDL joystick support,
as it always reports buttons as keyboard keys instead of actual buttons.

This partially breaks external keyboard support, where e.g. space no
longer acts as expected.

However, on balance, OD Beta is better than the 2014 firmware at this
point.
2021-04-18 12:12:26 +02:00

188 lines
4.7 KiB
C++

#include "controls/devices/kbcontroller.h"
#if HAS_KBCTRL == 1
#include "controls/controller_motion.h"
#include "utils/sdl_compat.h"
#include "utils/stubs.h"
namespace devilution {
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:
return ControllerButton_BUTTON_LEFTSHOULDER;
#endif
#ifdef KBCTRL_BUTTON_RIGHTSHOULDER
case KBCTRL_BUTTON_RIGHTSHOULDER:
return ControllerButton_BUTTON_RIGHTSHOULDER;
#endif
#ifdef KBCTRL_BUTTON_TRIGGERLEFT
case KBCTRL_BUTTON_TRIGGERLEFT:
return ControllerButton_AXIS_TRIGGERLEFT;
#endif
#ifdef KBCTRL_BUTTON_TRIGGERRIGHT
case KBCTRL_BUTTON_TRIGGERRIGHT:
return ControllerButton_AXIS_TRIGGERRIGHT;
#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)
{
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_TRIGGERLEFT
case ControllerButton_AXIS_TRIGGERLEFT:
return KBCTRL_BUTTON_TRIGGERLEFT;
#endif
#ifdef KBCTRL_BUTTON_TRIGGERRIGHT
case ControllerButton_AXIS_TRIGGERRIGHT:
return KBCTRL_BUTTON_TRIGGERRIGHT;
#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(NULL)[SDL_GetScancodeFromKey(key_code)];
#else
return SDL_GetKeyState(NULL)[key_code];
#endif
}
bool ProcessKbCtrlAxisMotion(const SDL_Event &event)
{
// Mapping keyboard to right stick axis not implemented.
return false;
}
} // namespace devilution
#endif