diff options
author | Joel Martin <github@martintribe.org> | 2011-04-12 09:06:11 -0500 |
---|---|---|
committer | Joel Martin <github@martintribe.org> | 2011-04-12 09:06:11 -0500 |
commit | fac149ddbe32dd233a1b34ffc4450508daaa420e (patch) | |
tree | 2989aea7702de48e4fed8791e60df7a846f9e96b | |
parent | 303819eaa956e6c16a9513eedec90d1b0daace0c (diff) | |
download | novnc-fac149ddbe32dd233a1b34ffc4450508daaa420e.tar.gz |
input.js: adjust special key handling for non-US keys.
Issue #21 - non-US keyboard layouts.
Only identify some keys as special during the keyDown event so that
when using non-US keyboards the values don't overlap with the values
for normal keys.
Some keys have to still be identified in both keyDown and keyPress
since they generate both: backspace and enter for Firefox and Opera,
tab for Opera.
-rw-r--r-- | include/input.js | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/include/input.js b/include/input.js index dd9b04a..b8c5de7 100644 --- a/include/input.js +++ b/include/input.js @@ -42,35 +42,45 @@ that.set_target = function () { throw("target cannot be changed"); } // From the event keyCode return the keysym value for keys that need // to be suppressed otherwise they may trigger unintended browser // actions -function getKeysymSpecial(evt, kind) { +function getKeysymSpecial(evt) { var keysym = null; + /* switch ( evt.keyCode ) { + // These generate a keyDown and keyPress in Firefox and Opera case 8 : keysym = 0xFF08; break; // BACKSPACE - case 9 : keysym = 0xFF09; break; // TAB case 13 : keysym = 0xFF0D; break; // ENTER - case 27 : keysym = 0xFF1B; break; // ESCAPE - case 46 : keysym = 0xFFFF; break; // DELETE - case 36 : keysym = 0xFF50; break; // HOME - case 35 : keysym = 0xFF57; break; // END - case 33 : keysym = 0xFF55; break; // PAGE_UP - case 34 : keysym = 0xFF56; break; // PAGE_DOWN - case 37 : keysym = 0xFF51; break; // LEFT - case 38 : keysym = 0xFF52; break; // UP - case 39 : keysym = 0xFF53; break; // RIGHT - case 40 : keysym = 0xFF54; break; // DOWN - case 16 : keysym = 0xFFE1; break; // SHIFT - case 17 : keysym = 0xFFE3; break; // CONTROL - //case 18 : keysym = 0xFFE7; break; // Left Meta (Mac Option) - case 18 : keysym = 0xFFE9; break; // Left ALT (Mac Command) + // This generates a keyDown and keyPress in Opera + case 9 : keysym = 0xFF09; break; // TAB default : break; } + */ - if (kind === 'down') { + if (evt.type === 'keydown') { switch ( evt.keyCode ) { + case 8 : keysym = 0xFF08; break; // BACKSPACE + case 13 : keysym = 0xFF0D; break; // ENTER + case 9 : keysym = 0xFF09; break; // TAB + + case 27 : keysym = 0xFF1B; break; // ESCAPE + case 46 : keysym = 0xFFFF; break; // DELETE + + case 36 : keysym = 0xFF50; break; // HOME + case 35 : keysym = 0xFF57; break; // END + case 33 : keysym = 0xFF55; break; // PAGE_UP + case 34 : keysym = 0xFF56; break; // PAGE_DOWN case 45 : keysym = 0xFF63; break; // INSERT // '-' during keyPress + case 37 : keysym = 0xFF51; break; // LEFT + case 38 : keysym = 0xFF52; break; // UP + case 39 : keysym = 0xFF53; break; // RIGHT + case 40 : keysym = 0xFF54; break; // DOWN + case 16 : keysym = 0xFFE1; break; // SHIFT + case 17 : keysym = 0xFFE3; break; // CONTROL + //case 18 : keysym = 0xFFE7; break; // Left Meta (Mac Option) + case 18 : keysym = 0xFFE9; break; // Left ALT (Mac Command) + case 112 : keysym = 0xFFBE; break; // F1 case 113 : keysym = 0xFFBF; break; // F2 case 114 : keysym = 0xFFC0; break; // F3 @@ -205,7 +215,7 @@ function show_keyDownList(kind) { } function copyKeyEvent(evt) { - var members = ['keyCode', 'charCode', 'which', + var members = ['type', 'keyCode', 'charCode', 'which', 'altKey', 'ctrlKey', 'shiftKey', 'keyLocation', 'keyIdentifier'], i, obj = {}; for (i = 0; i < members.length; i++) { @@ -302,7 +312,7 @@ function onKeyDown(e) { fevt = copyKeyEvent(evt); - keysym = getKeysymSpecial(evt, 'down'); + keysym = getKeysymSpecial(evt); // Save keysym decoding for use in keyUp fevt.keysym = keysym; if (keysym) { @@ -343,12 +353,12 @@ function onKeyPress(e) { Util.Debug("onKeyPress kC:" + evt.keyCode + " cC:" + evt.charCode + " w:" + evt.which); if (((evt.which !== "undefined") && (evt.which === 0)) || - (getKeysymSpecial(evt, 'press'))) { + (getKeysymSpecial(evt))) { // Firefox and Opera generate a keyPress event even if keyDown // is suppressed. But the keys we want to suppress will have // either: // - the which attribute set to 0 - // - getKeysymSpecial(..., 'press') will identify it + // - getKeysymSpecial() will identify it Util.Debug("Ignoring special key in keyPress"); Util.stopEvent(e); return false; |