keyboardEvent.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. import * as browser from './browser.js';
  6. import { KeyCodeUtils, SimpleKeybinding } from '../common/keyCodes.js';
  7. import * as platform from '../common/platform.js';
  8. let KEY_CODE_MAP = new Array(230);
  9. let INVERSE_KEY_CODE_MAP = new Array(112 /* MAX_VALUE */);
  10. (function () {
  11. for (let i = 0; i < INVERSE_KEY_CODE_MAP.length; i++) {
  12. INVERSE_KEY_CODE_MAP[i] = -1;
  13. }
  14. function define(code, keyCode) {
  15. KEY_CODE_MAP[code] = keyCode;
  16. INVERSE_KEY_CODE_MAP[keyCode] = code;
  17. }
  18. define(3, 7 /* PauseBreak */); // VK_CANCEL 0x03 Control-break processing
  19. define(8, 1 /* Backspace */);
  20. define(9, 2 /* Tab */);
  21. define(13, 3 /* Enter */);
  22. define(16, 4 /* Shift */);
  23. define(17, 5 /* Ctrl */);
  24. define(18, 6 /* Alt */);
  25. define(19, 7 /* PauseBreak */);
  26. define(20, 8 /* CapsLock */);
  27. define(27, 9 /* Escape */);
  28. define(32, 10 /* Space */);
  29. define(33, 11 /* PageUp */);
  30. define(34, 12 /* PageDown */);
  31. define(35, 13 /* End */);
  32. define(36, 14 /* Home */);
  33. define(37, 15 /* LeftArrow */);
  34. define(38, 16 /* UpArrow */);
  35. define(39, 17 /* RightArrow */);
  36. define(40, 18 /* DownArrow */);
  37. define(45, 19 /* Insert */);
  38. define(46, 20 /* Delete */);
  39. define(48, 21 /* KEY_0 */);
  40. define(49, 22 /* KEY_1 */);
  41. define(50, 23 /* KEY_2 */);
  42. define(51, 24 /* KEY_3 */);
  43. define(52, 25 /* KEY_4 */);
  44. define(53, 26 /* KEY_5 */);
  45. define(54, 27 /* KEY_6 */);
  46. define(55, 28 /* KEY_7 */);
  47. define(56, 29 /* KEY_8 */);
  48. define(57, 30 /* KEY_9 */);
  49. define(65, 31 /* KEY_A */);
  50. define(66, 32 /* KEY_B */);
  51. define(67, 33 /* KEY_C */);
  52. define(68, 34 /* KEY_D */);
  53. define(69, 35 /* KEY_E */);
  54. define(70, 36 /* KEY_F */);
  55. define(71, 37 /* KEY_G */);
  56. define(72, 38 /* KEY_H */);
  57. define(73, 39 /* KEY_I */);
  58. define(74, 40 /* KEY_J */);
  59. define(75, 41 /* KEY_K */);
  60. define(76, 42 /* KEY_L */);
  61. define(77, 43 /* KEY_M */);
  62. define(78, 44 /* KEY_N */);
  63. define(79, 45 /* KEY_O */);
  64. define(80, 46 /* KEY_P */);
  65. define(81, 47 /* KEY_Q */);
  66. define(82, 48 /* KEY_R */);
  67. define(83, 49 /* KEY_S */);
  68. define(84, 50 /* KEY_T */);
  69. define(85, 51 /* KEY_U */);
  70. define(86, 52 /* KEY_V */);
  71. define(87, 53 /* KEY_W */);
  72. define(88, 54 /* KEY_X */);
  73. define(89, 55 /* KEY_Y */);
  74. define(90, 56 /* KEY_Z */);
  75. define(93, 58 /* ContextMenu */);
  76. define(96, 93 /* NUMPAD_0 */);
  77. define(97, 94 /* NUMPAD_1 */);
  78. define(98, 95 /* NUMPAD_2 */);
  79. define(99, 96 /* NUMPAD_3 */);
  80. define(100, 97 /* NUMPAD_4 */);
  81. define(101, 98 /* NUMPAD_5 */);
  82. define(102, 99 /* NUMPAD_6 */);
  83. define(103, 100 /* NUMPAD_7 */);
  84. define(104, 101 /* NUMPAD_8 */);
  85. define(105, 102 /* NUMPAD_9 */);
  86. define(106, 103 /* NUMPAD_MULTIPLY */);
  87. define(107, 104 /* NUMPAD_ADD */);
  88. define(108, 105 /* NUMPAD_SEPARATOR */);
  89. define(109, 106 /* NUMPAD_SUBTRACT */);
  90. define(110, 107 /* NUMPAD_DECIMAL */);
  91. define(111, 108 /* NUMPAD_DIVIDE */);
  92. define(112, 59 /* F1 */);
  93. define(113, 60 /* F2 */);
  94. define(114, 61 /* F3 */);
  95. define(115, 62 /* F4 */);
  96. define(116, 63 /* F5 */);
  97. define(117, 64 /* F6 */);
  98. define(118, 65 /* F7 */);
  99. define(119, 66 /* F8 */);
  100. define(120, 67 /* F9 */);
  101. define(121, 68 /* F10 */);
  102. define(122, 69 /* F11 */);
  103. define(123, 70 /* F12 */);
  104. define(124, 71 /* F13 */);
  105. define(125, 72 /* F14 */);
  106. define(126, 73 /* F15 */);
  107. define(127, 74 /* F16 */);
  108. define(128, 75 /* F17 */);
  109. define(129, 76 /* F18 */);
  110. define(130, 77 /* F19 */);
  111. define(144, 78 /* NumLock */);
  112. define(145, 79 /* ScrollLock */);
  113. define(186, 80 /* US_SEMICOLON */);
  114. define(187, 81 /* US_EQUAL */);
  115. define(188, 82 /* US_COMMA */);
  116. define(189, 83 /* US_MINUS */);
  117. define(190, 84 /* US_DOT */);
  118. define(191, 85 /* US_SLASH */);
  119. define(192, 86 /* US_BACKTICK */);
  120. define(193, 110 /* ABNT_C1 */);
  121. define(194, 111 /* ABNT_C2 */);
  122. define(219, 87 /* US_OPEN_SQUARE_BRACKET */);
  123. define(220, 88 /* US_BACKSLASH */);
  124. define(221, 89 /* US_CLOSE_SQUARE_BRACKET */);
  125. define(222, 90 /* US_QUOTE */);
  126. define(223, 91 /* OEM_8 */);
  127. define(226, 92 /* OEM_102 */);
  128. /**
  129. * https://lists.w3.org/Archives/Public/www-dom/2010JulSep/att-0182/keyCode-spec.html
  130. * If an Input Method Editor is processing key input and the event is keydown, return 229.
  131. */
  132. define(229, 109 /* KEY_IN_COMPOSITION */);
  133. if (browser.isFirefox) {
  134. define(59, 80 /* US_SEMICOLON */);
  135. define(107, 81 /* US_EQUAL */);
  136. define(109, 83 /* US_MINUS */);
  137. if (platform.isMacintosh) {
  138. define(224, 57 /* Meta */);
  139. }
  140. }
  141. else if (browser.isWebKit) {
  142. define(91, 57 /* Meta */);
  143. if (platform.isMacintosh) {
  144. // the two meta keys in the Mac have different key codes (91 and 93)
  145. define(93, 57 /* Meta */);
  146. }
  147. else {
  148. define(92, 57 /* Meta */);
  149. }
  150. }
  151. })();
  152. function extractKeyCode(e) {
  153. if (e.charCode) {
  154. // "keypress" events mostly
  155. let char = String.fromCharCode(e.charCode).toUpperCase();
  156. return KeyCodeUtils.fromString(char);
  157. }
  158. return KEY_CODE_MAP[e.keyCode] || 0 /* Unknown */;
  159. }
  160. const ctrlKeyMod = (platform.isMacintosh ? 256 /* WinCtrl */ : 2048 /* CtrlCmd */);
  161. const altKeyMod = 512 /* Alt */;
  162. const shiftKeyMod = 1024 /* Shift */;
  163. const metaKeyMod = (platform.isMacintosh ? 2048 /* CtrlCmd */ : 256 /* WinCtrl */);
  164. export class StandardKeyboardEvent {
  165. constructor(source) {
  166. this._standardKeyboardEventBrand = true;
  167. let e = source;
  168. this.browserEvent = e;
  169. this.target = e.target;
  170. this.ctrlKey = e.ctrlKey;
  171. this.shiftKey = e.shiftKey;
  172. this.altKey = e.altKey;
  173. this.metaKey = e.metaKey;
  174. this.keyCode = extractKeyCode(e);
  175. this.code = e.code;
  176. // console.info(e.type + ": keyCode: " + e.keyCode + ", which: " + e.which + ", charCode: " + e.charCode + ", detail: " + e.detail + " ====> " + this.keyCode + ' -- ' + KeyCode[this.keyCode]);
  177. this.ctrlKey = this.ctrlKey || this.keyCode === 5 /* Ctrl */;
  178. this.altKey = this.altKey || this.keyCode === 6 /* Alt */;
  179. this.shiftKey = this.shiftKey || this.keyCode === 4 /* Shift */;
  180. this.metaKey = this.metaKey || this.keyCode === 57 /* Meta */;
  181. this._asKeybinding = this._computeKeybinding();
  182. this._asRuntimeKeybinding = this._computeRuntimeKeybinding();
  183. // console.log(`code: ${e.code}, keyCode: ${e.keyCode}, key: ${e.key}`);
  184. }
  185. preventDefault() {
  186. if (this.browserEvent && this.browserEvent.preventDefault) {
  187. this.browserEvent.preventDefault();
  188. }
  189. }
  190. stopPropagation() {
  191. if (this.browserEvent && this.browserEvent.stopPropagation) {
  192. this.browserEvent.stopPropagation();
  193. }
  194. }
  195. toKeybinding() {
  196. return this._asRuntimeKeybinding;
  197. }
  198. equals(other) {
  199. return this._asKeybinding === other;
  200. }
  201. _computeKeybinding() {
  202. let key = 0 /* Unknown */;
  203. if (this.keyCode !== 5 /* Ctrl */ && this.keyCode !== 4 /* Shift */ && this.keyCode !== 6 /* Alt */ && this.keyCode !== 57 /* Meta */) {
  204. key = this.keyCode;
  205. }
  206. let result = 0;
  207. if (this.ctrlKey) {
  208. result |= ctrlKeyMod;
  209. }
  210. if (this.altKey) {
  211. result |= altKeyMod;
  212. }
  213. if (this.shiftKey) {
  214. result |= shiftKeyMod;
  215. }
  216. if (this.metaKey) {
  217. result |= metaKeyMod;
  218. }
  219. result |= key;
  220. return result;
  221. }
  222. _computeRuntimeKeybinding() {
  223. let key = 0 /* Unknown */;
  224. if (this.keyCode !== 5 /* Ctrl */ && this.keyCode !== 4 /* Shift */ && this.keyCode !== 6 /* Alt */ && this.keyCode !== 57 /* Meta */) {
  225. key = this.keyCode;
  226. }
  227. return new SimpleKeybinding(this.ctrlKey, this.shiftKey, this.altKey, this.metaKey, key);
  228. }
  229. }