keyCodes.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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 { illegalArgument } from './errors.js';
  6. class KeyCodeStrMap {
  7. constructor() {
  8. this._keyCodeToStr = [];
  9. this._strToKeyCode = Object.create(null);
  10. }
  11. define(keyCode, str) {
  12. this._keyCodeToStr[keyCode] = str;
  13. this._strToKeyCode[str.toLowerCase()] = keyCode;
  14. }
  15. keyCodeToStr(keyCode) {
  16. return this._keyCodeToStr[keyCode];
  17. }
  18. strToKeyCode(str) {
  19. return this._strToKeyCode[str.toLowerCase()] || 0 /* Unknown */;
  20. }
  21. }
  22. const uiMap = new KeyCodeStrMap();
  23. const userSettingsUSMap = new KeyCodeStrMap();
  24. const userSettingsGeneralMap = new KeyCodeStrMap();
  25. (function () {
  26. function define(keyCode, uiLabel, usUserSettingsLabel = uiLabel, generalUserSettingsLabel = usUserSettingsLabel) {
  27. uiMap.define(keyCode, uiLabel);
  28. userSettingsUSMap.define(keyCode, usUserSettingsLabel);
  29. userSettingsGeneralMap.define(keyCode, generalUserSettingsLabel);
  30. }
  31. define(0 /* Unknown */, 'unknown');
  32. define(1 /* Backspace */, 'Backspace');
  33. define(2 /* Tab */, 'Tab');
  34. define(3 /* Enter */, 'Enter');
  35. define(4 /* Shift */, 'Shift');
  36. define(5 /* Ctrl */, 'Ctrl');
  37. define(6 /* Alt */, 'Alt');
  38. define(7 /* PauseBreak */, 'PauseBreak');
  39. define(8 /* CapsLock */, 'CapsLock');
  40. define(9 /* Escape */, 'Escape');
  41. define(10 /* Space */, 'Space');
  42. define(11 /* PageUp */, 'PageUp');
  43. define(12 /* PageDown */, 'PageDown');
  44. define(13 /* End */, 'End');
  45. define(14 /* Home */, 'Home');
  46. define(15 /* LeftArrow */, 'LeftArrow', 'Left');
  47. define(16 /* UpArrow */, 'UpArrow', 'Up');
  48. define(17 /* RightArrow */, 'RightArrow', 'Right');
  49. define(18 /* DownArrow */, 'DownArrow', 'Down');
  50. define(19 /* Insert */, 'Insert');
  51. define(20 /* Delete */, 'Delete');
  52. define(21 /* KEY_0 */, '0');
  53. define(22 /* KEY_1 */, '1');
  54. define(23 /* KEY_2 */, '2');
  55. define(24 /* KEY_3 */, '3');
  56. define(25 /* KEY_4 */, '4');
  57. define(26 /* KEY_5 */, '5');
  58. define(27 /* KEY_6 */, '6');
  59. define(28 /* KEY_7 */, '7');
  60. define(29 /* KEY_8 */, '8');
  61. define(30 /* KEY_9 */, '9');
  62. define(31 /* KEY_A */, 'A');
  63. define(32 /* KEY_B */, 'B');
  64. define(33 /* KEY_C */, 'C');
  65. define(34 /* KEY_D */, 'D');
  66. define(35 /* KEY_E */, 'E');
  67. define(36 /* KEY_F */, 'F');
  68. define(37 /* KEY_G */, 'G');
  69. define(38 /* KEY_H */, 'H');
  70. define(39 /* KEY_I */, 'I');
  71. define(40 /* KEY_J */, 'J');
  72. define(41 /* KEY_K */, 'K');
  73. define(42 /* KEY_L */, 'L');
  74. define(43 /* KEY_M */, 'M');
  75. define(44 /* KEY_N */, 'N');
  76. define(45 /* KEY_O */, 'O');
  77. define(46 /* KEY_P */, 'P');
  78. define(47 /* KEY_Q */, 'Q');
  79. define(48 /* KEY_R */, 'R');
  80. define(49 /* KEY_S */, 'S');
  81. define(50 /* KEY_T */, 'T');
  82. define(51 /* KEY_U */, 'U');
  83. define(52 /* KEY_V */, 'V');
  84. define(53 /* KEY_W */, 'W');
  85. define(54 /* KEY_X */, 'X');
  86. define(55 /* KEY_Y */, 'Y');
  87. define(56 /* KEY_Z */, 'Z');
  88. define(57 /* Meta */, 'Meta');
  89. define(58 /* ContextMenu */, 'ContextMenu');
  90. define(59 /* F1 */, 'F1');
  91. define(60 /* F2 */, 'F2');
  92. define(61 /* F3 */, 'F3');
  93. define(62 /* F4 */, 'F4');
  94. define(63 /* F5 */, 'F5');
  95. define(64 /* F6 */, 'F6');
  96. define(65 /* F7 */, 'F7');
  97. define(66 /* F8 */, 'F8');
  98. define(67 /* F9 */, 'F9');
  99. define(68 /* F10 */, 'F10');
  100. define(69 /* F11 */, 'F11');
  101. define(70 /* F12 */, 'F12');
  102. define(71 /* F13 */, 'F13');
  103. define(72 /* F14 */, 'F14');
  104. define(73 /* F15 */, 'F15');
  105. define(74 /* F16 */, 'F16');
  106. define(75 /* F17 */, 'F17');
  107. define(76 /* F18 */, 'F18');
  108. define(77 /* F19 */, 'F19');
  109. define(78 /* NumLock */, 'NumLock');
  110. define(79 /* ScrollLock */, 'ScrollLock');
  111. define(80 /* US_SEMICOLON */, ';', ';', 'OEM_1');
  112. define(81 /* US_EQUAL */, '=', '=', 'OEM_PLUS');
  113. define(82 /* US_COMMA */, ',', ',', 'OEM_COMMA');
  114. define(83 /* US_MINUS */, '-', '-', 'OEM_MINUS');
  115. define(84 /* US_DOT */, '.', '.', 'OEM_PERIOD');
  116. define(85 /* US_SLASH */, '/', '/', 'OEM_2');
  117. define(86 /* US_BACKTICK */, '`', '`', 'OEM_3');
  118. define(110 /* ABNT_C1 */, 'ABNT_C1');
  119. define(111 /* ABNT_C2 */, 'ABNT_C2');
  120. define(87 /* US_OPEN_SQUARE_BRACKET */, '[', '[', 'OEM_4');
  121. define(88 /* US_BACKSLASH */, '\\', '\\', 'OEM_5');
  122. define(89 /* US_CLOSE_SQUARE_BRACKET */, ']', ']', 'OEM_6');
  123. define(90 /* US_QUOTE */, '\'', '\'', 'OEM_7');
  124. define(91 /* OEM_8 */, 'OEM_8');
  125. define(92 /* OEM_102 */, 'OEM_102');
  126. define(93 /* NUMPAD_0 */, 'NumPad0');
  127. define(94 /* NUMPAD_1 */, 'NumPad1');
  128. define(95 /* NUMPAD_2 */, 'NumPad2');
  129. define(96 /* NUMPAD_3 */, 'NumPad3');
  130. define(97 /* NUMPAD_4 */, 'NumPad4');
  131. define(98 /* NUMPAD_5 */, 'NumPad5');
  132. define(99 /* NUMPAD_6 */, 'NumPad6');
  133. define(100 /* NUMPAD_7 */, 'NumPad7');
  134. define(101 /* NUMPAD_8 */, 'NumPad8');
  135. define(102 /* NUMPAD_9 */, 'NumPad9');
  136. define(103 /* NUMPAD_MULTIPLY */, 'NumPad_Multiply');
  137. define(104 /* NUMPAD_ADD */, 'NumPad_Add');
  138. define(105 /* NUMPAD_SEPARATOR */, 'NumPad_Separator');
  139. define(106 /* NUMPAD_SUBTRACT */, 'NumPad_Subtract');
  140. define(107 /* NUMPAD_DECIMAL */, 'NumPad_Decimal');
  141. define(108 /* NUMPAD_DIVIDE */, 'NumPad_Divide');
  142. })();
  143. export var KeyCodeUtils;
  144. (function (KeyCodeUtils) {
  145. function toString(keyCode) {
  146. return uiMap.keyCodeToStr(keyCode);
  147. }
  148. KeyCodeUtils.toString = toString;
  149. function fromString(key) {
  150. return uiMap.strToKeyCode(key);
  151. }
  152. KeyCodeUtils.fromString = fromString;
  153. function toUserSettingsUS(keyCode) {
  154. return userSettingsUSMap.keyCodeToStr(keyCode);
  155. }
  156. KeyCodeUtils.toUserSettingsUS = toUserSettingsUS;
  157. function toUserSettingsGeneral(keyCode) {
  158. return userSettingsGeneralMap.keyCodeToStr(keyCode);
  159. }
  160. KeyCodeUtils.toUserSettingsGeneral = toUserSettingsGeneral;
  161. function fromUserSettings(key) {
  162. return userSettingsUSMap.strToKeyCode(key) || userSettingsGeneralMap.strToKeyCode(key);
  163. }
  164. KeyCodeUtils.fromUserSettings = fromUserSettings;
  165. })(KeyCodeUtils || (KeyCodeUtils = {}));
  166. export function KeyChord(firstPart, secondPart) {
  167. const chordPart = ((secondPart & 0x0000FFFF) << 16) >>> 0;
  168. return (firstPart | chordPart) >>> 0;
  169. }
  170. export function createKeybinding(keybinding, OS) {
  171. if (keybinding === 0) {
  172. return null;
  173. }
  174. const firstPart = (keybinding & 0x0000FFFF) >>> 0;
  175. const chordPart = (keybinding & 0xFFFF0000) >>> 16;
  176. if (chordPart !== 0) {
  177. return new ChordKeybinding([
  178. createSimpleKeybinding(firstPart, OS),
  179. createSimpleKeybinding(chordPart, OS)
  180. ]);
  181. }
  182. return new ChordKeybinding([createSimpleKeybinding(firstPart, OS)]);
  183. }
  184. export function createSimpleKeybinding(keybinding, OS) {
  185. const ctrlCmd = (keybinding & 2048 /* CtrlCmd */ ? true : false);
  186. const winCtrl = (keybinding & 256 /* WinCtrl */ ? true : false);
  187. const ctrlKey = (OS === 2 /* Macintosh */ ? winCtrl : ctrlCmd);
  188. const shiftKey = (keybinding & 1024 /* Shift */ ? true : false);
  189. const altKey = (keybinding & 512 /* Alt */ ? true : false);
  190. const metaKey = (OS === 2 /* Macintosh */ ? ctrlCmd : winCtrl);
  191. const keyCode = (keybinding & 255 /* KeyCode */);
  192. return new SimpleKeybinding(ctrlKey, shiftKey, altKey, metaKey, keyCode);
  193. }
  194. export class SimpleKeybinding {
  195. constructor(ctrlKey, shiftKey, altKey, metaKey, keyCode) {
  196. this.ctrlKey = ctrlKey;
  197. this.shiftKey = shiftKey;
  198. this.altKey = altKey;
  199. this.metaKey = metaKey;
  200. this.keyCode = keyCode;
  201. }
  202. equals(other) {
  203. return (this.ctrlKey === other.ctrlKey
  204. && this.shiftKey === other.shiftKey
  205. && this.altKey === other.altKey
  206. && this.metaKey === other.metaKey
  207. && this.keyCode === other.keyCode);
  208. }
  209. isModifierKey() {
  210. return (this.keyCode === 0 /* Unknown */
  211. || this.keyCode === 5 /* Ctrl */
  212. || this.keyCode === 57 /* Meta */
  213. || this.keyCode === 6 /* Alt */
  214. || this.keyCode === 4 /* Shift */);
  215. }
  216. toChord() {
  217. return new ChordKeybinding([this]);
  218. }
  219. /**
  220. * Does this keybinding refer to the key code of a modifier and it also has the modifier flag?
  221. */
  222. isDuplicateModifierCase() {
  223. return ((this.ctrlKey && this.keyCode === 5 /* Ctrl */)
  224. || (this.shiftKey && this.keyCode === 4 /* Shift */)
  225. || (this.altKey && this.keyCode === 6 /* Alt */)
  226. || (this.metaKey && this.keyCode === 57 /* Meta */));
  227. }
  228. }
  229. export class ChordKeybinding {
  230. constructor(parts) {
  231. if (parts.length === 0) {
  232. throw illegalArgument(`parts`);
  233. }
  234. this.parts = parts;
  235. }
  236. }
  237. export class ResolvedKeybindingPart {
  238. constructor(ctrlKey, shiftKey, altKey, metaKey, kbLabel, kbAriaLabel) {
  239. this.ctrlKey = ctrlKey;
  240. this.shiftKey = shiftKey;
  241. this.altKey = altKey;
  242. this.metaKey = metaKey;
  243. this.keyLabel = kbLabel;
  244. this.keyAriaLabel = kbAriaLabel;
  245. }
  246. }
  247. /**
  248. * A resolved keybinding. Can be a simple keybinding or a chord keybinding.
  249. */
  250. export class ResolvedKeybinding {
  251. }