iwa/include/iwa/input.hpp
2024-04-06 14:11:26 +02:00

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)