瀏覽代碼

Create getKeysym to lookup keysym from keyCode.

- Most of the keyboard is now functional.
Joel Martin 15 年之前
父節點
當前提交
d9cbdc7d85
共有 2 個文件被更改,包括 105 次插入9 次删除
  1. 91 0
      canvas.js
  2. 14 9
      vnc.js

+ 91 - 0
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;
 }
 
+
 };
 

+ 14 - 9
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);
 },