Gamedev Framework (gf) 1.2.0
A C++17 framework for 2D games
Keyboard.h
1/*
2 * Gamedev Framework (gf)
3 * Copyright (C) 2016-2022 Julien Bernard
4 *
5 * This software is provided 'as-is', without any express or implied
6 * warranty. In no event will the authors be held liable for any damages
7 * arising from the use of this software.
8 *
9 * Permission is granted to anyone to use this software for any purpose,
10 * including commercial applications, and to alter it and redistribute it
11 * freely, subject to the following restrictions:
12 *
13 * 1. The origin of this software must not be misrepresented; you must not
14 * claim that you wrote the original software. If you use this software
15 * in a product, an acknowledgment in the product documentation would be
16 * appreciated but is not required.
17 * 2. Altered source versions must be plainly marked as such, and must not be
18 * misrepresented as being the original software.
19 * 3. This notice may not be removed or altered from any source distribution.
20 */
21#ifndef GF_KEYBOARD_H
22#define GF_KEYBOARD_H
23
24#include "Flags.h"
25#include "GraphicsApi.h"
26
27namespace gf {
28#ifndef DOXYGEN_SHOULD_SKIP_THIS
29inline namespace v1 {
30#endif
31
38 enum class Mod : unsigned {
39 Shift = 0x0001,
40 Control = 0x0002,
41 Alt = 0x0004,
42 Super = 0x0008,
43 };
44
51 enum class Scancode : int {
52 Unknown = 0,
53 A = 4,
54 B = 5,
55 C = 6,
56 D = 7,
57 E = 8,
58 F = 9,
59 G = 10,
60 H = 11,
61 I = 12,
62 J = 13,
63 K = 14,
64 L = 15,
65 M = 16,
66 N = 17,
67 O = 18,
68 P = 19,
69 Q = 20,
70 R = 21,
71 S = 22,
72 T = 23,
73 U = 24,
74 V = 25,
75 W = 26,
76 X = 27,
77 Y = 28,
78 Z = 29,
79 Num1 = 30,
80 Num2 = 31,
81 Num3 = 32,
82 Num4 = 33,
83 Num5 = 34,
84 Num6 = 35,
85 Num7 = 36,
86 Num8 = 37,
87 Num9 = 38,
88 Num0 = 39,
89 Return = 40,
90 Escape = 41,
91 Backspace = 42,
92 Tab = 43,
93 Space = 44,
94 Minus = 45,
95 Equals = 46,
96 LeftBracket = 47,
97 RightBracket = 48,
98 Backslash = 49,
99 NonUsHash = 50,
100 Semicolon = 51,
101 Apostrophe = 52,
102 Grave = 53,
103 Comma = 54,
104 Period = 55,
105 Slash = 56,
106 CapsLock = 57,
107 F1 = 58,
108 F2 = 59,
109 F3 = 60,
110 F4 = 61,
111 F5 = 62,
112 F6 = 63,
113 F7 = 64,
114 F8 = 65,
115 F9 = 66,
116 F10 = 67,
117 F11 = 68,
118 F12 = 69,
119 PrintScreen = 70,
120 ScrollLock = 71,
121 Pause = 72,
122 Insert = 73,
123 Home = 74,
124 PageUp = 75,
125 Delete = 76,
126 End = 77,
127 PageDown = 78,
128 Right = 79,
129 Left = 80,
130 Down = 81,
131 Up = 82,
132 NumLockClear = 83,
133 NumpadDivide = 84,
134 NumpadMultiply = 85,
135 NumpadMinus = 86,
136 NumpadPlus = 87,
137 NumpadEnter = 88,
138 Numpad1 = 89,
139 Numpad2 = 90,
140 Numpad3 = 91,
141 Numpad4 = 92,
142 Numpad5 = 93,
143 Numpad6 = 94,
144 Numpad7 = 95,
145 Numpad8 = 96,
146 Numpad9 = 97,
147 Numpad0 = 98,
148 NumpadPeriod = 99,
149 NonUsBackslash = 100,
150 Application = 101,
151 Power = 102,
152 NumpadEquals = 103,
153 F13 = 104,
154 F14 = 105,
155 F15 = 106,
156 F16 = 107,
157 F17 = 108,
158 F18 = 109,
159 F19 = 110,
160 F20 = 111,
161 F21 = 112,
162 F22 = 113,
163 F23 = 114,
164 F24 = 115,
165 Execute = 116,
166 Help = 117,
167 Menu = 118,
168 Select = 119,
169 Stop = 120,
170 Again = 121,
171 Undo = 122,
172 Cut = 123,
173 Copy = 124,
174 Paste = 125,
175 Find = 126,
176 Mute = 127,
177 VolumeUp = 128,
178 VolumeDown = 129,
179 NumpadComma = 133,
180 NumpadEqualsAs400 = 134,
181 International1 = 135,
182 International2 = 136,
183 International3 = 137,
184 International4 = 138,
185 International5 = 139,
186 International6 = 140,
187 International7 = 141,
188 International8 = 142,
189 International9 = 143,
190 Lang1 = 144,
191 Lang2 = 145,
192 Lang3 = 146,
193 Lang4 = 147,
194 Lang5 = 148,
195 Lang6 = 149,
196 Lang7 = 150,
197 Lang8 = 151,
198 Lang9 = 152,
199 AltErase = 153,
200 SysReq = 154,
201 Cancel = 155,
202 Clear = 156,
203 Prior = 157,
204 Return2 = 158,
205 Separator = 159,
206 Out = 160,
207 Oper = 161,
208 ClearAgain = 162,
209 CrSel = 163,
210 ExSel = 164,
211 Numpad00 = 176,
212 Numpad000 = 177,
213 ThousandsSeparator = 178,
214 DecimalSeparator = 179,
215 CurrencyUnit = 180,
216 CurrencySubUnit = 181,
217 NumpadLeftParen = 182,
218 NumpadRightParen = 183,
219 NumpadLeftBrace = 184,
220 NumpadRightBrace = 185,
221 NumpadTab = 186,
222 NumpadBackspace = 187,
223 NumpadA = 188,
224 NumpadB = 189,
225 NumpadC = 190,
226 NumpadD = 191,
227 NumpadE = 192,
228 NumpadF = 193,
229 NumpadXor = 194,
230 NumpadPower = 195,
231 NumpadPercent = 196,
232 NumpadLess = 197,
233 NumpadGreater = 198,
234 NumpadAmpersand = 199,
235 NumpadDblAmpersand = 200,
236 NumpadVerticalBar = 201,
238 NumpadColon = 203,
239 NumpadHash = 204,
240 NumpadSpace = 205,
241 NumpadAt = 206,
242 NumpadExclam = 207,
243 NumpadMemStore = 208,
244 NumpadMemRecall = 209,
245 NumpadMemClear = 210,
246 NumpadMemAdd = 211,
247 NumpadMemSubtract = 212,
248 NumpadMemMultiply = 213,
249 NumpadMemDivide = 214,
250 NumpadPlusMinus = 215,
251 NumpadClear = 216,
252 NumpadClearEntry = 217,
253 NumpadBinary = 218,
254 NumpadOctal = 219,
255 NumpadDecimal = 220,
256 NumpadHexadecimal = 221,
257 LeftCtrl = 224,
258 LeftShift = 225,
259 LeftAlt = 226,
260 LeftGui = 227,
261 RightCtrl = 228,
262 RightShift = 229,
263 RightAlt = 230,
264 RightGui = 231,
265 Mode = 257,
266 };
267
268#ifndef DOXYGEN_SHOULD_SKIP_THIS
269 namespace {
270 constexpr int getKeycodeFromScancode(Scancode scancode) {
271 return static_cast<int>(scancode) | (1 << 30);
272 }
273 }
274#endif // DOXYGEN_SHOULD_SKIP_THIS
275
280 enum class Keycode : int {
281 Unknown = 0,
282 Return = '\r',
283 Escape = '\033',
284 Backspace = '\b',
285 Tab = '\t',
286 Space = ' ',
287 Exclaim = '!',
288 QuoteDbl = '"',
289 Hash = '#',
290 Percent = '%',
291 Dollar = '$',
292 Ampersand = '&',
293 Quote = '\'',
294 LeftParen = '(',
295 RightParen = ')',
296 Asterisk = '*',
297 Plus = '+',
298 Comma = ',',
299 Minus = '-',
300 Period = '.',
301 Slash = '/',
302 Num0 = '0',
303 Num1 = '1',
304 Num2 = '2',
305 Num3 = '3',
306 Num4 = '4',
307 Num5 = '5',
308 Num6 = '6',
309 Num7 = '7',
310 Num8 = '8',
311 Num9 = '9',
312 Colon = ':',
313 SemiColon = ';',
314 Less = '<',
315 Equals = '=',
316 Greater = '>',
317 Question = '?',
318 At = '@',
319 LeftBracket = '[',
320 Backslash = '\\',
321 RightBracket = ']',
322 Caret = '^',
323 Underscore = '_',
324 Backquote = '`',
325 A = 'a',
326 B = 'b',
327 C = 'c',
328 D = 'd',
329 E = 'e',
330 F = 'f',
331 G = 'g',
332 H = 'h',
333 I = 'i',
334 J = 'j',
335 K = 'k',
336 L = 'l',
337 M = 'm',
338 N = 'n',
339 O = 'o',
340 P = 'p',
341 Q = 'q',
342 R = 'r',
343 S = 's',
344 T = 't',
345 U = 'u',
346 V = 'v',
347 W = 'w',
348 X = 'x',
349 Y = 'y',
350 Z = 'z',
351 CapsLock = getKeycodeFromScancode(Scancode::CapsLock),
352 F1 = getKeycodeFromScancode(Scancode::F1),
353 F2 = getKeycodeFromScancode(Scancode::F2),
354 F3 = getKeycodeFromScancode(Scancode::F3),
355 F4 = getKeycodeFromScancode(Scancode::F4),
356 F5 = getKeycodeFromScancode(Scancode::F5),
357 F6 = getKeycodeFromScancode(Scancode::F6),
358 F7 = getKeycodeFromScancode(Scancode::F7),
359 F8 = getKeycodeFromScancode(Scancode::F8),
360 F9 = getKeycodeFromScancode(Scancode::F9),
361 F10 = getKeycodeFromScancode(Scancode::F10),
362 F11 = getKeycodeFromScancode(Scancode::F11),
363 F12 = getKeycodeFromScancode(Scancode::F12),
364 PrintScreen = getKeycodeFromScancode(Scancode::PrintScreen),
365 ScrollLock = getKeycodeFromScancode(Scancode::ScrollLock),
366 Pause = getKeycodeFromScancode(Scancode::Pause),
367 Insert = getKeycodeFromScancode(Scancode::Insert),
368 Home = getKeycodeFromScancode(Scancode::Home),
369 PageUp = getKeycodeFromScancode(Scancode::PageUp),
370 Delete = '\177',
371 End = getKeycodeFromScancode(Scancode::End),
372 PageDown = getKeycodeFromScancode(Scancode::PageDown),
373 Right = getKeycodeFromScancode(Scancode::Right),
374 Left = getKeycodeFromScancode(Scancode::Left),
375 Down = getKeycodeFromScancode(Scancode::Down),
376 Up = getKeycodeFromScancode(Scancode::Up),
377 NumLockClear = getKeycodeFromScancode(Scancode::NumLockClear),
378 NumpadDivide = getKeycodeFromScancode(Scancode::NumpadDivide),
379 NumpadMultiply = getKeycodeFromScancode(Scancode::NumpadMultiply),
380 NumpadMinus = getKeycodeFromScancode(Scancode::NumpadMinus),
381 NumpadPlus = getKeycodeFromScancode(Scancode::NumpadPlus),
382 NumpadEnter = getKeycodeFromScancode(Scancode::NumpadEnter),
383 Numpad1 = getKeycodeFromScancode(Scancode::Numpad1),
384 Numpad2 = getKeycodeFromScancode(Scancode::Numpad2),
385 Numpad3 = getKeycodeFromScancode(Scancode::Numpad3),
386 Numpad4 = getKeycodeFromScancode(Scancode::Numpad4),
387 Numpad5 = getKeycodeFromScancode(Scancode::Numpad5),
388 Numpad6 = getKeycodeFromScancode(Scancode::Numpad6),
389 Numpad7 = getKeycodeFromScancode(Scancode::Numpad7),
390 Numpad8 = getKeycodeFromScancode(Scancode::Numpad8),
391 Numpad9 = getKeycodeFromScancode(Scancode::Numpad9),
392 Numpad0 = getKeycodeFromScancode(Scancode::Numpad0),
393 NumpadPeriod = getKeycodeFromScancode(Scancode::NumpadPeriod),
394 Application = getKeycodeFromScancode(Scancode::Application),
395 Power = getKeycodeFromScancode(Scancode::Power),
396 NumpadEquals = getKeycodeFromScancode(Scancode::NumpadEquals),
397 F13 = getKeycodeFromScancode(Scancode::F13),
398 F14 = getKeycodeFromScancode(Scancode::F14),
399 F15 = getKeycodeFromScancode(Scancode::F15),
400 F16 = getKeycodeFromScancode(Scancode::F16),
401 F17 = getKeycodeFromScancode(Scancode::F17),
402 F18 = getKeycodeFromScancode(Scancode::F18),
403 F19 = getKeycodeFromScancode(Scancode::F19),
404 F20 = getKeycodeFromScancode(Scancode::F20),
405 F21 = getKeycodeFromScancode(Scancode::F21),
406 F22 = getKeycodeFromScancode(Scancode::F22),
407 F23 = getKeycodeFromScancode(Scancode::F23),
408 F24 = getKeycodeFromScancode(Scancode::F24),
409 Execute = getKeycodeFromScancode(Scancode::Execute),
410 Help = getKeycodeFromScancode(Scancode::Help),
411 Menu = getKeycodeFromScancode(Scancode::Menu),
412 Select = getKeycodeFromScancode(Scancode::Select),
413 Stop = getKeycodeFromScancode(Scancode::Stop),
414 Again = getKeycodeFromScancode(Scancode::Again),
415 Undo = getKeycodeFromScancode(Scancode::Undo),
416 Cut = getKeycodeFromScancode(Scancode::Cut),
417 Copy = getKeycodeFromScancode(Scancode::Copy),
418 Paste = getKeycodeFromScancode(Scancode::Paste),
419 Find = getKeycodeFromScancode(Scancode::Find),
420 Mute = getKeycodeFromScancode(Scancode::Mute),
421 VolumeUp = getKeycodeFromScancode(Scancode::VolumeUp),
422 VolumeDown = getKeycodeFromScancode(Scancode::VolumeDown),
423 NumpadComma = getKeycodeFromScancode(Scancode::NumpadComma),
424 NumpadEqualsAs400 = getKeycodeFromScancode(Scancode::NumpadEqualsAs400),
425 AltErase = getKeycodeFromScancode(Scancode::AltErase),
426 SysReq = getKeycodeFromScancode(Scancode::SysReq),
427 Cancel = getKeycodeFromScancode(Scancode::Cancel),
428 Clear = getKeycodeFromScancode(Scancode::Clear),
429 Prior = getKeycodeFromScancode(Scancode::Prior),
430 Return2 = getKeycodeFromScancode(Scancode::Return2),
431 Separator = getKeycodeFromScancode(Scancode::Separator),
432 Out = getKeycodeFromScancode(Scancode::Out),
433 Oper = getKeycodeFromScancode(Scancode::Oper),
434 ClearAgain = getKeycodeFromScancode(Scancode::ClearAgain),
435 CrSel = getKeycodeFromScancode(Scancode::CrSel),
436 ExSel = getKeycodeFromScancode(Scancode::ExSel),
437 Numpad00 = getKeycodeFromScancode(Scancode::Numpad00),
438 Numpad000 = getKeycodeFromScancode(Scancode::Numpad000),
439 ThousandsSeparator = getKeycodeFromScancode(Scancode::ThousandsSeparator),
440 DecimalSeparator = getKeycodeFromScancode(Scancode::DecimalSeparator),
441 CurrencyUnit = getKeycodeFromScancode(Scancode::CurrencyUnit),
442 CurrencySubUnit = getKeycodeFromScancode(Scancode::CurrencySubUnit),
443 NumpadLeftParen = getKeycodeFromScancode(Scancode::NumpadLeftParen),
444 NumpadRightParen = getKeycodeFromScancode(Scancode::NumpadRightParen),
445 NumpadLeftBrace = getKeycodeFromScancode(Scancode::NumpadLeftBrace),
446 NumpadRightBrace = getKeycodeFromScancode(Scancode::NumpadRightBrace),
447 NumpadTab = getKeycodeFromScancode(Scancode::NumpadTab),
448 NumpadBackspace = getKeycodeFromScancode(Scancode::NumpadBackspace),
449 NumpadA = getKeycodeFromScancode(Scancode::NumpadA),
450 NumpadB = getKeycodeFromScancode(Scancode::NumpadB),
451 NumpadC = getKeycodeFromScancode(Scancode::NumpadC),
452 NumpadD = getKeycodeFromScancode(Scancode::NumpadD),
453 NumpadE = getKeycodeFromScancode(Scancode::NumpadE),
454 NumpadF = getKeycodeFromScancode(Scancode::NumpadF),
455 NumpadXor = getKeycodeFromScancode(Scancode::NumpadXor),
456 NumpadPower = getKeycodeFromScancode(Scancode::NumpadPower),
457 NumpadPercent = getKeycodeFromScancode(Scancode::NumpadPercent),
458 NumpadLess = getKeycodeFromScancode(Scancode::NumpadLess),
459 NumpadGreater = getKeycodeFromScancode(Scancode::NumpadGreater),
460 NumpadAmpersand = getKeycodeFromScancode(Scancode::NumpadAmpersand),
461 NumpadDblAmpersand = getKeycodeFromScancode(Scancode::NumpadDblAmpersand),
462 NumpadVerticalBar = getKeycodeFromScancode(Scancode::NumpadVerticalBar),
464 NumpadColon = getKeycodeFromScancode(Scancode::NumpadColon),
465 NumpadHash = getKeycodeFromScancode(Scancode::NumpadHash),
466 NumpadSpace = getKeycodeFromScancode(Scancode::NumpadSpace),
467 NumpadAt = getKeycodeFromScancode(Scancode::NumpadAt),
468 NumpadExclam = getKeycodeFromScancode(Scancode::NumpadExclam),
469 NumpadMemStore = getKeycodeFromScancode(Scancode::NumpadMemStore),
470 NumpadMemRecall = getKeycodeFromScancode(Scancode::NumpadMemRecall),
471 NumpadMemClear = getKeycodeFromScancode(Scancode::NumpadMemClear),
472 NumpadMemAdd = getKeycodeFromScancode(Scancode::NumpadMemAdd),
473 NumpadMemSubtract = getKeycodeFromScancode(Scancode::NumpadMemSubtract),
474 NumpadMemMultiply = getKeycodeFromScancode(Scancode::NumpadMemMultiply),
475 NumpadMemDivide = getKeycodeFromScancode(Scancode::NumpadMemDivide),
476 NumpadPlusMinus = getKeycodeFromScancode(Scancode::NumpadPlusMinus),
477 NumpadClear = getKeycodeFromScancode(Scancode::NumpadClear),
478 NumpadClearEntry = getKeycodeFromScancode(Scancode::NumpadClearEntry),
479 NumpadBinary = getKeycodeFromScancode(Scancode::NumpadBinary),
480 NumpadOctal = getKeycodeFromScancode(Scancode::NumpadOctal),
481 NumpadDecimal = getKeycodeFromScancode(Scancode::NumpadDecimal),
482 NumpadHexadecimal = getKeycodeFromScancode(Scancode::NumpadHexadecimal),
483 LeftCtrl = getKeycodeFromScancode(Scancode::LeftCtrl),
484 LeftShift = getKeycodeFromScancode(Scancode::LeftShift),
485 LeftAlt = getKeycodeFromScancode(Scancode::LeftAlt),
486 LeftGui = getKeycodeFromScancode(Scancode::LeftGui),
487 RightCtrl = getKeycodeFromScancode(Scancode::RightCtrl),
488 RightShift = getKeycodeFromScancode(Scancode::RightShift),
489 RightAlt = getKeycodeFromScancode(Scancode::RightAlt),
490 RightGui = getKeycodeFromScancode(Scancode::RightGui),
491 Mode = getKeycodeFromScancode(Scancode::Mode),
492 };
493
498 struct GF_GRAPHICS_API Keyboard {
506 static const char *getScancodeName(Scancode scancode);
507
515 static Scancode getScancodeFromName(const char *name);
516
524 static const char *getKeycodeName(Keycode keycode);
525
533 static Keycode getKeycodeFromName(const char *name);
534
545 static Keycode localize(Scancode scancode);
546
557 static Scancode unlocalize(Keycode keycode);
558
562 Keyboard() = delete;
563
564 };
565
566#ifndef DOXYGEN_SHOULD_SKIP_THIS
567}
568
569template<>
570struct EnableBitmaskOperators<Mod> {
571 static constexpr bool value = true;
572};
573
574#endif
575}
576
577#endif // GF_KEYBOARD_H
A physical control.
Definition: Control.h:38
@ X
The x cell axis.
@ Y
The y cell axis.
@ Unknown
An unknown orientation.
@ Down
The down direction.
@ Up
The up direction.
Mod
Modifier enumeration.
Definition: Keyboard.h:38
Scancode
Scancodes.
Definition: Keyboard.h:51
Keycode
Keycodes.
Definition: Keyboard.h:280
@ Super
Is the Super key pressed?
@ Shift
Is the Shift key pressed?
@ Alt
Is the Alt key pressed?
@ A
The A button.
@ B
The B button.
@ Right
Right alignement.
@ Left
Left alignement.
The namespace for gf classes.
Some keyboard related functions.
Definition: Keyboard.h:498
static Scancode unlocalize(Keycode keycode)
Identify the physical key corresponding to a logical one.
static Keycode getKeycodeFromName(const char *name)
Get the keycode associated to a name.
static Keycode localize(Scancode scancode)
Localize a physical key to a logical one.
static const char * getScancodeName(Scancode scancode)
Get the representation of a scancode.
Keyboard()=delete
Deleted constructor.
static const char * getKeycodeName(Keycode keycode)
Get the representation of a keycode.
static Scancode getScancodeFromName(const char *name)
Get the scancode associated to a name.