Commit 282834ca authored by samhed's avatar samhed

Fixes #309, make use of keysym.js

Bonus 3 bug fixes:
 * Meta is 0xFFE7 not 0xFE07
 * Super_L is 0xFFEB not 0xFFEC
 * Super_R is 0xFFEC not 0xFFED
parent ed7f8c38
...@@ -31,7 +31,7 @@ var kbdUtil = (function() { ...@@ -31,7 +31,7 @@ var kbdUtil = (function() {
function hasShortcutModifier(charModifier, currentModifiers) { function hasShortcutModifier(charModifier, currentModifiers) {
var mods = {}; var mods = {};
for (var key in currentModifiers) { for (var key in currentModifiers) {
if (parseInt(key) !== 0xffe1) { if (parseInt(key) !== XK_Shift_L) {
mods[key] = currentModifiers[key]; mods[key] = currentModifiers[key];
} }
} }
...@@ -65,24 +65,18 @@ var kbdUtil = (function() { ...@@ -65,24 +65,18 @@ var kbdUtil = (function() {
// Helper object tracking modifier key state // Helper object tracking modifier key state
// and generates fake key events to compensate if it gets out of sync // and generates fake key events to compensate if it gets out of sync
function ModifierSync(charModifier) { function ModifierSync(charModifier) {
var ctrl = 0xffe3;
var alt = 0xffe9;
var altGr = 0xfe03;
var shift = 0xffe1;
var meta = 0xffe7;
if (!charModifier) { if (!charModifier) {
if (isMac()) { if (isMac()) {
// on Mac, Option (AKA Alt) is used as a char modifier // on Mac, Option (AKA Alt) is used as a char modifier
charModifier = [alt]; charModifier = [XK_Alt_L];
} }
else if (isWindows()) { else if (isWindows()) {
// on Windows, Ctrl+Alt is used as a char modifier // on Windows, Ctrl+Alt is used as a char modifier
charModifier = [alt, ctrl]; charModifier = [XK_Alt_L, XK_Control_L];
} }
else if (isLinux()) { else if (isLinux()) {
// on Linux, AltGr is used as a char modifier // on Linux, ISO Level 3 Shift (AltGr) is used as a char modifier
charModifier = [altGr]; charModifier = [XK_ISO_Level3_Shift];
} }
else { else {
charModifier = []; charModifier = [];
...@@ -90,11 +84,11 @@ var kbdUtil = (function() { ...@@ -90,11 +84,11 @@ var kbdUtil = (function() {
} }
var state = {}; var state = {};
state[ctrl] = false; state[XK_Control_L] = false;
state[alt] = false; state[XK_Alt_L] = false;
state[altGr] = false; state[XK_ISO_Level3_Shift] = false;
state[shift] = false; state[XK_Shift_L] = false;
state[meta] = false; state[XK_Meta_L] = false;
function sync(evt, keysym) { function sync(evt, keysym) {
var result = []; var result = [];
...@@ -102,25 +96,30 @@ var kbdUtil = (function() { ...@@ -102,25 +96,30 @@ var kbdUtil = (function() {
return {keysym: keysyms.lookup(keysym), type: state[keysym] ? 'keydown' : 'keyup'}; return {keysym: keysyms.lookup(keysym), type: state[keysym] ? 'keydown' : 'keyup'};
} }
if (evt.ctrlKey !== undefined && evt.ctrlKey !== state[ctrl] && keysym !== ctrl) { if (evt.ctrlKey !== undefined &&
state[ctrl] = evt.ctrlKey; evt.ctrlKey !== state[XK_Control_L] && keysym !== XK_Control_L) {
result.push(syncKey(ctrl)); state[XK_Control_L] = evt.ctrlKey;
result.push(syncKey(XK_Control_L));
} }
if (evt.altKey !== undefined && evt.altKey !== state[alt] && keysym !== alt) { if (evt.altKey !== undefined &&
state[alt] = evt.altKey; evt.altKey !== state[XK_Alt_L] && keysym !== XK_Alt_L) {
result.push(syncKey(alt)); state[XK_Alt_L] = evt.altKey;
result.push(syncKey(XK_Alt_L));
} }
if (evt.altGraphKey !== undefined && evt.altGraphKey !== state[altGr] && keysym !== altGr) { if (evt.altGraphKey !== undefined &&
state[altGr] = evt.altGraphKey; evt.altGraphKey !== state[XK_ISO_Level3_Shift] && keysym !== XK_ISO_Level3_Shift) {
result.push(syncKey(altGr)); state[XK_ISO_Level3_Shift] = evt.altGraphKey;
result.push(syncKey(XK_ISO_Level3_Shift));
} }
if (evt.shiftKey !== undefined && evt.shiftKey !== state[shift] && keysym !== shift) { if (evt.shiftKey !== undefined &&
state[shift] = evt.shiftKey; evt.shiftKey !== state[XK_Shift_L] && keysym !== XK_Shift_L) {
result.push(syncKey(shift)); state[XK_Shift_L] = evt.shiftKey;
result.push(syncKey(XK_Shift_L));
} }
if (evt.metaKey !== undefined && evt.metaKey !== state[meta] && keysym !== meta) { if (evt.metaKey !== undefined &&
state[meta] = evt.metaKey; evt.metaKey !== state[XK_Meta_L] && keysym !== XK_Meta_L) {
result.push(syncKey(meta)); state[XK_Meta_L] = evt.metaKey;
result.push(syncKey(XK_Meta_L));
} }
return result; return result;
} }
...@@ -211,21 +210,21 @@ var kbdUtil = (function() { ...@@ -211,21 +210,21 @@ var kbdUtil = (function() {
return shiftPressed ? keycode : keycode + 32; // A-Z return shiftPressed ? keycode : keycode + 32; // A-Z
} }
if (keycode >= 0x60 && keycode <= 0x69) { if (keycode >= 0x60 && keycode <= 0x69) {
return 0xffb0 + (keycode - 0x60); // numpad 0-9 return XK_KP_0 + (keycode - 0x60); // numpad 0-9
} }
switch(keycode) { switch(keycode) {
case 0x20: return 0x20; // space case 0x20: return XK_space;
case 0x6a: return 0xffaa; // multiply case 0x6a: return XK_KP_Multiply;
case 0x6b: return 0xffab; // add case 0x6b: return XK_KP_Add;
case 0x6c: return 0xffac; // separator case 0x6c: return XK_KP_Separator;
case 0x6d: return 0xffad; // subtract case 0x6d: return XK_KP_Subtract;
case 0x6e: return 0xffae; // decimal case 0x6e: return XK_KP_Decimal;
case 0x6f: return 0xffaf; // divide case 0x6f: return XK_KP_Divide;
case 0xbb: return 0x2b; // + case 0xbb: return XK_plus;
case 0xbc: return 0x2c; // , case 0xbc: return XK_comma;
case 0xbd: return 0x2d; // - case 0xbd: return XK_minus;
case 0xbe: return 0x2e; // . case 0xbe: return XK_period;
} }
return nonCharacterKey({keyCode: keycode}); return nonCharacterKey({keyCode: keycode});
...@@ -239,37 +238,38 @@ var kbdUtil = (function() { ...@@ -239,37 +238,38 @@ var kbdUtil = (function() {
var keycode = evt.keyCode; var keycode = evt.keyCode;
if (keycode >= 0x70 && keycode <= 0x87) { if (keycode >= 0x70 && keycode <= 0x87) {
return 0xffbe + keycode - 0x70; // F1-F24 return XK_F1 + keycode - 0x70; // F1-F24
} }
switch (keycode) { switch (keycode) {
case 8 : return 0xFF08; // BACKSPACE case 8 : return XK_BackSpace;
case 13 : return 0xFF0D; // ENTER case 13 : return XK_Return;
case 9 : return 0xFF09; // TAB case 9 : return XK_Tab;
case 27 : return 0xFF1B; // ESCAPE case 27 : return XK_Escape;
case 46 : return 0xFFFF; // DELETE case 46 : return XK_Delete;
case 36 : return 0xFF50; // HOME case 36 : return XK_Home;
case 35 : return 0xFF57; // END case 35 : return XK_End;
case 33 : return 0xFF55; // PAGE_UP case 33 : return XK_Page_Up;
case 34 : return 0xFF56; // PAGE_DOWN case 34 : return XK_Page_Down;
case 45 : return 0xFF63; // INSERT case 45 : return XK_Insert;
case 37 : return 0xFF51; // LEFT case 37 : return XK_Left;
case 38 : return 0xFF52; // UP case 38 : return XK_Up;
case 39 : return 0xFF53; // RIGHT case 39 : return XK_Right;
case 40 : return 0xFF54; // DOWN case 40 : return XK_Down;
case 16 : return 0xFFE1; // SHIFT
case 17 : return 0xFFE3; // CONTROL case 16 : return XK_Shift_L;
case 18 : return 0xFFE9; // Left ALT (Mac Option) case 17 : return XK_Control_L;
case 18 : return XK_Alt_L; // also: Option-key on Mac
case 224 : return 0xFE07; // Meta
case 225 : return 0xFE03; // AltGr case 224 : return XK_Meta_L;
case 91 : return 0xFFEC; // Super_L (Win Key) case 225 : return XK_ISO_Level3_Shift; // AltGr
case 92 : return 0xFFED; // Super_R (Win Key) case 91 : return XK_Super_L; // also: Windows-key
case 93 : return 0xFF67; // Menu (Win Menu), Mac Command case 92 : return XK_Super_R; // also: Windows-key
case 93 : return XK_Menu; // also: Windows-Menu, Command on Mac
default: return null; default: return null;
} }
} }
......
...@@ -252,12 +252,12 @@ var RFB; ...@@ -252,12 +252,12 @@ var RFB;
Util.Info("Sending Ctrl-Alt-Del"); Util.Info("Sending Ctrl-Alt-Del");
var arr = []; var arr = [];
arr = arr.concat(RFB.messages.keyEvent(0xFFE3, 1)); // Control arr = arr.concat(RFB.messages.keyEvent(XK_Control_L, 1));
arr = arr.concat(RFB.messages.keyEvent(0xFFE9, 1)); // Alt arr = arr.concat(RFB.messages.keyEvent(XK_Alt_L, 1));
arr = arr.concat(RFB.messages.keyEvent(0xFFFF, 1)); // Delete arr = arr.concat(RFB.messages.keyEvent(XK_Delete, 1));
arr = arr.concat(RFB.messages.keyEvent(0xFFFF, 0)); // Delete arr = arr.concat(RFB.messages.keyEvent(XK_Delete, 0));
arr = arr.concat(RFB.messages.keyEvent(0xFFE9, 0)); // Alt arr = arr.concat(RFB.messages.keyEvent(XK_Alt_L, 0));
arr = arr.concat(RFB.messages.keyEvent(0xFFE3, 0)); // Control arr = arr.concat(RFB.messages.keyEvent(XK_Control_L, 0));
this._sock.send(arr); this._sock.send(arr);
}, },
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment