Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

270 lines
5.4 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. // $NoKeywords: $
  6. //=============================================================================//
  7. #ifndef KEYBOARD_H
  8. #define KEYBOARD_H
  9. #ifdef _WIN32
  10. #pragma once
  11. #endif
  12. #define KEY_MOD_SHIFT 0x0001
  13. #define KEY_MOD_CONTROL 0x0002
  14. #define KEY_MOD_ALT 0x0004
  15. //
  16. // Defines the maximum number of physical keys. These physical keys correspond to
  17. // the windows virtual key codes shown below. Missing key codes may be up for grabs,
  18. // but it is probably safer to add to the end of the list.
  19. //
  20. #define MAX_PHYSICAL_KEYS 256
  21. //
  22. // VK_LBUTTON 0x01
  23. // VK_RBUTTON 0x02
  24. // VK_CANCEL 0x03
  25. // VK_MBUTTON 0x04
  26. // ? 0x04
  27. // ? 0x05
  28. // ? 0x06
  29. // ? 0x07
  30. // VK_BACK 0x08
  31. // VK_TAB 0x09
  32. // ? 0x0A
  33. // ? 0x0B
  34. // VK_CLEAR 0x0C
  35. // VK_RETURN 0x0D
  36. // ? 0x0E
  37. // ? 0x0F
  38. // VK_SHIFT 0x10
  39. // VK_CONTROL 0x11
  40. // VK_MENU 0x12
  41. // VK_PAUSE 0x13
  42. // VK_CAPITAL 0x14
  43. // VK_KANA 0x15
  44. // VK_HANGUL 0x15
  45. // VK_JUNJA 0x17
  46. // VK_FINAL 0x18
  47. // VK_KANJI 0x19
  48. // ? 0x1A
  49. // VK_ESCAPE 0x1B
  50. // VK_CONVERT 0x1C
  51. // VK_NONCONVERT 0x1D
  52. // VK_ACCEPT 0x1E
  53. // VK_MODECHANGE 0x1F
  54. // VK_SPACE 0x20
  55. // VK_PRIOR 0x21
  56. // VK_NEXT 0x22
  57. // VK_END 0x23
  58. // VK_HOME 0x24
  59. // VK_LEFT 0x25
  60. // VK_UP 0x26
  61. // VK_RIGHT 0x27
  62. // VK_DOWN 0x28
  63. // VK_SELECT 0x29
  64. // VK_PRINT 0x2A
  65. // VK_EXECUTE 0x2B
  66. // VK_SNAPSHOT 0x2C
  67. // VK_INSERT 0x2D
  68. // VK_DELETE 0x2E
  69. // VK_HELP 0x2F
  70. //
  71. // VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39)
  72. //
  73. // VK_0 0x30
  74. // VK_1 0x31
  75. // VK_2 0x32
  76. // VK_3 0x33
  77. // VK_4 0x34
  78. // VK_5 0x35
  79. // VK_6 0x36
  80. // VK_7 0x37
  81. // VK_8 0x38
  82. // VK_9 0x39
  83. // ? 0x40
  84. //
  85. // VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A)
  86. //
  87. // VK_A 0X41
  88. // VK_B 0X42
  89. // VK_C 0X43
  90. // VK_D 0X44
  91. // VK_E 0X45
  92. // VK_F 0X46
  93. // VK_G 0X47
  94. // VK_H 0X48
  95. // VK_I 0X49
  96. // VK_J 0X4A
  97. // VK_K 0X4B
  98. // VK_L 0X4C
  99. // VK_M 0X4D
  100. // VK_N 0X4E
  101. // VK_O 0X4F
  102. // VK_P 0X50
  103. // VK_Q 0X51
  104. // VK_R 0X52
  105. // VK_S 0X53
  106. // VK_T 0X54
  107. // VK_U 0X55
  108. // VK_V 0X56
  109. // VK_W 0X57
  110. // VK_X 0X58
  111. // VK_Y 0X59
  112. // VK_Z 0X5A
  113. // VK_LWIN 0x5B
  114. // VK_RWIN 0x5C
  115. // VK_APPS 0x5D
  116. // ? 0x5E
  117. // ? 0x5F
  118. // VK_NUMPAD0 0x60
  119. // VK_NUMPAD1 0x61
  120. // VK_NUMPAD2 0x62
  121. // VK_NUMPAD3 0x63
  122. // VK_NUMPAD4 0x64
  123. // VK_NUMPAD5 0x65
  124. // VK_NUMPAD6 0x66
  125. // VK_NUMPAD7 0x67
  126. // VK_NUMPAD8 0x68
  127. // VK_NUMPAD9 0x69
  128. // VK_MULTIPLY 0x6A
  129. // VK_ADD 0x6B
  130. // VK_SEPARATOR 0x6C
  131. // VK_SUBTRACT 0x6D
  132. // VK_DECIMAL 0x6E
  133. // VK_DIVIDE 0x6F
  134. //
  135. // Function keys
  136. //
  137. // VK_F1 0x70
  138. // VK_F2 0x71
  139. // VK_F3 0x72
  140. // VK_F4 0x73
  141. // VK_F5 0x74
  142. // VK_F6 0x75
  143. // VK_F7 0x76
  144. // VK_F8 0x77
  145. // VK_F9 0x78
  146. // VK_F10 0x79
  147. // VK_F11 0x7A
  148. // VK_F12 0x7B
  149. // VK_F13 0x7C
  150. // VK_F14 0x7D
  151. // VK_F15 0x7E
  152. // VK_F16 0x7F
  153. // VK_F17 0x80
  154. // VK_F18 0x81
  155. // VK_F19 0x82
  156. // VK_F20 0x83
  157. // VK_F21 0x84
  158. // VK_F22 0x85
  159. // VK_F23 0x86
  160. // VK_F24 0x87
  161. // ? 0x88
  162. // ? 0x89
  163. // ? 0x8A
  164. // ? 0x8B
  165. // ? 0x8C
  166. // ? 0x8D
  167. // ? 0x8E
  168. // ? 0x8F
  169. // VK_NUMLOCK 0x90
  170. // VK_SCROLL 0x91
  171. // ? 0x92
  172. // ? 0x93
  173. // ? 0x94
  174. // ? 0x95
  175. // ? 0x96
  176. // ? 0x97
  177. // ? 0x98
  178. // ? 0x99
  179. // ? 0x9A
  180. // ? 0x9B
  181. // ? 0x9C
  182. // ? 0x9D
  183. // ? 0x9E
  184. // ? 0x9F
  185. //
  186. // VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
  187. // Used only as parameters to GetAsyncKeyState() and GetKeyState().
  188. // No other API or message will distinguish left and right keys in this way.
  189. //
  190. // VK_LSHIFT 0xA0
  191. // VK_RSHIFT 0xA1
  192. // VK_LCONTROL 0xA2
  193. // VK_RCONTROL 0xA3
  194. // VK_LMENU 0xA4
  195. // VK_RMENU 0xA5
  196. // VK_PROCESSKEY 0xE5
  197. // VK_ATTN 0xF6
  198. // VK_CRSEL 0xF7
  199. // VK_EXSEL 0xF8
  200. // VK_EREOF 0xF9
  201. // VK_PLAY 0xFA
  202. // VK_ZOOM 0xFB
  203. // VK_NONAME 0xFC
  204. // VK_PA1 0xFD
  205. // VK_OEM_CLEAR 0xFE
  206. //
  207. //
  208. // Defines the maximum number of logical keys. Logical keys are application-specific
  209. // values that are associated with physical keys via AddKeyMap.
  210. //
  211. #define MAX_LOGICAL_KEYS 256
  212. //
  213. // Defines the maximum number of unique key bindings.
  214. //
  215. #define MAX_KEYMAPS 256
  216. typedef struct
  217. {
  218. unsigned int uChar;
  219. unsigned int uModifierKeys;
  220. unsigned int uLogicalKey;
  221. } KeyMap_t;
  222. class CKeyboard
  223. {
  224. public:
  225. CKeyboard(void);
  226. ~CKeyboard(void);
  227. void AddKeyMap(unsigned int uChar, unsigned int uModifierKeys, unsigned int uLogicalKey);
  228. void ClearImpulseFlags(void);
  229. void ClearKeyStates(void);
  230. float GetKeyScale(unsigned int uLogicalKey);
  231. void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
  232. void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
  233. void RemoveAllKeyMaps(void);
  234. protected:
  235. bool IsKeyPressed(unsigned int uChar, unsigned int uModifierKeys);
  236. bool IsModifierKey(unsigned int uChar);
  237. unsigned int GetModifierKeyBit(unsigned int uChar);
  238. void UpdateLogicalKeys(unsigned int uChar, bool bPressed);
  239. unsigned int g_uPhysicalKeyState[MAX_PHYSICAL_KEYS];
  240. unsigned int g_uLogicalKeyState[MAX_LOGICAL_KEYS];
  241. KeyMap_t g_uKeyMap[MAX_KEYMAPS];
  242. unsigned int g_uKeyMaps;
  243. };
  244. #endif // KEYBOARD_H