From 3e8539381b67bd8c253b6879d9f553f6b69073c3 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sun, 28 Sep 2014 23:54:04 -0700 Subject: [PATCH] GUAC-862: Simplify keydown logic. Restore workaround for Chrome meta bug. --- .../src/main/webapp/modules/Keyboard.js | 68 +++++++++++-------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/guacamole-common-js/src/main/webapp/modules/Keyboard.js b/guacamole-common-js/src/main/webapp/modules/Keyboard.js index 6ba0a467f..d1b5e6664 100644 --- a/guacamole-common-js/src/main/webapp/modules/Keyboard.js +++ b/guacamole-common-js/src/main/webapp/modules/Keyboard.js @@ -457,7 +457,7 @@ Guacamole.Keyboard = function(element) { "KanjiMode": [0xFF21], "Katakana": [0xFF26], "Left": [0xFF51], - "Meta": [0xFFE7], + "Meta": [0xFFE7, 0xFFE7, 0xFFE8], "ModeChange": [0xFF7E], "NumLock": [0xFF7F], "PageDown": [0xFF55], @@ -905,45 +905,53 @@ Guacamole.Keyboard = function(element) { // Keydown event if (first instanceof KeydownEvent) { + var keysym = null; + var accepted_events = []; + // If event itself is reliable, no need to wait for other events - var keysym = first.keysym; if (first.reliable) { - - if (keysym) { - release_simulated_altgr(keysym); - first.defaultPrevented = !press_key(keysym); - recentKeysym[first.keyCode] = keysym; - } - - return eventLog.shift(); - + keysym = first.keysym; + accepted_events = eventLog.splice(0, 1); } // If keydown is immediately followed by a keypress, use the indicated character - var next = eventLog[1]; - if (next && next instanceof KeypressEvent) { - - keysym = next.keysym; - if (keysym) { - release_simulated_altgr(keysym); - first.defaultPrevented = next.defaultPrevented = !press_key(keysym); - recentKeysym[first.keyCode] = keysym; - } - - return eventLog.shift(); - + else if (eventLog[1] instanceof KeypressEvent) { + keysym = eventLog[1].keysym; + accepted_events = eventLog.splice(0, 2); } // If there is a keyup already, the event must be handled now else if (indexof_keyup(first) !== -1) { - if (keysym) { - first.defaultPrevented = !press_key(keysym); - recentKeysym[first.keyCode] = keysym; - } - return eventLog.shift(); + keysym = first.keysym; + accepted_events = eventLog.splice(0, 1); } - } + // Fire a key press if valid events were found + if (accepted_events.length > 0) { + + if (keysym) { + + // Fire event + release_simulated_altgr(keysym); + var defaultPrevented = !press_key(keysym); + recentKeysym[first.keyCode] = keysym; + + // If a key is pressed while meta is held down, the keyup will + // never be sent in Chrome, so send it now. (bug #108404) + if (guac_keyboard.modifiers.meta && keysym !== 0xFFE7 && keysym !== 0xFFE8) + release_key(keysym); + + // Record whether default was prevented + for (var i=0; i