libdonut  2.3.2
Application framework for cross-platform game development in C++20
Input.hpp
Go to the documentation of this file.
1 #ifndef DONUT_EVENTS_INPUT_HPP
2 #define DONUT_EVENTS_INPUT_HPP
3 
4 #include <cstddef> // std::size_t
5 #include <cstdint> // std::uint8_t
6 #include <string_view> // std::string_view
7 
8 namespace donut::events {
9 
10 // clang-format off
11 // X(name, id, str )
12 #define DONUT_ENUM_INPUTS(X) \
13  X(UNKNOWN, "unknown", "Unknown" ) \
14  X(KEY_A, "key_a", "A" ) \
15  X(KEY_B, "key_b", "B" ) \
16  X(KEY_C, "key_c", "C" ) \
17  X(KEY_D, "key_d", "D" ) \
18  X(KEY_E, "key_e", "E" ) \
19  X(KEY_F, "key_f", "F" ) \
20  X(KEY_G, "key_g", "G" ) \
21  X(KEY_H, "key_h", "H" ) \
22  X(KEY_I, "key_i", "I" ) \
23  X(KEY_J, "key_j", "J" ) \
24  X(KEY_K, "key_k", "K" ) \
25  X(KEY_L, "key_l", "L" ) \
26  X(KEY_M, "key_m", "M" ) \
27  X(KEY_N, "key_n", "N" ) \
28  X(KEY_O, "key_o", "O" ) \
29  X(KEY_P, "key_p", "P" ) \
30  X(KEY_Q, "key_q", "Q" ) \
31  X(KEY_R, "key_r", "R" ) \
32  X(KEY_S, "key_s", "S" ) \
33  X(KEY_T, "key_t", "T" ) \
34  X(KEY_U, "key_u", "U" ) \
35  X(KEY_V, "key_v", "V" ) \
36  X(KEY_W, "key_w", "W" ) \
37  X(KEY_X, "key_x", "X" ) \
38  X(KEY_Y, "key_y", "Y" ) \
39  X(KEY_Z, "key_z", "Z" ) \
40  X(KEY_1, "key_1", "1" ) \
41  X(KEY_2, "key_2", "2" ) \
42  X(KEY_3, "key_3", "3" ) \
43  X(KEY_4, "key_4", "4" ) \
44  X(KEY_5, "key_5", "5" ) \
45  X(KEY_6, "key_6", "6" ) \
46  X(KEY_7, "key_7", "7" ) \
47  X(KEY_8, "key_8", "8" ) \
48  X(KEY_9, "key_9", "9" ) \
49  X(KEY_0, "key_0", "0" ) \
50  X(KEY_ESCAPE, "key_escape", "Esc" ) \
51  X(KEY_LCTRL, "key_lctrl", "LCtrl" ) \
52  X(KEY_RCTRL, "key_rctrl", "RCtrl" ) \
53  X(KEY_LSHIFT, "key_lshift", "LShift" ) \
54  X(KEY_RSHIFT, "key_rshift", "RShift" ) \
55  X(KEY_LALT, "key_lalt", "LAlt" ) \
56  X(KEY_RALT, "key_ralt", "RAlt" ) \
57  X(KEY_MENU, "key_menu", "Menu" ) \
58  X(KEY_LEFT_BRACKET, "key_left_bracket", "[" ) \
59  X(KEY_RIGHT_BRACKET, "key_right_bracket", "]" ) \
60  X(KEY_SEMICOLON, "key_semicolon", ";" ) \
61  X(KEY_COMMA, "key_comma", "," ) \
62  X(KEY_PERIOD, "key_period", "." ) \
63  X(KEY_APOSTROPHE, "key_apostrophe", "'" ) \
64  X(KEY_SLASH, "key_slash", "/" ) \
65  X(KEY_BACKSLASH, "key_backslash", "\\" ) \
66  X(KEY_GRAVE, "key_grave", "`" ) \
67  X(KEY_EQUALS, "key_equals", "=" ) \
68  X(KEY_MINUS, "key_minus", "-" ) \
69  X(KEY_SPACE, "key_space", "Space" ) \
70  X(KEY_RETURN, "key_return", "Return" ) \
71  X(KEY_BACKSPACE, "key_backspace", "Backspace" ) \
72  X(KEY_TAB, "key_tab", "Tab" ) \
73  X(KEY_PAGE_UP, "key_page_up", "Pgup" ) \
74  X(KEY_PAGE_DOWN, "key_page_down", "Pgdn" ) \
75  X(KEY_END, "key_end", "End" ) \
76  X(KEY_HOME, "key_home", "Home" ) \
77  X(KEY_INSERT, "key_insert", "Insert" ) \
78  X(KEY_DELETE, "key_delete", "Delete" ) \
79  X(KEY_ARROW_UP, "key_arrow_up", "Up Arrow" ) \
80  X(KEY_ARROW_DOWN, "key_arrow_down", "Down Arrow" ) \
81  X(KEY_ARROW_LEFT, "key_arrow_left", "Left Arrow" ) \
82  X(KEY_ARROW_RIGHT, "key_arrow_right", "Right Arrow" ) \
83  X(KEY_NUMPAD_PLUS, "key_numpad_plus", "Numpad +" ) \
84  X(KEY_NUMPAD_MINUS, "key_numpad_minus", "Numpad -" ) \
85  X(KEY_NUMPAD_MULTIPLY, "key_numpad_multiply", "Numpad *" ) \
86  X(KEY_NUMPAD_DIVIDE, "key_numpad_divide", "Numpad /" ) \
87  X(KEY_NUMPAD_1, "key_numpad_1", "Numpad 1" ) \
88  X(KEY_NUMPAD_2, "key_numpad_2", "Numpad 2" ) \
89  X(KEY_NUMPAD_3, "key_numpad_3", "Numpad 3" ) \
90  X(KEY_NUMPAD_4, "key_numpad_4", "Numpad 4" ) \
91  X(KEY_NUMPAD_5, "key_numpad_5", "Numpad 5" ) \
92  X(KEY_NUMPAD_6, "key_numpad_6", "Numpad 6" ) \
93  X(KEY_NUMPAD_7, "key_numpad_7", "Numpad 7" ) \
94  X(KEY_NUMPAD_8, "key_numpad_8", "Numpad 8" ) \
95  X(KEY_NUMPAD_9, "key_numpad_9", "Numpad 9" ) \
96  X(KEY_NUMPAD_0, "key_numpad_0", "Numpad 0" ) \
97  X(KEY_F1, "key_f1", "F1" ) \
98  X(KEY_F2, "key_f2", "F2" ) \
99  X(KEY_F3, "key_f3", "F3" ) \
100  X(KEY_F4, "key_f4", "F4" ) \
101  X(KEY_F5, "key_f5", "F5" ) \
102  X(KEY_F6, "key_f6", "F6" ) \
103  X(KEY_F7, "key_f7", "F7" ) \
104  X(KEY_F8, "key_f8", "F8" ) \
105  X(KEY_F9, "key_f9", "F9" ) \
106  X(KEY_F10, "key_f10", "F10" ) \
107  X(KEY_F11, "key_f11", "F11" ) \
108  X(KEY_F12, "key_f12", "F12" ) \
109  X(KEY_F13, "key_f13", "F13" ) \
110  X(KEY_F14, "key_f14", "F14" ) \
111  X(KEY_F15, "key_f15", "F15" ) \
112  X(KEY_PRINT_SCREEN, "key_print_screen", "PrtSc" ) \
113  X(KEY_SCROLL_LOCK, "key_scroll_lock", "Scroll Lock" ) \
114  X(KEY_PAUSE, "key_pause", "Pause" ) \
115  X(MOUSE_BUTTON_LEFT, "mouse_button_left", "Left Click" ) \
116  X(MOUSE_BUTTON_RIGHT, "mouse_button_right", "Right Click" ) \
117  X(MOUSE_BUTTON_MIDDLE, "mouse_button_middle", "Middle Mouse Button" ) \
118  X(MOUSE_BUTTON_BACK, "mouse_button_back", "Back Mouse Button" ) \
119  X(MOUSE_BUTTON_FORWARD, "mouse_button_forward", "Forward Mouse Button" ) \
120  X(MOUSE_SCROLL_UP, "mouse_scroll_up", "Scroll Up" ) \
121  X(MOUSE_SCROLL_DOWN, "mouse_scroll_down", "Scroll Down" ) \
122  X(MOUSE_SCROLL_LEFT, "mouse_scroll_left", "Scroll Left" ) \
123  X(MOUSE_SCROLL_RIGHT, "mouse_scroll_right", "Scroll Right" ) \
124  X(MOUSE_MOTION_UP, "mouse_motion_up", "Mouse Up" ) \
125  X(MOUSE_MOTION_DOWN, "mouse_motion_down", "Mouse Down" ) \
126  X(MOUSE_MOTION_LEFT, "mouse_motion_left", "Mouse Left" ) \
127  X(MOUSE_MOTION_RIGHT, "mouse_motion_right", "Mouse Right" ) \
128  X(CONTROLLER_BUTTON_A, "controller_button_a", "A Button" ) \
129  X(CONTROLLER_BUTTON_B, "controller_button_b", "B Button" ) \
130  X(CONTROLLER_BUTTON_X, "controller_button_x", "X Button" ) \
131  X(CONTROLLER_BUTTON_Y, "controller_button_y", "Y Button" ) \
132  X(CONTROLLER_BUTTON_BACK, "controller_button_back", "Back Button" ) \
133  X(CONTROLLER_BUTTON_GUIDE, "controller_button_guide", "Guide Button" ) \
134  X(CONTROLLER_BUTTON_START, "controller_button_start", "Start Button" ) \
135  X(CONTROLLER_BUTTON_LEFT_STICK, "controller_button_left_stick", "Left Stick Button" ) \
136  X(CONTROLLER_BUTTON_RIGHT_STICK, "controller_button_right_stick", "Right Stick Button" ) \
137  X(CONTROLLER_BUTTON_LEFT_SHOULDER, "controller_button_left_shoulder", "Left Shoulder Button" ) \
138  X(CONTROLLER_BUTTON_RIGHT_SHOULDER, "controller_button_right_shoulder", "Right Shoulder Button" ) \
139  X(CONTROLLER_BUTTON_DPAD_UP, "controller_button_dpad_up", "D-Pad Up" ) \
140  X(CONTROLLER_BUTTON_DPAD_DOWN, "controller_button_dpad_down", "D-Pad Down" ) \
141  X(CONTROLLER_BUTTON_DPAD_LEFT, "controller_button_dpad_left", "D-Pad Left" ) \
142  X(CONTROLLER_BUTTON_DPAD_RIGHT, "controller_button_dpad_right", "D-Pad Right" ) \
143  X(CONTROLLER_BUTTON_MISC1, "controller_button_misc1", "Misc1 Button" ) \
144  X(CONTROLLER_BUTTON_PADDLE1, "controller_button_paddle1", "Paddle 1" ) \
145  X(CONTROLLER_BUTTON_PADDLE2, "controller_button_paddle2", "Paddle 2" ) \
146  X(CONTROLLER_BUTTON_PADDLE3, "controller_button_paddle3", "Paddle 3" ) \
147  X(CONTROLLER_BUTTON_PADDLE4, "controller_button_paddle4", "Paddle 4" ) \
148  X(CONTROLLER_BUTTON_TOUCHPAD, "controller_button_touchpad", "Touchpad Button" ) \
149  X(CONTROLLER_AXIS_LEFT_STICK_UP, "controller_axis_left_stick_up", "Left Stick Up" ) \
150  X(CONTROLLER_AXIS_LEFT_STICK_DOWN, "controller_axis_left_stick_down", "Left Stick Down" ) \
151  X(CONTROLLER_AXIS_LEFT_STICK_LEFT, "controller_axis_left_stick_left", "Left Stick Left" ) \
152  X(CONTROLLER_AXIS_LEFT_STICK_RIGHT, "controller_axis_left_stick_right", "Left Stick Right" ) \
153  X(CONTROLLER_AXIS_RIGHT_STICK_UP, "controller_axis_right_stick_up", "Right Stick Up" ) \
154  X(CONTROLLER_AXIS_RIGHT_STICK_DOWN, "controller_axis_right_stick_down", "Right Stick Down" ) \
155  X(CONTROLLER_AXIS_RIGHT_STICK_LEFT, "controller_axis_right_stick_left", "Right Stick Left" ) \
156  X(CONTROLLER_AXIS_RIGHT_STICK_RIGHT, "controller_axis_right_stick_right", "Right Stick Right" ) \
157  X(CONTROLLER_AXIS_LEFT_TRIGGER, "controller_axis_left_trigger", "Left Trigger" ) \
158  X(CONTROLLER_AXIS_RIGHT_TRIGGER, "controller_axis_right_trigger", "Right Trigger" ) \
159  X(TOUCH_FINGER_TAP, "touch_finger_tap", "Touch Finger Tap" ) \
160  X(TOUCH_FINGER_PRESSURE, "touch_finger_pressure", "Touch Finger Pressure" ) \
161  X(TOUCH_FINGER_MOTION_UP, "touch_finger_motion_up", "Touch Finger Up" ) \
162  X(TOUCH_FINGER_MOTION_DOWN, "touch_finger_motion_down", "Touch Finger Down" ) \
163  X(TOUCH_FINGER_MOTION_LEFT, "touch_finger_motion_left", "Touch Finger Left" ) \
164  X(TOUCH_FINGER_MOTION_RIGHT, "touch_finger_motion_right", "Touch Finger Right" )
165 // clang-format on
166 
171 enum class Input : std::uint8_t {
172 #define X(name, id, str) name,
173  DONUT_ENUM_INPUTS(X)
174 #undef X
175 };
176 
180 inline constexpr std::size_t INPUT_COUNT = [] {
181  std::size_t result = 0;
182 #define X(name, id, str) ++result;
183  DONUT_ENUM_INPUTS(X)
184 #undef X
185  return result;
186 }() ;
187 
196 [[nodiscard]] constexpr std::size_t getInputIndex(Input input) noexcept {
197  return static_cast<std::size_t>(static_cast<std::uint8_t>(input));
198 }
199 
211 [[nodiscard]] constexpr std::string_view getInputIdentifier(Input input) noexcept {
212  switch (input) {
214 #define X(name, id, str) \
215  case Input::name: return id;
216  DONUT_ENUM_INPUTS(X)
217 #undef X
219  }
220  return "unknown";
221 }
222 
231 [[nodiscard]] constexpr std::string_view getInputString(Input input) noexcept {
232  switch (input) {
234 #define X(name, id, str) \
235  case Input::name: return str;
236  DONUT_ENUM_INPUTS(X)
237 #undef X
239  }
240  return "Unknown";
241 }
242 
253 [[nodiscard]] constexpr Input findInput(std::string_view identifier) noexcept {
255 #define X(name, id, str) \
256  if (identifier == id) { \
257  return Input::name; \
258  }
259  DONUT_ENUM_INPUTS(X)
260 #undef X
262  return Input::UNKNOWN;
263 }
264 
265 #undef DONUT_ENUM_INPUTS
266 
267 } // namespace donut::events
268 
269 #endif
Definition: Error.hpp:7
constexpr std::string_view getInputIdentifier(Input input) noexcept
Get the identifier string of an Input.
Definition: Input.hpp:362
Input
Unique identifier for a specific control on a physical input device, such as a certain keyboard key,...
Definition: Input.hpp:323
@ UNKNOWN
Unknown input.
constexpr std::string_view getInputString(Input input) noexcept
Get a short human-readable string description of an Input.
Definition: Input.hpp:382
constexpr std::size_t INPUT_COUNT
Total number of inputs that exist in the Input enumeration.
Definition: Input.hpp:337
constexpr std::size_t getInputIndex(Input input) noexcept
Get the 0-based index of an Input.
Definition: Input.hpp:347
constexpr Input findInput(std::string_view identifier) noexcept
Find the Input corresponding to a given identifier.
Definition: Input.hpp:404