Gamedev Framework (gf)  0.17.0
A C++14 framework for 2D games
Keyboard.h
1 /*
2  * Gamedev Framework (gf)
3  * Copyright (C) 2016-2019 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 "Portability.h"
26 
27 namespace gf {
28 #ifndef DOXYGEN_SHOULD_SKIP_THIS
29 inline 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,
237  NumpadDblVerticalBar = 202,
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),
463  NumpadDblVerticalBar = getKeycodeFromScancode(Scancode::NumpadDblVerticalBar),
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_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 
569 template<>
570 struct EnableBitmaskOperators<Mod> {
571  static constexpr bool value = true;
572 };
573 
574 #endif
575 }
576 
577 #endif // GF_KEYBOARD_H
The down direction.
Some keyboard related functions.
Definition: Keyboard.h:498
The B button.
Is the Super key pressed?
Scancode
Scancodes.
Definition: Keyboard.h:51
Is the Shift key pressed?
The up direction.
A physical control.
Definition: Control.h:38
The Y button.
The namespace for gf classes.
Definition: Action.h:35
Is the Alt key pressed?
The X button.
Left alignement.
Right alignement.
Mod
Modifier enumeration.
Definition: Keyboard.h:38
The A button.
Keycode
Keycodes.
Definition: Keyboard.h:280