diff --git a/canvas.js b/canvas.js index 29c42962..beb6a976 100644 --- a/canvas.js +++ b/canvas.js @@ -141,7 +141,98 @@ rfbImage: function(x, y, width, height, arr) { } Canvas.ctx.putImageData(img, x, y); +}, + +/* Translate DOM key event to keysym value */ +getKeysym: function(e) { + evt = e.event || window.event; + var keysym; + //debug(dirObj(e, null, 1)); + + /* Remap modifier and special keys */ + switch ( evt.keyCode ) { + 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 45 : keysym = 0xFF63; break; // INSERT + 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 112 : keysym = 0xFFBE; break; // F1 + case 113 : keysym = 0xFFBF; break; // F2 + case 114 : keysym = 0xFFC0; break; // F3 + case 115 : keysym = 0xFFC1; break; // F4 + case 116 : keysym = 0xFFC2; break; // F5 + case 117 : keysym = 0xFFC3; break; // F6 + case 118 : keysym = 0xFFC4; break; // F7 + case 119 : keysym = 0xFFC5; break; // F8 + case 120 : keysym = 0xFFC6; break; // F9 + case 121 : keysym = 0xFFC7; break; // F10 + case 122 : keysym = 0xFFC8; break; // F11 + case 123 : keysym = 0xFFC9; break; // F12 + case 16 : keysym = 0xFFE1; break; // SHIFT + case 17 : keysym = 0xFFE3; break; // CONTROL + case 18 : keysym = 0xFFE7; break; // ALT + default : keysym = evt.keyCode; break; + } + + /* Remap symbols */ + switch (keysym) { + case 186 : keysym = 59; break; // ; (IE) + case 187 : keysym = 61; break; // = (IE) + case 188 : keysym = 44; break; // , (Mozilla, IE) + //case 109 : // - (Mozilla) + case 189 : keysym = 45; break; // - (IE) + case 190 : keysym = 46; break; // . (Mozilla, IE) + case 191 : keysym = 47; break; // / (Mozilla, IE) + case 192 : keysym = 96; break; // ` (Mozilla, IE) + case 219 : keysym = 91; break; // [ (Mozilla, IE) + case 220 : keysym = 92; break; // \ (Mozilla, IE) + case 221 : keysym = 93; break; // ] (Mozilla, IE) + case 222 : keysym = 39; break; // ' (Mozilla, IE) + } + + /* Remap shifted and unshifted keys */ + if (!!evt.shiftKey) { + switch (keysym) { + case 48 : keysym = 41 ; break; // ) (shifted 0) + case 49 : keysym = 33 ; break; // ! (shifted 1) + case 50 : keysym = 64 ; break; // @ (shifted 2) + case 51 : keysym = 35 ; break; // # (shifted 3) + case 52 : keysym = 36 ; break; // $ (shifted 4) + case 53 : keysym = 37 ; break; // % (shifted 5) + case 54 : keysym = 94 ; break; // ^ (shifted 6) + case 55 : keysym = 38 ; break; // & (shifted 7) + case 56 : keysym = 42 ; break; // * (shifted 8) + case 57 : keysym = 40 ; break; // ( (shifted 9) + + case 59 : keysym = 58 ; break; // : (shifted `) + case 61 : keysym = 43 ; break; // + (shifted ;) + case 44 : keysym = 60 ; break; // < (shifted ,) + case 45 : keysym = 95 ; break; // _ (shifted -) + case 46 : keysym = 62 ; break; // > (shifted .) + case 47 : keysym = 63 ; break; // ? (shifted /) + case 96 : keysym = 126; break; // ~ (shifted `) + case 91 : keysym = 123; break; // { (shifted [) + case 92 : keysym = 124; break; // | (shifted \) + case 93 : keysym = 125; break; // } (shifted ]) + case 39 : keysym = 34 ; break; // " (shifted ') + } + } else if ((keysym >= 65) && (keysym <=90)) { + /* Remap unshifted A-Z */ + keysym += 32; + } + + return keysym; } + }; diff --git a/vnc.js b/vnc.js index 9e4c7e59..4dd21ea4 100644 --- a/vnc.js +++ b/vnc.js @@ -57,6 +57,7 @@ Array.prototype.shiftBytes = function (len) { return this.splice(0, len); } + /* * Server message handlers */ @@ -322,7 +323,7 @@ setEncodings: function () { }, fbUpdateRequest: function (incremental, x, y, xw, yw) { - debug(">> fbUpdateRequest"); + //debug(">> fbUpdateRequest"); var arr = [3]; // msg-type arr.push8(incremental); arr.push16(x); @@ -330,18 +331,19 @@ fbUpdateRequest: function (incremental, x, y, xw, yw) { arr.push16(xw); arr.push16(yw); RFB.send_array(arr); - debug("<< fbUpdateRequest"); + //debug("<< fbUpdateRequest"); }, -keyEvent: function (key, code, down) { - debug(">> keyEvent: " + key + "(" + code + ") " + down); +keyEvent: function (keysym, down) { + debug(">> keyEvent, keysym: " + keysym + ", down: " + down); var arr = [4]; // msg-type arr.push8(down); arr.push16(0); - arr.push32(code); + arr.push32(keysym); + //debug("keyEvent array: " + arr); RFB.send_array(arr); RFB.fbUpdateRequest(1, 0, 0, fb_width, fb_height); - debug("<< keyEvent"); + //debug("<< keyEvent"); }, pointerEvent: function () { @@ -356,11 +358,12 @@ clientCutText: function () { */ send_string: function (str) { + //debug(">> send_string: " + str); ws.send(Base64.encode(str)); }, send_array: function (arr) { - debug("encoded array: " + Base64.encode_array(arr)); + //debug(">> send_array: " + Base64.encode_array(arr)); ws.send(Base64.encode_array(arr)); }, @@ -389,13 +392,15 @@ poller: function () { }, keyDown: function (e) { + //debug(">> keyDown: " + e.key + "(" + e.code + ")"); e.stop(); - RFB.keyEvent(e.key, e.code, 1); + RFB.keyEvent(Canvas.getKeysym(e), 1); }, keyUp: function (e) { + //debug(">> keyUp: " + e.key + "(" + e.code + ")"); e.stop(); - RFB.keyEvent(e.key, e.code, 0); + RFB.keyEvent(Canvas.getKeysym(e), 0); },