From a14f8933a7262effcf27b258bcac1e2eecbb3bc0 Mon Sep 17 00:00:00 2001 From: Jeremy White Date: Mon, 5 Aug 2019 14:27:06 -0500 Subject: Update the documentation and organization of the scancodes. The common scan codes were disjointed and logically belong together. Signed-off-by: Jeremy White Acked-by: Frediano Ziglio --- src/utils.js | 101 +++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/src/utils.js b/src/utils.js index 5059a5b..79e3e5e 100644 --- a/src/utils.js +++ b/src/utils.js @@ -114,14 +114,54 @@ function arraybuffer_to_str(buf) { } /*---------------------------------------------------------------------------- -** Converting keycodes to AT scancodes is very hard. -** luckly there are some resources on the web and in the Xorg driver that help -** us figure out what browser dependent keycodes match to what scancodes. -** -** This will most likely not work for non US keyboard and browsers other than -** modern Chrome and FireFox. +** Converting browser keycodes to AT scancodes is very hard. +** Spice transmits keys using the original AT scan codes, often +** described as 'Scan Code Set 1'. +** There is a confusion of other scan codes; Xorg synthesizes it's +** own in the same atKeynames.c file that has the XT codes. +** Scan code set 2 and 3 are more common, and use different values. +** Further, there is no formal specification for keycodes +** returned by browsers, so we have done our mapping largely with +** empirical testing. +** There has been little rigorous testing with International keyboards, +** and this would be an easy area for non English speakers to contribute. **--------------------------------------------------------------------------*/ var common_scanmap = []; + +/* The following appear to be keycodes that work in most browsers */ +common_scanmap['1'.charCodeAt(0)] = KeyNames.KEY_1; +common_scanmap['2'.charCodeAt(0)] = KeyNames.KEY_2; +common_scanmap['3'.charCodeAt(0)] = KeyNames.KEY_3; +common_scanmap['4'.charCodeAt(0)] = KeyNames.KEY_4; +common_scanmap['5'.charCodeAt(0)] = KeyNames.KEY_5; +common_scanmap['6'.charCodeAt(0)] = KeyNames.KEY_6; +common_scanmap['7'.charCodeAt(0)] = KeyNames.KEY_7; +common_scanmap['8'.charCodeAt(0)] = KeyNames.KEY_8; +common_scanmap['9'.charCodeAt(0)] = KeyNames.KEY_9; +common_scanmap['0'.charCodeAt(0)] = KeyNames.KEY_0; +common_scanmap[145] = KeyNames.KEY_ScrollLock; +common_scanmap[103] = KeyNames.KEY_KP_7; +common_scanmap[104] = KeyNames.KEY_KP_8; +common_scanmap[105] = KeyNames.KEY_KP_9; +common_scanmap[100] = KeyNames.KEY_KP_4; +common_scanmap[101] = KeyNames.KEY_KP_5; +common_scanmap[102] = KeyNames.KEY_KP_6; +common_scanmap[107] = KeyNames.KEY_KP_Plus; +common_scanmap[97] = KeyNames.KEY_KP_1; +common_scanmap[98] = KeyNames.KEY_KP_2; +common_scanmap[99] = KeyNames.KEY_KP_3; +common_scanmap[96] = KeyNames.KEY_KP_0; +common_scanmap[109] = KeyNames.KEY_Minus; +common_scanmap[110] = KeyNames.KEY_KP_Decimal; +common_scanmap[191] = KeyNames.KEY_Slash; +common_scanmap[190] = KeyNames.KEY_Period; +common_scanmap[188] = KeyNames.KEY_Comma; +common_scanmap[220] = KeyNames.KEY_BSlash; +common_scanmap[192] = KeyNames.KEY_Tilde; +common_scanmap[222] = KeyNames.KEY_Quote; +common_scanmap[219] = KeyNames.KEY_LBrace; +common_scanmap[221] = KeyNames.KEY_RBrace; + common_scanmap['Q'.charCodeAt(0)] = KeyNames.KEY_Q; common_scanmap['W'.charCodeAt(0)] = KeyNames.KEY_W; common_scanmap['E'.charCodeAt(0)] = KeyNames.KEY_E; @@ -172,9 +212,17 @@ common_scanmap[121] = KeyNames.KEY_F10; common_scanmap[122] = KeyNames.KEY_F11; common_scanmap[123] = KeyNames.KEY_F12; -/* These extended scancodes do not line up with values from atKeynames */ -common_scanmap[42] = 99; -common_scanmap[19] = 101; // Break +/* TODO: Break and Print are complex scan codes. XSpice cheats and + uses Xorg synthesized codes to simplify them. Fixing this will + require XSpice to handle the scan codes correctly, and then + fix spice-html5 to send the complex scan codes. */ +common_scanmap[42] = 99; // Print, XSpice only +common_scanmap[19] = 101;// Break, XSpice only + +/* Handle the so called 'GREY' keys, for the extended keys that + were grey on the original AT keyboard. These are + prefixed, as they were on the PS/2 controller, with an + 0xE0 byte to indicate that they are extended */ common_scanmap[111] = 0xE035; // KP_Divide common_scanmap[106] = 0xE037; // KP_Multiply common_scanmap[36] = 0xE047; // Home @@ -187,41 +235,6 @@ common_scanmap[40] = 0xE050; // Down common_scanmap[34] = 0xE051; // PgDown common_scanmap[45] = 0xE052; // Insert common_scanmap[46] = 0xE053; // Delete - -/* These are not common between ALL browsers but are between Firefox and DOM3 */ -common_scanmap['1'.charCodeAt(0)] = KeyNames.KEY_1; -common_scanmap['2'.charCodeAt(0)] = KeyNames.KEY_2; -common_scanmap['3'.charCodeAt(0)] = KeyNames.KEY_3; -common_scanmap['4'.charCodeAt(0)] = KeyNames.KEY_4; -common_scanmap['5'.charCodeAt(0)] = KeyNames.KEY_5; -common_scanmap['6'.charCodeAt(0)] = KeyNames.KEY_6; -common_scanmap['7'.charCodeAt(0)] = KeyNames.KEY_7; -common_scanmap['8'.charCodeAt(0)] = KeyNames.KEY_8; -common_scanmap['9'.charCodeAt(0)] = KeyNames.KEY_9; -common_scanmap['0'.charCodeAt(0)] = KeyNames.KEY_0; -common_scanmap[145] = KeyNames.KEY_ScrollLock; -common_scanmap[103] = KeyNames.KEY_KP_7; -common_scanmap[104] = KeyNames.KEY_KP_8; -common_scanmap[105] = KeyNames.KEY_KP_9; -common_scanmap[100] = KeyNames.KEY_KP_4; -common_scanmap[101] = KeyNames.KEY_KP_5; -common_scanmap[102] = KeyNames.KEY_KP_6; -common_scanmap[107] = KeyNames.KEY_KP_Plus; -common_scanmap[97] = KeyNames.KEY_KP_1; -common_scanmap[98] = KeyNames.KEY_KP_2; -common_scanmap[99] = KeyNames.KEY_KP_3; -common_scanmap[96] = KeyNames.KEY_KP_0; -common_scanmap[109] = KeyNames.KEY_Minus; -common_scanmap[110] = KeyNames.KEY_KP_Decimal; -common_scanmap[191] = KeyNames.KEY_Slash; -common_scanmap[190] = KeyNames.KEY_Period; -common_scanmap[188] = KeyNames.KEY_Comma; -common_scanmap[220] = KeyNames.KEY_BSlash; -common_scanmap[192] = KeyNames.KEY_Tilde; -common_scanmap[222] = KeyNames.KEY_Quote; -common_scanmap[219] = KeyNames.KEY_LBrace; -common_scanmap[221] = KeyNames.KEY_RBrace; - common_scanmap[91] = 0xE05B; //KeyNames.KEY_LMeta common_scanmap[92] = 0xE05C; //KeyNames.KEY_RMeta common_scanmap[93] = 0xE05D; //KeyNames.KEY_Menu -- cgit v1.2.3