keyboard.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. /*
  2. * Copyright (c) 2015 Sylvain Peyrefitte
  3. *
  4. * This file is part of mstsc.js.
  5. *
  6. * mstsc.js is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. (function() {
  20. // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code
  21. var KeyMap = {
  22. "" : 0x0000,
  23. "Escape" : 0x0001,
  24. "Digit1" : 0x0002,
  25. "Digit2" : 0x0003,
  26. "Digit3" : 0x0004,
  27. "Digit4" : 0x0005,
  28. "Digit5" : 0x0006,
  29. "Digit6" : 0x0007,
  30. "Digit7" : 0x0008,
  31. "Digit8" : 0x0009,
  32. "Digit9" : 0x000A,
  33. "Digit0" : 0x000B,
  34. "Minus" : 0x000C,
  35. "Equal" : 0x000D,
  36. "Backspace" : 0x000E,
  37. "Tab" : 0x000F,
  38. "KeyQ" : 0x0010,
  39. "KeyW" : 0x0011,
  40. "KeyE" : 0x0012,
  41. "KeyR" : 0x0013,
  42. "KeyT" : 0x0014,
  43. "KeyY" : 0x0015,
  44. "KeyU" : 0x0016,
  45. "KeyI" : 0x0017,
  46. "KeyO" : 0x0018,
  47. "KeyP" : 0x0019,
  48. "BracketLeft" : 0x001A,
  49. "BracketRight" : 0x001B,
  50. "Enter" : 0x001C,
  51. "ControlLeft" : 0x001D,
  52. "KeyA" : 0x001E,
  53. "KeyS" : 0x001F,
  54. "KeyD" : 0x0020,
  55. "KeyF" : 0x0021,
  56. "KeyG" : 0x0022,
  57. "KeyH" : 0x0023,
  58. "KeyJ" : 0x0024,
  59. "KeyK" : 0x0025,
  60. "KeyL" : 0x0026,
  61. "Semicolon" : 0x0027,
  62. "Quote" : 0x0028,
  63. "Backquote" : 0x0029,
  64. "ShiftLeft" : 0x002A,
  65. "Backslash" : 0x002B,
  66. "KeyZ" : 0x002C,
  67. "KeyX" : 0x002D,
  68. "KeyC" : 0x002E,
  69. "KeyV" : 0x002F,
  70. "KeyB" : 0x0030,
  71. "KeyN" : 0x0031,
  72. "KeyM" : 0x0032,
  73. "Comma" : 0x0033,
  74. "Period" : 0x0034,
  75. "Slash" : 0x0035,
  76. "ShiftRight" : 0x0036,
  77. "NumpadMultiply" : 0x0037,
  78. "AltLeft" : 0x0038,
  79. "Space" : 0x0039,
  80. "CapsLock" : 0x003A,
  81. "F1" : 0x003B,
  82. "F2" : 0x003C,
  83. "F3" : 0x003D,
  84. "F4" : 0x003E,
  85. "F5" : 0x003F,
  86. "F6" : 0x0040,
  87. "F7" : 0x0041,
  88. "F8" : 0x0042,
  89. "F9" : 0x0043,
  90. "F10" : 0x0044,
  91. "Pause" : 0x0045,
  92. "ScrollLock" : 0x0046,
  93. "Numpad7" : 0x0047,
  94. "Numpad8" : 0x0048,
  95. "Numpad9" : 0x0049,
  96. "NumpadSubtract" : 0x004A,
  97. "Numpad4" : 0x004B,
  98. "Numpad5" : 0x004C,
  99. "Numpad6" : 0x004D,
  100. "NumpadAdd" : 0x004E,
  101. "Numpad1" : 0x004F,
  102. "Numpad2" : 0x0050,
  103. "Numpad3" : 0x0051,
  104. "Numpad0" : 0x0052,
  105. "NumpadDecimal" : 0x0053,
  106. "PrintScreen" : 0x0054,
  107. "IntlBackslash" : 0x0056,
  108. "F11" : 0x0057,
  109. "F12" : 0x0058,
  110. "NumpadEqual" : 0x0059,
  111. "F13" : 0x0064,
  112. "F14" : 0x0065,
  113. "F15" : 0x0066,
  114. "F16" : 0x0067,
  115. "F17" : 0x0068,
  116. "F18" : 0x0069,
  117. "F19" : 0x006A,
  118. "F20" : 0x006B,
  119. "F21" : 0x006C,
  120. "F22" : 0x006D,
  121. "F23" : 0x006E,
  122. "KanaMode" : 0x0070,
  123. "Lang2" : 0x0071,
  124. "Lang1" : 0x0072,
  125. "IntlRo" : 0x0073,
  126. "F24" : 0x0076,
  127. "Convert" : 0x0079,
  128. "NonConvert" : 0x007B,
  129. "IntlYen" : 0x007D,
  130. "NumpadComma" : 0x007E,
  131. "MediaTrackPrevious" : 0xE010,
  132. "MediaTrackNext" : 0xE019,
  133. "NumpadEnter" : 0xE01C,
  134. "ControlRight" : 0xE01D,
  135. "VolumeMute" : 0xE020,
  136. "LaunchApp2" : 0xE021,
  137. "MediaPlayPause" : 0xE022,
  138. "MediaStop" : 0xE024,
  139. "VolumeDown" : 0xE02E,
  140. "VolumeUp" : 0xE030,
  141. "BrowserHome" : 0xE032,
  142. "NumpadDivide" : 0xE035,
  143. "PrintScreen" : 0xE037,
  144. "AltRight" : 0xE038,
  145. "NumLock" : 0xE045,
  146. "Pause" : 0xE046,
  147. "Home" : 0xE047,
  148. "ArrowUp" : 0xE048,
  149. "PageUp" : 0xE049,
  150. "ArrowLeft" : 0xE04B,
  151. "ArrowRight" : 0xE04D,
  152. "End" : 0xE04F,
  153. "ArrowDown" : 0xE050,
  154. "PageDown" : 0xE051,
  155. "Insert" : 0xE052,
  156. "Delete" : 0xE053,
  157. "OSLeft" : 0xE05B,
  158. "OSRight" : 0xE05C,
  159. "ContextMenu" : 0xE05D,
  160. "Power" : 0xE05E,
  161. "BrowserSearch" : 0xE065,
  162. "BrowserFavorites" : 0xE066,
  163. "BrowserRefresh" : 0xE067,
  164. "BrowserStop" : 0xE068,
  165. "BrowserForward" : 0xE069,
  166. "BrowserBack" : 0xE06A,
  167. "LaunchApp1" : 0xE06B,
  168. "LaunchMail" : 0xE06C,
  169. "MediaSelect" : 0xE06D
  170. };
  171. var UnicodeToCodeFirefox_FR = {
  172. 27 : "Escape",
  173. 112 : "F1",
  174. 113 : "F2",
  175. 114 : "F3",
  176. 115 : "F4",
  177. 116 : "F5",
  178. 117 : "F6",
  179. 118 : "F7",
  180. 119 : "F8",
  181. 120 : "F9",
  182. 121 : "F10",
  183. 122 : "F11",
  184. 123 : "F12",
  185. 0 : "Backquote",
  186. 49 : "Digit1",
  187. 50 : "Digit2",
  188. 51 : "Digit3",
  189. 52 : "Digit4",
  190. 53 : "Digit5",
  191. 54 : "Digit6",
  192. 55 : "Digit7",
  193. 56 : "Digit8",
  194. 57 : "Digit9",
  195. 48 : "Digit0",
  196. 169 : "Minus",
  197. 61 : "Equal",
  198. 8 : "Backspace",
  199. 9 : "Tab",
  200. 65 : "KeyQ",
  201. 90 : "KeyW",
  202. 69 : "KeyE",
  203. 82 : "KeyR",
  204. 84 : "KeyT",
  205. 89 : "KeyY",
  206. 85 : "KeyU",
  207. 73 : "KeyI",
  208. 79 : "KeyO",
  209. 80 : "KeyP",
  210. 160 : "BracketLeft",
  211. 164 : "BracketRight",
  212. 13 : "Enter",
  213. 20 : "CapsLock",
  214. 20 : "CapsLock",
  215. 81 : "KeyA",
  216. 83 : "KeyS",
  217. 68 : "KeyD",
  218. 70 : "KeyF",
  219. 71 : "KeyG",
  220. 72 : "KeyH",
  221. 74 : "KeyJ",
  222. 75 : "KeyK",
  223. 76 : "KeyL",
  224. 77 : "Semicolon",
  225. 165 : "Quote",
  226. 170 : "Backslash",
  227. 16 : "ShiftLeft",
  228. 60 : "IntlBackslash",
  229. 87 : "KeyZ",
  230. 88 : "KeyX",
  231. 67 : "KeyC",
  232. 86 : "KeyV",
  233. 66 : "KeyB",
  234. 78 : "KeyN",
  235. 188 : "KeyM",
  236. 59 : "Comma",
  237. 58 : "Period",
  238. 161 : "Slash",
  239. 16 : "ShiftRight",
  240. 17 : "ControlLeft",
  241. 91 : "OSLeft",
  242. 18 : "AltLeft",
  243. 32 : "Space",
  244. 17 : "ControlLeft",
  245. 18 : "AltRight",
  246. 91 : "OSRight",
  247. 93 : "ContextMenu",
  248. 17 : "ControlRight",
  249. 37 : "ArrowLeft",
  250. 38 : "ArrowUp",
  251. 40 : "ArrowDown",
  252. 39 : "ArrowRight",
  253. 144 : "NumLock",
  254. 144 : "NumLock",
  255. 111 : "NumpadDivide",
  256. 106 : "NumpadMultiply",
  257. 109 : "NumpadSubtract",
  258. 103 : "Numpad7",
  259. 104 : "Numpad8",
  260. 105 : "Numpad9",
  261. 107 : "NumpadAdd",
  262. 100 : "Numpad4",
  263. 101 : "Numpad5",
  264. 102 : "Numpad6",
  265. 97 : "Numpad1",
  266. 98 : "Numpad2",
  267. 99 : "Numpad3",
  268. 96 : "Numpad0",
  269. 110 : "NumpadDecimal",
  270. 13 : "NumpadEnter",
  271. 17 : "ControlLeft",
  272. 67 : "KeyC",
  273. 17 : "ControlLeft"
  274. };
  275. var UnicodeToCodeChrome_FR = {
  276. 27 : "Escape",
  277. 112 : "F1",
  278. 113 : "F2",
  279. 114 : "F3",
  280. 115 : "F4",
  281. 116 : "F5",
  282. 117 : "F6",
  283. 118 : "F7",
  284. 119 : "F8",
  285. 120 : "F9",
  286. 121 : "F10",
  287. 122 : "F11",
  288. 123 : "F12",
  289. 0 : "Backquote",
  290. 49 : "Digit1",
  291. 50 : "Digit2",
  292. 51 : "Digit3",
  293. 52 : "Digit4",
  294. 53 : "Digit5",
  295. 54 : "Digit6",
  296. 55 : "Digit7",
  297. 56 : "Digit8",
  298. 57 : "Digit9",
  299. 48 : "Digit0",
  300. 219 : "Minus",
  301. 187 : "Equal",
  302. 8 : "Backspace",
  303. 9 : "Tab",
  304. 65 : "KeyQ",
  305. 90 : "KeyW",
  306. 69 : "KeyE",
  307. 82 : "KeyR",
  308. 84 : "KeyT",
  309. 89 : "KeyY",
  310. 85 : "KeyU",
  311. 73 : "KeyI",
  312. 79 : "KeyO",
  313. 80 : "KeyP",
  314. 221 : "BracketLeft",
  315. 186 : "BracketRight",
  316. 13 : "Enter",
  317. 20 : "CapsLock",
  318. 20 : "CapsLock",
  319. 81 : "KeyA",
  320. 83 : "KeyS",
  321. 68 : "KeyD",
  322. 70 : "KeyF",
  323. 71 : "KeyG",
  324. 72 : "KeyH",
  325. 74 : "KeyJ",
  326. 75 : "KeyK",
  327. 76 : "KeyL",
  328. 77 : "Semicolon",
  329. 192 : "Quote",
  330. 220 : "Backslash",
  331. 16 : "ShiftLeft",
  332. 60 : "IntlBackslash",
  333. 87 : "KeyZ",
  334. 88 : "KeyX",
  335. 67 : "KeyC",
  336. 86 : "KeyV",
  337. 66 : "KeyB",
  338. 78 : "KeyN",
  339. 188 : "KeyM",
  340. 190 : "Comma",
  341. 191 : "Period",
  342. 223 : "Slash",
  343. 16 : "ShiftRight",
  344. 17 : "ControlLeft",
  345. 91 : "OSLeft",
  346. 18 : "AltLeft",
  347. 32 : "Space",
  348. 17 : "ControlLeft",
  349. 18 : "AltRight",
  350. 91 : "OSRight",
  351. 93 : "ContextMenu",
  352. 17 : "ControlRight",
  353. 37 : "ArrowLeft",
  354. 38 : "ArrowUp",
  355. 40 : "ArrowDown",
  356. 39 : "ArrowRight",
  357. 144 : "NumLock",
  358. 144 : "NumLock",
  359. 111 : "NumpadDivide",
  360. 106 : "NumpadMultiply",
  361. 109 : "NumpadSubtract",
  362. 103 : "Numpad7",
  363. 104 : "Numpad8",
  364. 105 : "Numpad9",
  365. 107 : "NumpadAdd",
  366. 100 : "Numpad4",
  367. 101 : "Numpad5",
  368. 102 : "Numpad6",
  369. 97 : "Numpad1",
  370. 98 : "Numpad2",
  371. 99 : "Numpad3",
  372. 96 : "Numpad0",
  373. 110 : "NumpadDecimal",
  374. 13 : "NumpadEnter",
  375. 17 : "ControlLeft",
  376. 67 : "KeyC",
  377. 17 : "ControlLeft"
  378. };
  379. var UnicodeToCode_EN = {
  380. 27 : "Escape",
  381. 112 : "F1",
  382. 113 : "F2",
  383. 114 : "F3",
  384. 115 : "F4",
  385. 116 : "F5",
  386. 117 : "F6",
  387. 118 : "F7",
  388. 119 : "F8",
  389. 120 : "F9",
  390. 121 : "F10",
  391. 122 : "F11",
  392. 123 : "F12",
  393. 192 : "Backquote",
  394. 49 : "Digit1",
  395. 50 : "Digit2",
  396. 51 : "Digit3",
  397. 52 : "Digit4",
  398. 53 : "Digit5",
  399. 54 : "Digit6",
  400. 55 : "Digit7",
  401. 56 : "Digit8",
  402. 57 : "Digit9",
  403. 48 : "Digit0",
  404. 173 : "Minus",
  405. 61 : "Equal",
  406. 8 : "Backspace",
  407. 9 : "Tab",
  408. 81 : "KeyQ",
  409. 87 : "KeyW",
  410. 69 : "KeyE",
  411. 82 : "KeyR",
  412. 84 : "KeyT",
  413. 89 : "KeyY",
  414. 85 : "KeyU",
  415. 73 : "KeyI",
  416. 79 : "KeyO",
  417. 80 : "KeyP",
  418. 219 : "BracketLeft",
  419. 221 : "BracketRight",
  420. 13 : "Enter",
  421. 20 : "CapsLock",
  422. 65 : "KeyA",
  423. 83 : "KeyS",
  424. 68 : "KeyD",
  425. 70 : "KeyF",
  426. 71 : "KeyG",
  427. 72 : "KeyH",
  428. 74 : "KeyJ",
  429. 75 : "KeyK",
  430. 76 : "KeyL",
  431. 59 : "Semicolon",
  432. 222 : "Quote",
  433. 220 : "Backslash",
  434. 16 : "ShiftLeft",
  435. 220 : "IntlBackslash",
  436. 90 : "KeyZ",
  437. 88 : "KeyX",
  438. 67 : "KeyC",
  439. 86 : "KeyV",
  440. 66 : "KeyB",
  441. 78 : "KeyN",
  442. 77 : "KeyM",
  443. 188 : "Comma",
  444. 190 : "Period",
  445. 191 : "Slash",
  446. 16 : "ShiftRight",
  447. 17 : "ControlLeft",
  448. 18 : "AltLeft",
  449. 91 : "OSLeft",
  450. 32 : "Space",
  451. 18 : "AltRight",
  452. 91 : "OSRight",
  453. 93 : "ContextMenu",
  454. 17 : "ControlRight",
  455. 37 : "ArrowLeft",
  456. 38 : "ArrowUp",
  457. 40 : "ArrowDown",
  458. 39 : "ArrowRight",
  459. 144 : "NumLock",
  460. 144 : "NumLock",
  461. 111 : "NumpadDivide",
  462. 106 : "NumpadMultiply",
  463. 109 : "NumpadSubtract",
  464. 103 : "Numpad7",
  465. 104 : "Numpad8",
  466. 105 : "Numpad9",
  467. 107 : "NumpadAdd",
  468. 100 : "Numpad4",
  469. 101 : "Numpad5",
  470. 102 : "Numpad6",
  471. 97 : "Numpad1",
  472. 98 : "Numpad2",
  473. 99 : "Numpad3",
  474. 13 : "NumpadEnter",
  475. 96 : "Numpad0",
  476. 110 : "NumpadDecimal",
  477. 17 : "ControlLeft"
  478. };
  479. var UnicodeToCode = {
  480. 'firefox' : {
  481. 'fr' : UnicodeToCodeFirefox_FR,
  482. 'en' : UnicodeToCode_EN
  483. },
  484. 'chrome' : {
  485. 'fr' : UnicodeToCodeChrome_FR,
  486. 'en' : UnicodeToCode_EN
  487. }
  488. }
  489. /**
  490. * Scancode of keyevent
  491. * @param e {keyboardevent}
  492. * @return {integer} scancode
  493. */
  494. function scancode (e) {
  495. var locale = Mstsc.locale();
  496. locale = (['fr', 'en'].indexOf(locale) > 0 && locale) || 'en';
  497. return KeyMap[e.code || UnicodeToCode[Mstsc.browser() || 'firefox'][locale][e.keyCode]];
  498. }
  499. Mstsc.scancode = scancode;
  500. })();