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