484 lines
11 KiB
C++
484 lines
11 KiB
C++
|
|
#pragma once
|
|
|
|
#if !defined(IWA_INPUT_HPP_INCLUDED)
|
|
#define IWA_INPUT_HPP_INCLUDED
|
|
|
|
#include <cstdint>
|
|
#include <string>
|
|
#include <SDL.h>
|
|
|
|
namespace iwa
|
|
{
|
|
// <editor-fold desc="KeyCode and ScanCode enums">
|
|
enum class KeyCode
|
|
{
|
|
UNKNOWN = -1,
|
|
|
|
RETURN = SDLK_RETURN,
|
|
ESCAPE = SDLK_ESCAPE,
|
|
BACKSPACE = SDLK_BACKSPACE,
|
|
TAB = SDLK_TAB,
|
|
SPACE = SDLK_SPACE,
|
|
EXCLAIM = SDLK_EXCLAIM,
|
|
QUOTEDBL = SDLK_QUOTEDBL,
|
|
HASH = SDLK_HASH,
|
|
PERCENT = SDLK_PERCENT,
|
|
DOLLAR = SDLK_DOLLAR,
|
|
AMPERSAND = SDLK_AMPERSAND,
|
|
QUOTE = SDLK_QUOTE,
|
|
LEFTPAREN = SDLK_LEFTPAREN,
|
|
RIGHTPAREN = SDLK_RIGHTPAREN,
|
|
ASTERISK = SDLK_ASTERISK,
|
|
PLUS = SDLK_PLUS,
|
|
COMMA = SDLK_COMMA,
|
|
MINUS = SDLK_MINUS,
|
|
PERIOD = SDLK_PERIOD,
|
|
SLASH = SDLK_SLASH,
|
|
_0 = SDLK_0,
|
|
_1 = SDLK_1,
|
|
_2 = SDLK_2,
|
|
_3 = SDLK_3,
|
|
_4 = SDLK_4,
|
|
_5 = SDLK_5,
|
|
_6 = SDLK_6,
|
|
_7 = SDLK_7,
|
|
_8 = SDLK_8,
|
|
_9 = SDLK_9,
|
|
COLON = SDLK_COLON,
|
|
SEMICOLON = SDLK_SEMICOLON,
|
|
LESS = SDLK_LESS,
|
|
EQUALS = SDLK_EQUALS,
|
|
GREATER = SDLK_GREATER,
|
|
QUESTION = SDLK_QUESTION,
|
|
AT = SDLK_AT,
|
|
|
|
/*
|
|
Skip uppercase letters
|
|
*/
|
|
|
|
LEFTBRACKET = SDLK_LEFTBRACKET,
|
|
BACKSLASH = SDLK_BACKSLASH,
|
|
RIGHTBRACKET = SDLK_RIGHTBRACKET,
|
|
CARET = SDLK_CARET,
|
|
UNDERSCORE = SDLK_UNDERSCORE,
|
|
BACKQUOTE = SDLK_BACKQUOTE,
|
|
A = SDLK_a,
|
|
B = SDLK_b,
|
|
C = SDLK_c,
|
|
D = SDLK_d,
|
|
E = SDLK_e,
|
|
F = SDLK_f,
|
|
G = SDLK_g,
|
|
H = SDLK_h,
|
|
I = SDLK_i,
|
|
J = SDLK_j,
|
|
K = SDLK_k,
|
|
L = SDLK_l,
|
|
M = SDLK_m,
|
|
N = SDLK_n,
|
|
O = SDLK_o,
|
|
P = SDLK_p,
|
|
Q = SDLK_q,
|
|
R = SDLK_r,
|
|
S = SDLK_s,
|
|
T = SDLK_t,
|
|
U = SDLK_u,
|
|
V = SDLK_v,
|
|
W = SDLK_w,
|
|
X = SDLK_x,
|
|
Y = SDLK_y,
|
|
Z = SDLK_z,
|
|
|
|
CAPSLOCK = SDLK_CAPSLOCK,
|
|
|
|
F1 = SDLK_F1,
|
|
F2 = SDLK_F2,
|
|
F3 = SDLK_F3,
|
|
F4 = SDLK_F4,
|
|
F5 = SDLK_F5,
|
|
F6 = SDLK_F6,
|
|
F7 = SDLK_F7,
|
|
F8 = SDLK_F8,
|
|
F9 = SDLK_F9,
|
|
F10 = SDLK_F10,
|
|
F11 = SDLK_F11,
|
|
F12 = SDLK_F12,
|
|
|
|
PRINTSCREEN = SDLK_PRINTSCREEN,
|
|
SCROLLLOCK = SDLK_SCROLLLOCK,
|
|
PAUSE = SDLK_PAUSE,
|
|
INSERT = SDLK_INSERT,
|
|
HOME = SDLK_HOME,
|
|
PAGEUP = SDLK_PAGEUP,
|
|
DELETE = SDLK_DELETE,
|
|
END = SDLK_END,
|
|
PAGEDOWN = SDLK_PAGEDOWN,
|
|
RIGHT = SDLK_RIGHT,
|
|
LEFT = SDLK_LEFT,
|
|
DOWN = SDLK_DOWN,
|
|
UP = SDLK_UP,
|
|
|
|
NUMLOCKCLEAR = SDLK_NUMLOCKCLEAR,
|
|
KP_DIVIDE = SDLK_KP_DIVIDE,
|
|
KP_MULTIPLY = SDLK_KP_MULTIPLY,
|
|
KP_MINUS = SDLK_KP_MINUS,
|
|
KP_PLUS = SDLK_KP_PLUS,
|
|
KP_ENTER = SDLK_KP_ENTER,
|
|
KP_1 = SDLK_KP_1,
|
|
KP_2 = SDLK_KP_2,
|
|
KP_3 = SDLK_KP_3,
|
|
KP_4 = SDLK_KP_4,
|
|
KP_5 = SDLK_KP_5,
|
|
KP_6 = SDLK_KP_6,
|
|
KP_7 = SDLK_KP_7,
|
|
KP_8 = SDLK_KP_8,
|
|
KP_9 = SDLK_KP_9,
|
|
KP_0 = SDLK_KP_0,
|
|
KP_PERIOD = SDLK_KP_PERIOD,
|
|
|
|
APPLICATION = SDLK_APPLICATION,
|
|
POWER = SDLK_POWER,
|
|
KP_EQUALS = SDLK_KP_EQUALS,
|
|
F13 = SDLK_F13,
|
|
F14 = SDLK_F14,
|
|
F15 = SDLK_F15,
|
|
F16 = SDLK_F16,
|
|
F17 = SDLK_F17,
|
|
F18 = SDLK_F18,
|
|
F19 = SDLK_F19,
|
|
F20 = SDLK_F20,
|
|
F21 = SDLK_F21,
|
|
F22 = SDLK_F22,
|
|
F23 = SDLK_F23,
|
|
F24 = SDLK_F24,
|
|
EXECUTE = SDLK_EXECUTE,
|
|
HELP = SDLK_HELP,
|
|
MENU = SDLK_MENU,
|
|
SELECT = SDLK_SELECT,
|
|
STOP = SDLK_STOP,
|
|
AGAIN = SDLK_AGAIN,
|
|
UNDO = SDLK_UNDO,
|
|
CUT = SDLK_CUT,
|
|
COPY = SDLK_COPY,
|
|
PASTE = SDLK_PASTE,
|
|
FIND = SDLK_FIND,
|
|
MUTE = SDLK_MUTE,
|
|
VOLUMEUP = SDLK_VOLUMEUP,
|
|
VOLUMEDOWN = SDLK_VOLUMEDOWN,
|
|
KP_COMMA = SDLK_KP_COMMA,
|
|
KP_EQUALSAS400 = SDLK_KP_EQUALSAS400,
|
|
|
|
ALTERASE = SDLK_ALTERASE,
|
|
SYSREQ = SDLK_SYSREQ,
|
|
CANCEL = SDLK_CANCEL,
|
|
CLEAR = SDLK_CLEAR,
|
|
PRIOR = SDLK_PRIOR,
|
|
RETURN2 = SDLK_RETURN2,
|
|
SEPARATOR = SDLK_SEPARATOR,
|
|
OUT = SDLK_OUT,
|
|
OPER = SDLK_OPER,
|
|
CLEARAGAIN = SDLK_CLEARAGAIN,
|
|
CRSEL = SDLK_CRSEL,
|
|
EXSEL = SDLK_EXSEL,
|
|
|
|
KP_00 = SDLK_KP_00,
|
|
KP_000 = SDLK_KP_000,
|
|
THOUSANDSSEPARATOR = SDLK_THOUSANDSSEPARATOR,
|
|
DECIMALSEPARATOR = SDLK_DECIMALSEPARATOR,
|
|
CURRENCYUNIT = SDLK_CURRENCYUNIT,
|
|
CURRENCYSUBUNIT = SDLK_CURRENCYSUBUNIT,
|
|
KP_LEFTPAREN = SDLK_KP_LEFTPAREN,
|
|
KP_RIGHTPAREN = SDLK_KP_RIGHTPAREN,
|
|
KP_LEFTBRACE = SDLK_KP_LEFTBRACE,
|
|
KP_RIGHTBRACE = SDLK_KP_RIGHTBRACE,
|
|
KP_TAB = SDLK_KP_TAB,
|
|
KP_BACKSPACE = SDLK_KP_BACKSPACE,
|
|
KP_A = SDLK_KP_A,
|
|
KP_B = SDLK_KP_B,
|
|
KP_C = SDLK_KP_C,
|
|
KP_D = SDLK_KP_D,
|
|
KP_E = SDLK_KP_E,
|
|
KP_F = SDLK_KP_F,
|
|
KP_XOR = SDLK_KP_XOR,
|
|
KP_POWER = SDLK_KP_POWER,
|
|
KP_PERCENT = SDLK_KP_PERCENT,
|
|
KP_LESS = SDLK_KP_LESS,
|
|
KP_GREATER = SDLK_KP_GREATER,
|
|
KP_AMPERSAND = SDLK_KP_AMPERSAND,
|
|
KP_DBLAMPERSAND = SDLK_KP_DBLAMPERSAND,
|
|
KP_VERTICALBAR = SDLK_KP_VERTICALBAR,
|
|
KP_DBLVERTICALBAR = SDLK_KP_DBLVERTICALBAR,
|
|
KP_COLON = SDLK_KP_COLON,
|
|
KP_HASH = SDLK_KP_HASH,
|
|
KP_SPACE = SDLK_KP_SPACE,
|
|
KP_AT = SDLK_KP_AT,
|
|
KP_EXCLAM = SDLK_KP_EXCLAM,
|
|
KP_MEMSTORE = SDLK_KP_MEMSTORE,
|
|
KP_MEMRECALL = SDLK_KP_MEMRECALL,
|
|
KP_MEMCLEAR = SDLK_KP_MEMCLEAR,
|
|
KP_MEMADD = SDLK_KP_MEMADD,
|
|
KP_MEMSUBTRACT = SDLK_KP_MEMSUBTRACT,
|
|
KP_MEMMULTIPLY = SDLK_KP_MEMMULTIPLY,
|
|
KP_MEMDIVIDE = SDLK_KP_MEMDIVIDE,
|
|
KP_PLUSMINUS = SDLK_KP_PLUSMINUS,
|
|
KP_CLEAR = SDLK_KP_CLEAR,
|
|
KP_CLEARENTRY = SDLK_KP_CLEARENTRY,
|
|
KP_BINARY = SDLK_KP_BINARY,
|
|
KP_OCTAL = SDLK_KP_OCTAL,
|
|
KP_DECIMAL = SDLK_KP_DECIMAL,
|
|
KP_HEXADECIMAL = SDLK_KP_HEXADECIMAL,
|
|
|
|
LCTRL = SDLK_LCTRL,
|
|
LSHIFT = SDLK_LSHIFT,
|
|
LALT = SDLK_LALT,
|
|
LGUI = SDLK_LGUI,
|
|
RCTRL = SDLK_RCTRL,
|
|
RSHIFT = SDLK_RSHIFT,
|
|
RALT = SDLK_RALT,
|
|
RGUI = SDLK_RGUI,
|
|
|
|
MODE = SDLK_MODE,
|
|
|
|
AUDIONEXT = SDLK_AUDIONEXT,
|
|
AUDIOPREV = SDLK_AUDIOPREV,
|
|
AUDIOSTOP = SDLK_AUDIOSTOP,
|
|
AUDIOPLAY = SDLK_AUDIOPLAY,
|
|
AUDIOMUTE = SDLK_AUDIOMUTE,
|
|
MEDIASELECT = SDLK_MEDIASELECT,
|
|
WWW = SDLK_WWW,
|
|
MAIL = SDLK_MAIL,
|
|
CALCULATOR = SDLK_CALCULATOR,
|
|
COMPUTER = SDLK_COMPUTER,
|
|
AC_SEARCH = SDLK_AC_SEARCH,
|
|
AC_HOME = SDLK_AC_HOME,
|
|
AC_BACK = SDLK_AC_BACK,
|
|
AC_FORWARD = SDLK_AC_FORWARD,
|
|
AC_STOP = SDLK_AC_STOP,
|
|
AC_REFRESH = SDLK_AC_REFRESH,
|
|
AC_BOOKMARKS = SDLK_AC_BOOKMARKS,
|
|
|
|
BRIGHTNESSDOWN = SDLK_BRIGHTNESSDOWN,
|
|
BRIGHTNESSUP = SDLK_BRIGHTNESSUP,
|
|
DISPLAYSWITCH = SDLK_DISPLAYSWITCH,
|
|
KBDILLUMTOGGLE = SDLK_KBDILLUMTOGGLE,
|
|
KBDILLUMDOWN = SDLK_KBDILLUMDOWN,
|
|
KBDILLUMUP = SDLK_KBDILLUMUP,
|
|
EJECT = SDLK_EJECT,
|
|
SLEEP = SDLK_SLEEP,
|
|
APP1 = SDLK_APP1,
|
|
APP2 = SDLK_APP2,
|
|
|
|
AUDIOREWIND = SDLK_AUDIOREWIND,
|
|
AUDIOFASTFORWARD = SDLK_AUDIOFASTFORWARD,
|
|
|
|
SOFTLEFT = SDLK_SOFTLEFT,
|
|
SOFTRIGHT = SDLK_SOFTRIGHT,
|
|
CALL = SDLK_CALL,
|
|
ENDCALL = SDLK_ENDCALL
|
|
};
|
|
|
|
enum class ScanCode
|
|
{
|
|
UNKNOWN = -1,
|
|
|
|
/* Printable keys */
|
|
SPACE = SDL_SCANCODE_SPACE,
|
|
APOSTROPHE = SDL_SCANCODE_APOSTROPHE,
|
|
COMMA = SDL_SCANCODE_COMMA,
|
|
MINUS = SDL_SCANCODE_MINUS,
|
|
PERIOD = SDL_SCANCODE_PERIOD,
|
|
SLASH = SDL_SCANCODE_SLASH,
|
|
_0 = SDL_SCANCODE_0,
|
|
_1 = SDL_SCANCODE_1,
|
|
_2 = SDL_SCANCODE_2,
|
|
_3 = SDL_SCANCODE_3,
|
|
_4 = SDL_SCANCODE_4,
|
|
_5 = SDL_SCANCODE_5,
|
|
_6 = SDL_SCANCODE_6,
|
|
_7 = SDL_SCANCODE_7,
|
|
_8 = SDL_SCANCODE_8,
|
|
_9 = SDL_SCANCODE_9,
|
|
SEMICOLON = SDL_SCANCODE_SEMICOLON,
|
|
EQUALS = SDL_SCANCODE_EQUALS,
|
|
A = SDL_SCANCODE_A,
|
|
B = SDL_SCANCODE_B,
|
|
C = SDL_SCANCODE_C,
|
|
D = SDL_SCANCODE_D,
|
|
E = SDL_SCANCODE_E,
|
|
F = SDL_SCANCODE_F,
|
|
G = SDL_SCANCODE_G,
|
|
H = SDL_SCANCODE_H,
|
|
I = SDL_SCANCODE_I,
|
|
J = SDL_SCANCODE_J,
|
|
K = SDL_SCANCODE_K,
|
|
L = SDL_SCANCODE_L,
|
|
M = SDL_SCANCODE_M,
|
|
N = SDL_SCANCODE_N,
|
|
O = SDL_SCANCODE_O,
|
|
P = SDL_SCANCODE_P,
|
|
Q = SDL_SCANCODE_Q,
|
|
R = SDL_SCANCODE_R,
|
|
S = SDL_SCANCODE_S,
|
|
T = SDL_SCANCODE_T,
|
|
U = SDL_SCANCODE_U,
|
|
V = SDL_SCANCODE_V,
|
|
W = SDL_SCANCODE_W,
|
|
X = SDL_SCANCODE_X,
|
|
Y = SDL_SCANCODE_Y,
|
|
Z = SDL_SCANCODE_Z,
|
|
LEFTBRACKET = SDL_SCANCODE_LEFTBRACKET,
|
|
BACKSLASH = SDL_SCANCODE_BACKSLASH,
|
|
RIGHTBRACKET = SDL_SCANCODE_RIGHTBRACKET,
|
|
GRAVE = SDL_SCANCODE_GRAVE,
|
|
// WORLD_1 = SDL_SCANCODE_WORLD_1,
|
|
// WORLD_2 = SDL_SCANCODE_WORLD_2,
|
|
|
|
/* Function keys */
|
|
ESCAPE = SDL_SCANCODE_ESCAPE,
|
|
ENTER = SDL_SCANCODE_RETURN,
|
|
TAB = SDL_SCANCODE_TAB,
|
|
BACKSPACE = SDL_SCANCODE_BACKSPACE,
|
|
INSERT = SDL_SCANCODE_INSERT,
|
|
DELETE = SDL_SCANCODE_DELETE,
|
|
RIGHT = SDL_SCANCODE_RIGHT,
|
|
LEFT = SDL_SCANCODE_LEFT,
|
|
DOWN = SDL_SCANCODE_DOWN,
|
|
UP = SDL_SCANCODE_UP,
|
|
PAGEUP = SDL_SCANCODE_PAGEUP,
|
|
PAGEDOWN = SDL_SCANCODE_PAGEDOWN,
|
|
HOME = SDL_SCANCODE_HOME,
|
|
END = SDL_SCANCODE_END,
|
|
CAPSLOCK = SDL_SCANCODE_CAPSLOCK,
|
|
SCROLLLOCK = SDL_SCANCODE_SCROLLLOCK,
|
|
NUMLOCK = SDL_SCANCODE_NUMLOCKCLEAR,
|
|
PRINTSCREEN = SDL_SCANCODE_PRINTSCREEN,
|
|
PAUSE = SDL_SCANCODE_PAUSE,
|
|
F1 = SDL_SCANCODE_F1,
|
|
F2 = SDL_SCANCODE_F2,
|
|
F3 = SDL_SCANCODE_F3,
|
|
F4 = SDL_SCANCODE_F4,
|
|
F5 = SDL_SCANCODE_F5,
|
|
F6 = SDL_SCANCODE_F6,
|
|
F7 = SDL_SCANCODE_F7,
|
|
F8 = SDL_SCANCODE_F8,
|
|
F9 = SDL_SCANCODE_F9,
|
|
F10 = SDL_SCANCODE_F10,
|
|
F11 = SDL_SCANCODE_F11,
|
|
F12 = SDL_SCANCODE_F12,
|
|
F13 = SDL_SCANCODE_F13,
|
|
F14 = SDL_SCANCODE_F14,
|
|
F15 = SDL_SCANCODE_F15,
|
|
F16 = SDL_SCANCODE_F16,
|
|
F17 = SDL_SCANCODE_F17,
|
|
F18 = SDL_SCANCODE_F18,
|
|
F19 = SDL_SCANCODE_F19,
|
|
F20 = SDL_SCANCODE_F20,
|
|
F21 = SDL_SCANCODE_F21,
|
|
F22 = SDL_SCANCODE_F22,
|
|
F23 = SDL_SCANCODE_F23,
|
|
F24 = SDL_SCANCODE_F24,
|
|
KP_0 = SDL_SCANCODE_KP_0,
|
|
KP_1 = SDL_SCANCODE_KP_1,
|
|
KP_2 = SDL_SCANCODE_KP_2,
|
|
KP_3 = SDL_SCANCODE_KP_3,
|
|
KP_4 = SDL_SCANCODE_KP_4,
|
|
KP_5 = SDL_SCANCODE_KP_5,
|
|
KP_6 = SDL_SCANCODE_KP_6,
|
|
KP_7 = SDL_SCANCODE_KP_7,
|
|
KP_8 = SDL_SCANCODE_KP_8,
|
|
KP_9 = SDL_SCANCODE_KP_9,
|
|
KP_DECIMAL = SDL_SCANCODE_KP_DECIMAL,
|
|
KP_DIVIDE = SDL_SCANCODE_KP_DIVIDE,
|
|
KP_MULTIPLY = SDL_SCANCODE_KP_MULTIPLY,
|
|
KP_MINUS = SDL_SCANCODE_KP_MINUS,
|
|
KP_PLUS = SDL_SCANCODE_KP_PLUS,
|
|
KP_ENTER = SDL_SCANCODE_KP_ENTER,
|
|
KP_EQUALS = SDL_SCANCODE_KP_EQUALS,
|
|
LSHIFT = SDL_SCANCODE_LSHIFT,
|
|
LCONTROL = SDL_SCANCODE_LCTRL,
|
|
LALT = SDL_SCANCODE_LALT,
|
|
LGUI = SDL_SCANCODE_LGUI,
|
|
RSHIFT = SDL_SCANCODE_RSHIFT,
|
|
RCONTROL = SDL_SCANCODE_RCTRL,
|
|
RALT = SDL_SCANCODE_RALT,
|
|
RGUI = SDL_SCANCODE_RGUI,
|
|
MENU = SDL_SCANCODE_MENU,
|
|
};
|
|
// </editor-fold>
|
|
|
|
struct KeyModifiers
|
|
{
|
|
bool leftShift : 1;
|
|
bool rightShift : 1;
|
|
bool leftCtrl : 1;
|
|
bool rightCtrl : 1;
|
|
bool leftAlt : 1;
|
|
bool rightAlt : 1;
|
|
bool leftMeta : 1;
|
|
bool rightMeta : 1;
|
|
};
|
|
|
|
struct InputEvent
|
|
{
|
|
|
|
};
|
|
|
|
struct KeyEvent : InputEvent
|
|
{
|
|
KeyCode keyCode;
|
|
ScanCode scanCode;
|
|
KeyModifiers modifiers;
|
|
bool down : 1;
|
|
bool repeat : 1;
|
|
};
|
|
|
|
enum class MouseButton
|
|
{
|
|
LEFT = SDL_BUTTON_LEFT,
|
|
MIDDLE = SDL_BUTTON_MIDDLE,
|
|
RIGHT = SDL_BUTTON_RIGHT,
|
|
EXTRA_1 = SDL_BUTTON_X1,
|
|
EXTRA_2 = SDL_BUTTON_X2
|
|
};
|
|
|
|
struct MouseMoveEvent
|
|
{
|
|
int relativeX;
|
|
int relativeY;
|
|
int absoluteX;
|
|
int absoluteY;
|
|
bool warped;
|
|
};
|
|
|
|
struct MouseWheelEvent
|
|
{
|
|
int relativeX;
|
|
int relativeY;
|
|
};
|
|
|
|
struct MouseButtonEvent
|
|
{
|
|
MouseButton button;
|
|
std::uint8_t clicks : 7;
|
|
bool down : 1;
|
|
};
|
|
|
|
struct TextInputEvent
|
|
{
|
|
std::string text;
|
|
};
|
|
|
|
struct KeyState
|
|
{
|
|
bool pressed;
|
|
};
|
|
|
|
[[nodiscard]] KeyState getKeyState(ScanCode scanCode) noexcept;
|
|
void captureMouse() noexcept;
|
|
void uncaptureMouse() noexcept;
|
|
[[nodiscard]] std::pair<int, int> getMouseScreenPosition() noexcept;
|
|
} // namespace iwa
|
|
|
|
#endif // !defined(IWA_INPUT_HPP_INCLUDED)
|