KeyCode.h 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Types.h>
  8. #define ENUMERATE_KEY_CODES \
  9. __ENUMERATE_KEY_CODE(Invalid, "Invalid") \
  10. __ENUMERATE_KEY_CODE(Escape, "Escape") \
  11. __ENUMERATE_KEY_CODE(Tab, "Tab") \
  12. __ENUMERATE_KEY_CODE(Backspace, "Backspace") \
  13. __ENUMERATE_KEY_CODE(Return, "Return") \
  14. __ENUMERATE_KEY_CODE(Insert, "Insert") \
  15. __ENUMERATE_KEY_CODE(Delete, "Delete") \
  16. __ENUMERATE_KEY_CODE(PrintScreen, "PrintScreen") \
  17. __ENUMERATE_KEY_CODE(SysRq, "SysRq") \
  18. __ENUMERATE_KEY_CODE(Home, "Home") \
  19. __ENUMERATE_KEY_CODE(End, "End") \
  20. __ENUMERATE_KEY_CODE(Left, "Left") \
  21. __ENUMERATE_KEY_CODE(Up, "Up") \
  22. __ENUMERATE_KEY_CODE(Right, "Right") \
  23. __ENUMERATE_KEY_CODE(Down, "Down") \
  24. __ENUMERATE_KEY_CODE(PageUp, "PageUp") \
  25. __ENUMERATE_KEY_CODE(PageDown, "PageDown") \
  26. __ENUMERATE_KEY_CODE(LeftShift, "LeftShift") \
  27. __ENUMERATE_KEY_CODE(RightShift, "RightShift") \
  28. __ENUMERATE_KEY_CODE(Control, "Ctrl") \
  29. __ENUMERATE_KEY_CODE(Alt, "Alt") \
  30. __ENUMERATE_KEY_CODE(CapsLock, "CapsLock") \
  31. __ENUMERATE_KEY_CODE(NumLock, "NumLock") \
  32. __ENUMERATE_KEY_CODE(ScrollLock, "ScrollLock") \
  33. __ENUMERATE_KEY_CODE(F1, "F1") \
  34. __ENUMERATE_KEY_CODE(F2, "F2") \
  35. __ENUMERATE_KEY_CODE(F3, "F3") \
  36. __ENUMERATE_KEY_CODE(F4, "F4") \
  37. __ENUMERATE_KEY_CODE(F5, "F5") \
  38. __ENUMERATE_KEY_CODE(F6, "F6") \
  39. __ENUMERATE_KEY_CODE(F7, "F7") \
  40. __ENUMERATE_KEY_CODE(F8, "F8") \
  41. __ENUMERATE_KEY_CODE(F9, "F9") \
  42. __ENUMERATE_KEY_CODE(F10, "F10") \
  43. __ENUMERATE_KEY_CODE(F11, "F11") \
  44. __ENUMERATE_KEY_CODE(F12, "F12") \
  45. __ENUMERATE_KEY_CODE(Space, "Space") \
  46. __ENUMERATE_KEY_CODE(ExclamationPoint, "!") \
  47. __ENUMERATE_KEY_CODE(DoubleQuote, "\"") \
  48. __ENUMERATE_KEY_CODE(Hashtag, "#") \
  49. __ENUMERATE_KEY_CODE(Dollar, "$") \
  50. __ENUMERATE_KEY_CODE(Percent, "%") \
  51. __ENUMERATE_KEY_CODE(Ampersand, "&") \
  52. __ENUMERATE_KEY_CODE(Apostrophe, "'") \
  53. __ENUMERATE_KEY_CODE(LeftParen, "(") \
  54. __ENUMERATE_KEY_CODE(RightParen, ")") \
  55. __ENUMERATE_KEY_CODE(Asterisk, "*") \
  56. __ENUMERATE_KEY_CODE(Plus, "+") \
  57. __ENUMERATE_KEY_CODE(Comma, ",") \
  58. __ENUMERATE_KEY_CODE(Minus, "-") \
  59. __ENUMERATE_KEY_CODE(Period, ".") \
  60. __ENUMERATE_KEY_CODE(Slash, "/") \
  61. __ENUMERATE_KEY_CODE(0, "0") \
  62. __ENUMERATE_KEY_CODE(1, "1") \
  63. __ENUMERATE_KEY_CODE(2, "2") \
  64. __ENUMERATE_KEY_CODE(3, "3") \
  65. __ENUMERATE_KEY_CODE(4, "4") \
  66. __ENUMERATE_KEY_CODE(5, "5") \
  67. __ENUMERATE_KEY_CODE(6, "6") \
  68. __ENUMERATE_KEY_CODE(7, "7") \
  69. __ENUMERATE_KEY_CODE(8, "8") \
  70. __ENUMERATE_KEY_CODE(9, "9") \
  71. __ENUMERATE_KEY_CODE(Colon, ":") \
  72. __ENUMERATE_KEY_CODE(Semicolon, ";") \
  73. __ENUMERATE_KEY_CODE(LessThan, "<") \
  74. __ENUMERATE_KEY_CODE(Equal, "=") \
  75. __ENUMERATE_KEY_CODE(GreaterThan, ">") \
  76. __ENUMERATE_KEY_CODE(QuestionMark, "?") \
  77. __ENUMERATE_KEY_CODE(AtSign, "@") \
  78. __ENUMERATE_KEY_CODE(A, "A") \
  79. __ENUMERATE_KEY_CODE(B, "B") \
  80. __ENUMERATE_KEY_CODE(C, "C") \
  81. __ENUMERATE_KEY_CODE(D, "D") \
  82. __ENUMERATE_KEY_CODE(E, "E") \
  83. __ENUMERATE_KEY_CODE(F, "F") \
  84. __ENUMERATE_KEY_CODE(G, "G") \
  85. __ENUMERATE_KEY_CODE(H, "H") \
  86. __ENUMERATE_KEY_CODE(I, "I") \
  87. __ENUMERATE_KEY_CODE(J, "J") \
  88. __ENUMERATE_KEY_CODE(K, "K") \
  89. __ENUMERATE_KEY_CODE(L, "L") \
  90. __ENUMERATE_KEY_CODE(M, "M") \
  91. __ENUMERATE_KEY_CODE(N, "N") \
  92. __ENUMERATE_KEY_CODE(O, "O") \
  93. __ENUMERATE_KEY_CODE(P, "P") \
  94. __ENUMERATE_KEY_CODE(Q, "Q") \
  95. __ENUMERATE_KEY_CODE(R, "R") \
  96. __ENUMERATE_KEY_CODE(S, "S") \
  97. __ENUMERATE_KEY_CODE(T, "T") \
  98. __ENUMERATE_KEY_CODE(U, "U") \
  99. __ENUMERATE_KEY_CODE(V, "V") \
  100. __ENUMERATE_KEY_CODE(W, "W") \
  101. __ENUMERATE_KEY_CODE(X, "X") \
  102. __ENUMERATE_KEY_CODE(Y, "Y") \
  103. __ENUMERATE_KEY_CODE(Z, "Z") \
  104. __ENUMERATE_KEY_CODE(LeftBracket, "[") \
  105. __ENUMERATE_KEY_CODE(RightBracket, "]") \
  106. __ENUMERATE_KEY_CODE(Backslash, "\\") \
  107. __ENUMERATE_KEY_CODE(Circumflex, "^") \
  108. __ENUMERATE_KEY_CODE(Underscore, "_") \
  109. __ENUMERATE_KEY_CODE(LeftBrace, "{") \
  110. __ENUMERATE_KEY_CODE(RightBrace, "}") \
  111. __ENUMERATE_KEY_CODE(Pipe, "|") \
  112. __ENUMERATE_KEY_CODE(Tilde, "~") \
  113. __ENUMERATE_KEY_CODE(Backtick, "`") \
  114. __ENUMERATE_KEY_CODE(Super, "Super") \
  115. __ENUMERATE_KEY_CODE(Menu, "Menu")
  116. enum KeyCode : u8 {
  117. #define __ENUMERATE_KEY_CODE(name, ui_name) Key_##name,
  118. ENUMERATE_KEY_CODES
  119. #undef __ENUMERATE_KEY_CODE
  120. Key_Shift
  121. = Key_LeftShift,
  122. };
  123. const int key_code_count = Key_Menu;
  124. enum KeyModifier {
  125. Mod_None = 0x00,
  126. Mod_Alt = 0x01,
  127. Mod_Ctrl = 0x02,
  128. Mod_Shift = 0x04,
  129. Mod_Super = 0x08,
  130. Mod_AltGr = 0x10,
  131. Mod_Mask = 0x1f,
  132. Is_Press = 0x80,
  133. };
  134. struct KeyEvent {
  135. KeyCode key { Key_Invalid };
  136. u32 scancode { 0 };
  137. u32 code_point { 0 };
  138. u8 flags { 0 };
  139. bool caps_lock_on { false };
  140. bool e0_prefix { false };
  141. bool alt() const { return flags & Mod_Alt; }
  142. bool ctrl() const { return flags & Mod_Ctrl; }
  143. bool shift() const { return flags & Mod_Shift; }
  144. bool super() const { return flags & Mod_Super; }
  145. bool altgr() const { return flags & Mod_AltGr; }
  146. unsigned modifiers() const { return flags & Mod_Mask; }
  147. bool is_press() const { return flags & Is_Press; }
  148. };
  149. inline const char* key_code_to_string(KeyCode key)
  150. {
  151. switch (key) {
  152. #define __ENUMERATE_KEY_CODE(name, ui_name) \
  153. case Key_##name: \
  154. return ui_name;
  155. ENUMERATE_KEY_CODES
  156. #undef __ENUMERATE_KEY_CODE
  157. default:
  158. return nullptr;
  159. }
  160. }
  161. inline KeyCode code_point_to_key_code(u32 code_point)
  162. {
  163. switch (code_point) {
  164. #define MATCH_ALPHA(letter) \
  165. case #letter[0]: \
  166. case #letter[0] + 32: \
  167. return KeyCode::Key_##letter;
  168. MATCH_ALPHA(A)
  169. MATCH_ALPHA(B)
  170. MATCH_ALPHA(C)
  171. MATCH_ALPHA(D)
  172. MATCH_ALPHA(E)
  173. MATCH_ALPHA(F)
  174. MATCH_ALPHA(G)
  175. MATCH_ALPHA(H)
  176. MATCH_ALPHA(I)
  177. MATCH_ALPHA(J)
  178. MATCH_ALPHA(K)
  179. MATCH_ALPHA(L)
  180. MATCH_ALPHA(M)
  181. MATCH_ALPHA(N)
  182. MATCH_ALPHA(O)
  183. MATCH_ALPHA(P)
  184. MATCH_ALPHA(Q)
  185. MATCH_ALPHA(R)
  186. MATCH_ALPHA(S)
  187. MATCH_ALPHA(T)
  188. MATCH_ALPHA(U)
  189. MATCH_ALPHA(V)
  190. MATCH_ALPHA(W)
  191. MATCH_ALPHA(X)
  192. MATCH_ALPHA(Y)
  193. MATCH_ALPHA(Z)
  194. #undef MATCH_ALPHA
  195. #define MATCH_KEY(name, character) \
  196. case character: \
  197. return KeyCode::Key_##name;
  198. MATCH_KEY(ExclamationPoint, '!')
  199. MATCH_KEY(DoubleQuote, '"')
  200. MATCH_KEY(Hashtag, '#')
  201. MATCH_KEY(Dollar, '$')
  202. MATCH_KEY(Percent, '%')
  203. MATCH_KEY(Ampersand, '&')
  204. MATCH_KEY(Apostrophe, '\'')
  205. MATCH_KEY(LeftParen, '(')
  206. MATCH_KEY(RightParen, ')')
  207. MATCH_KEY(Asterisk, '*')
  208. MATCH_KEY(Plus, '+')
  209. MATCH_KEY(Comma, ',')
  210. MATCH_KEY(Minus, '-')
  211. MATCH_KEY(Period, '.')
  212. MATCH_KEY(Slash, '/')
  213. MATCH_KEY(0, '0')
  214. MATCH_KEY(1, '1')
  215. MATCH_KEY(2, '2')
  216. MATCH_KEY(3, '3')
  217. MATCH_KEY(4, '4')
  218. MATCH_KEY(5, '5')
  219. MATCH_KEY(6, '6')
  220. MATCH_KEY(7, '7')
  221. MATCH_KEY(8, '8')
  222. MATCH_KEY(9, '9')
  223. MATCH_KEY(Colon, ':')
  224. MATCH_KEY(Semicolon, ';')
  225. MATCH_KEY(LessThan, '<')
  226. MATCH_KEY(Equal, '=')
  227. MATCH_KEY(GreaterThan, '>')
  228. MATCH_KEY(QuestionMark, '?')
  229. MATCH_KEY(AtSign, '@')
  230. MATCH_KEY(LeftBracket, '[')
  231. MATCH_KEY(RightBracket, ']')
  232. MATCH_KEY(Backslash, '\\')
  233. MATCH_KEY(Circumflex, '^')
  234. MATCH_KEY(Underscore, '_')
  235. MATCH_KEY(LeftBrace, '{')
  236. MATCH_KEY(RightBrace, '}')
  237. MATCH_KEY(Pipe, '|')
  238. MATCH_KEY(Tilde, '~')
  239. MATCH_KEY(Backtick, '`')
  240. MATCH_KEY(Space, ' ')
  241. MATCH_KEY(Tab, '\t')
  242. MATCH_KEY(Backspace, '\b')
  243. #undef MATCH_KEY
  244. default:
  245. return KeyCode::Key_Invalid;
  246. }
  247. }