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