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