KeyCode.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <andreas@ladybird.org>
  3. * Copyright (c) 2024, Andrew Kaster <akaster@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/EnumBits.h>
  9. #include <AK/Platform.h>
  10. #include <AK/StringView.h>
  11. #include <AK/Types.h>
  12. namespace Web::UIEvents {
  13. #define ENUMERATE_KEY_CODES \
  14. __ENUMERATE_KEY_CODE(Invalid, "Invalid", 0x00) \
  15. __ENUMERATE_KEY_CODE(Backspace, "Backspace", 0x08) \
  16. __ENUMERATE_KEY_CODE(Tab, "Tab", 0x09) \
  17. __ENUMERATE_KEY_CODE(Return, "Return", 0x0D) \
  18. __ENUMERATE_KEY_CODE(LeftShift, "LeftShift", 0x10) \
  19. __ENUMERATE_KEY_CODE(RightShift, "RightShift", 0xB0) \
  20. __ENUMERATE_KEY_CODE(LeftControl, "LeftControl", 0x11) \
  21. __ENUMERATE_KEY_CODE(RightControl, "RightControl", 0xB1) \
  22. __ENUMERATE_KEY_CODE(LeftAlt, "LeftAlt", 0x12) \
  23. __ENUMERATE_KEY_CODE(RightAlt, "RightAlt", 0xB2) \
  24. __ENUMERATE_KEY_CODE(AltGr, "AltGr", 0xE1) \
  25. __ENUMERATE_KEY_CODE(PauseBreak, "PauseBreak", 0x13) \
  26. __ENUMERATE_KEY_CODE(CapsLock, "CapsLock", 0x14) \
  27. __ENUMERATE_KEY_CODE(Escape, "Escape", 0x1B) \
  28. __ENUMERATE_KEY_CODE(Space, "Space", 0x20) \
  29. __ENUMERATE_KEY_CODE(PageUp, "PageUp", 0x21) \
  30. __ENUMERATE_KEY_CODE(PageDown, "PageDown", 0x22) \
  31. __ENUMERATE_KEY_CODE(End, "End", 0x23) \
  32. __ENUMERATE_KEY_CODE(Home, "Home", 0x24) \
  33. __ENUMERATE_KEY_CODE(Left, "Left", 0x25) \
  34. __ENUMERATE_KEY_CODE(Up, "Up", 0x26) \
  35. __ENUMERATE_KEY_CODE(Right, "Right", 0x27) \
  36. __ENUMERATE_KEY_CODE(Down, "Down", 0x28) \
  37. __ENUMERATE_KEY_CODE(PrintScreen, "PrintScreen", 0x2A) \
  38. __ENUMERATE_KEY_CODE(SysRq, "SysRq", 0x2C) \
  39. __ENUMERATE_KEY_CODE(Delete, "Delete", 0x2E) \
  40. __ENUMERATE_KEY_CODE(0, "0", 0x30) \
  41. __ENUMERATE_KEY_CODE(1, "1", 0x31) \
  42. __ENUMERATE_KEY_CODE(2, "2", 0x32) \
  43. __ENUMERATE_KEY_CODE(3, "3", 0x33) \
  44. __ENUMERATE_KEY_CODE(4, "4", 0x34) \
  45. __ENUMERATE_KEY_CODE(5, "5", 0x35) \
  46. __ENUMERATE_KEY_CODE(6, "6", 0x36) \
  47. __ENUMERATE_KEY_CODE(7, "7", 0x37) \
  48. __ENUMERATE_KEY_CODE(8, "8", 0x38) \
  49. __ENUMERATE_KEY_CODE(9, "9", 0x39) \
  50. __ENUMERATE_KEY_CODE(A, "A", 0x41) \
  51. __ENUMERATE_KEY_CODE(B, "B", 0x42) \
  52. __ENUMERATE_KEY_CODE(C, "C", 0x43) \
  53. __ENUMERATE_KEY_CODE(D, "D", 0x44) \
  54. __ENUMERATE_KEY_CODE(E, "E", 0x45) \
  55. __ENUMERATE_KEY_CODE(F, "F", 0x46) \
  56. __ENUMERATE_KEY_CODE(G, "G", 0x47) \
  57. __ENUMERATE_KEY_CODE(H, "H", 0x48) \
  58. __ENUMERATE_KEY_CODE(I, "I", 0x49) \
  59. __ENUMERATE_KEY_CODE(J, "J", 0x4A) \
  60. __ENUMERATE_KEY_CODE(K, "K", 0x4B) \
  61. __ENUMERATE_KEY_CODE(L, "L", 0x4C) \
  62. __ENUMERATE_KEY_CODE(M, "M", 0x4D) \
  63. __ENUMERATE_KEY_CODE(N, "N", 0x4E) \
  64. __ENUMERATE_KEY_CODE(O, "O", 0x4F) \
  65. __ENUMERATE_KEY_CODE(P, "P", 0x50) \
  66. __ENUMERATE_KEY_CODE(Q, "Q", 0x51) \
  67. __ENUMERATE_KEY_CODE(R, "R", 0x52) \
  68. __ENUMERATE_KEY_CODE(S, "S", 0x53) \
  69. __ENUMERATE_KEY_CODE(T, "T", 0x54) \
  70. __ENUMERATE_KEY_CODE(U, "U", 0x55) \
  71. __ENUMERATE_KEY_CODE(V, "V", 0x56) \
  72. __ENUMERATE_KEY_CODE(W, "W", 0x57) \
  73. __ENUMERATE_KEY_CODE(X, "X", 0x58) \
  74. __ENUMERATE_KEY_CODE(Y, "Y", 0x59) \
  75. __ENUMERATE_KEY_CODE(Z, "Z", 0x5A) \
  76. __ENUMERATE_KEY_CODE(RightParen, ")", 0x60) \
  77. __ENUMERATE_KEY_CODE(ExclamationPoint, "!", 0x61) \
  78. __ENUMERATE_KEY_CODE(AtSign, "@", 0x62) \
  79. __ENUMERATE_KEY_CODE(Hashtag, "#", 0x63) \
  80. __ENUMERATE_KEY_CODE(Dollar, "$", 0x64) \
  81. __ENUMERATE_KEY_CODE(Percent, "%", 0x65) \
  82. __ENUMERATE_KEY_CODE(Circumflex, "^", 0x66) \
  83. __ENUMERATE_KEY_CODE(Ampersand, "&", 0x67) \
  84. __ENUMERATE_KEY_CODE(Asterisk, "*", 0x68) \
  85. __ENUMERATE_KEY_CODE(LeftParen, "(", 0x69) \
  86. __ENUMERATE_KEY_CODE(Plus, "+", 0x6A) \
  87. __ENUMERATE_KEY_CODE(Minus, "-", 0x6B) \
  88. __ENUMERATE_KEY_CODE(Slash, "/", 0x6C) \
  89. __ENUMERATE_KEY_CODE(Comma, ",", 0x6D) \
  90. __ENUMERATE_KEY_CODE(Period, ".", 0x6E) \
  91. __ENUMERATE_KEY_CODE(Colon, ":", 0x6F) \
  92. __ENUMERATE_KEY_CODE(F1, "F1", 0x70) \
  93. __ENUMERATE_KEY_CODE(F2, "F2", 0x71) \
  94. __ENUMERATE_KEY_CODE(F3, "F3", 0x72) \
  95. __ENUMERATE_KEY_CODE(F4, "F4", 0x73) \
  96. __ENUMERATE_KEY_CODE(F5, "F5", 0x74) \
  97. __ENUMERATE_KEY_CODE(F6, "F6", 0x75) \
  98. __ENUMERATE_KEY_CODE(F7, "F7", 0x76) \
  99. __ENUMERATE_KEY_CODE(F8, "F8", 0x77) \
  100. __ENUMERATE_KEY_CODE(F9, "F9", 0x78) \
  101. __ENUMERATE_KEY_CODE(F10, "F10", 0x79) \
  102. __ENUMERATE_KEY_CODE(F11, "F11", 0x7A) \
  103. __ENUMERATE_KEY_CODE(F12, "F12", 0x7B) \
  104. __ENUMERATE_KEY_CODE(DoubleQuote, "\"", 0x7C) \
  105. __ENUMERATE_KEY_CODE(Apostrophe, "'", 0x7D) \
  106. __ENUMERATE_KEY_CODE(Insert, "Insert", 0x7E) \
  107. __ENUMERATE_KEY_CODE(Semicolon, ";", 0x7F) \
  108. __ENUMERATE_KEY_CODE(LessThan, "<", 0x80) \
  109. __ENUMERATE_KEY_CODE(Equal, "=", 0x81) \
  110. __ENUMERATE_KEY_CODE(GreaterThan, ">", 0x82) \
  111. __ENUMERATE_KEY_CODE(QuestionMark, "?", 0x83) \
  112. __ENUMERATE_KEY_CODE(LeftBracket, "[", 0x84) \
  113. __ENUMERATE_KEY_CODE(RightBracket, "]", 0x85) \
  114. __ENUMERATE_KEY_CODE(Backslash, "\\", 0x86) \
  115. __ENUMERATE_KEY_CODE(Underscore, "_", 0x87) \
  116. __ENUMERATE_KEY_CODE(LeftBrace, "{", 0x88) \
  117. __ENUMERATE_KEY_CODE(RightBrace, "}", 0x89) \
  118. __ENUMERATE_KEY_CODE(Pipe, "|", 0x8A) \
  119. __ENUMERATE_KEY_CODE(Tilde, "~", 0x8B) \
  120. __ENUMERATE_KEY_CODE(Backtick, "`", 0x8C) \
  121. __ENUMERATE_KEY_CODE(NumLock, "NumLock", 0x90) \
  122. __ENUMERATE_KEY_CODE(ScrollLock, "ScrollLock", 0x91) \
  123. __ENUMERATE_KEY_CODE(LeftSuper, "LeftSuper", 0x92) \
  124. __ENUMERATE_KEY_CODE(RightSuper, "RightSuper", 0xAC) \
  125. __ENUMERATE_KEY_CODE(BrowserSearch, "BrowserSearch", 0x93) \
  126. __ENUMERATE_KEY_CODE(BrowserFavorites, "BrowserFavorites", 0x94) \
  127. __ENUMERATE_KEY_CODE(BrowserHome, "BrowserHome", 0x95) \
  128. __ENUMERATE_KEY_CODE(PreviousTrack, "PreviousTrack", 0x96) \
  129. __ENUMERATE_KEY_CODE(BrowserBack, "BrowserBack", 0x97) \
  130. __ENUMERATE_KEY_CODE(BrowserForward, "BrowserForward", 0x98) \
  131. __ENUMERATE_KEY_CODE(BrowserRefresh, "BrowserRefresh", 0x99) \
  132. __ENUMERATE_KEY_CODE(BrowserStop, "BrowserStop", 0x9A) \
  133. __ENUMERATE_KEY_CODE(VolumeDown, "VolumeDown", 0x9B) \
  134. __ENUMERATE_KEY_CODE(VolumeUp, "VolumeUp", 0x9C) \
  135. __ENUMERATE_KEY_CODE(Wake, "Wake", 0x9D) \
  136. __ENUMERATE_KEY_CODE(Sleep, "Sleep", 0x9E) \
  137. __ENUMERATE_KEY_CODE(NextTrack, "NextTrack", 0x9F) \
  138. __ENUMERATE_KEY_CODE(MediaSelect, "MediaSelect", 0xA0) \
  139. __ENUMERATE_KEY_CODE(Email, "Email", 0xA1) \
  140. __ENUMERATE_KEY_CODE(MyComputer, "MyComputer", 0xA2) \
  141. __ENUMERATE_KEY_CODE(Power, "Power", 0xA3) \
  142. __ENUMERATE_KEY_CODE(Stop, "Stop", 0xA4) \
  143. __ENUMERATE_KEY_CODE(LeftGUI, "LeftGUI", 0xA5) \
  144. __ENUMERATE_KEY_CODE(Mute, "Mute", 0xA6) \
  145. __ENUMERATE_KEY_CODE(RightGUI, "RightGUI", 0xA7) \
  146. __ENUMERATE_KEY_CODE(Calculator, "Calculator", 0xA8) \
  147. __ENUMERATE_KEY_CODE(Apps, "Apps", 0xA9) \
  148. __ENUMERATE_KEY_CODE(PlayPause, "PlayPause", 0xAA) \
  149. __ENUMERATE_KEY_CODE(Menu, "Menu", 0xAB)
  150. enum KeyCode : u8 {
  151. #define __ENUMERATE_KEY_CODE(name, ui_name, code) Key_##name = code,
  152. ENUMERATE_KEY_CODES
  153. #undef __ENUMERATE_KEY_CODE
  154. };
  155. constexpr KeyCode key_code_from_string(StringView key_name)
  156. {
  157. #define __ENUMERATE_KEY_CODE(name, ui_name, code) \
  158. if (key_name == ui_name##sv) \
  159. return KeyCode::Key_##name;
  160. ENUMERATE_KEY_CODES
  161. #undef __ENUMERATE_KEY_CODE
  162. VERIFY_NOT_REACHED();
  163. }
  164. enum KeyModifier {
  165. Mod_None = 0x00,
  166. Mod_Alt = (1 << 0),
  167. Mod_Ctrl = (1 << 1),
  168. Mod_Shift = (1 << 2),
  169. Mod_Super = (1 << 3),
  170. Mod_Keypad = (1 << 4),
  171. Mod_Mask = Mod_Alt | Mod_Ctrl | Mod_Shift | Mod_Super | Mod_Keypad,
  172. Is_Press = 0x80,
  173. #if defined(AK_OS_MACOS)
  174. Mod_PlatformCtrl = Mod_Super,
  175. Mod_PlatformWordJump = Mod_Alt,
  176. #else
  177. Mod_PlatformCtrl = Mod_Ctrl,
  178. Mod_PlatformWordJump = Mod_Ctrl,
  179. #endif
  180. };
  181. AK_ENUM_BITWISE_OPERATORS(KeyModifier);
  182. inline KeyCode code_point_to_key_code(u32 code_point)
  183. {
  184. switch (code_point) {
  185. #define MATCH_ALPHA(letter) \
  186. case #letter[0]: \
  187. case #letter[0] + 32: \
  188. return KeyCode::Key_##letter;
  189. MATCH_ALPHA(A)
  190. MATCH_ALPHA(B)
  191. MATCH_ALPHA(C)
  192. MATCH_ALPHA(D)
  193. MATCH_ALPHA(E)
  194. MATCH_ALPHA(F)
  195. MATCH_ALPHA(G)
  196. MATCH_ALPHA(H)
  197. MATCH_ALPHA(I)
  198. MATCH_ALPHA(J)
  199. MATCH_ALPHA(K)
  200. MATCH_ALPHA(L)
  201. MATCH_ALPHA(M)
  202. MATCH_ALPHA(N)
  203. MATCH_ALPHA(O)
  204. MATCH_ALPHA(P)
  205. MATCH_ALPHA(Q)
  206. MATCH_ALPHA(R)
  207. MATCH_ALPHA(S)
  208. MATCH_ALPHA(T)
  209. MATCH_ALPHA(U)
  210. MATCH_ALPHA(V)
  211. MATCH_ALPHA(W)
  212. MATCH_ALPHA(X)
  213. MATCH_ALPHA(Y)
  214. MATCH_ALPHA(Z)
  215. #undef MATCH_ALPHA
  216. #define MATCH_KEY(name, character) \
  217. case character: \
  218. return KeyCode::Key_##name;
  219. MATCH_KEY(ExclamationPoint, '!')
  220. MATCH_KEY(DoubleQuote, '"')
  221. MATCH_KEY(Hashtag, '#')
  222. MATCH_KEY(Dollar, '$')
  223. MATCH_KEY(Percent, '%')
  224. MATCH_KEY(Ampersand, '&')
  225. MATCH_KEY(Apostrophe, '\'')
  226. MATCH_KEY(LeftParen, '(')
  227. MATCH_KEY(RightParen, ')')
  228. MATCH_KEY(Asterisk, '*')
  229. MATCH_KEY(Plus, '+')
  230. MATCH_KEY(Comma, ',')
  231. MATCH_KEY(Minus, '-')
  232. MATCH_KEY(Period, '.')
  233. MATCH_KEY(Slash, '/')
  234. MATCH_KEY(0, '0')
  235. MATCH_KEY(1, '1')
  236. MATCH_KEY(2, '2')
  237. MATCH_KEY(3, '3')
  238. MATCH_KEY(4, '4')
  239. MATCH_KEY(5, '5')
  240. MATCH_KEY(6, '6')
  241. MATCH_KEY(7, '7')
  242. MATCH_KEY(8, '8')
  243. MATCH_KEY(9, '9')
  244. MATCH_KEY(Colon, ':')
  245. MATCH_KEY(Semicolon, ';')
  246. MATCH_KEY(LessThan, '<')
  247. MATCH_KEY(Equal, '=')
  248. MATCH_KEY(GreaterThan, '>')
  249. MATCH_KEY(QuestionMark, '?')
  250. MATCH_KEY(AtSign, '@')
  251. MATCH_KEY(LeftBracket, '[')
  252. MATCH_KEY(RightBracket, ']')
  253. MATCH_KEY(Backslash, '\\')
  254. MATCH_KEY(Circumflex, '^')
  255. MATCH_KEY(Underscore, '_')
  256. MATCH_KEY(LeftBrace, '{')
  257. MATCH_KEY(RightBrace, '}')
  258. MATCH_KEY(Pipe, '|')
  259. MATCH_KEY(Tilde, '~')
  260. MATCH_KEY(Backtick, '`')
  261. MATCH_KEY(Space, ' ')
  262. MATCH_KEY(Tab, '\t')
  263. MATCH_KEY(Backspace, '\b')
  264. #undef MATCH_KEY
  265. default:
  266. return KeyCode::Key_Invalid;
  267. }
  268. }
  269. }