From 52579d6f5c68a2551c2420ea2fb7fa1a773c9501 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Tue, 7 May 2013 16:09:01 -0700 Subject: [PATCH] Unify modifier behavior across browsers, maintain state between events. --- .../src/main/resources/keyboard.js | 55 +++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/guacamole-common-js/src/main/resources/keyboard.js b/guacamole-common-js/src/main/resources/keyboard.js index ad9b63a13..5dbcd1122 100644 --- a/guacamole-common-js/src/main/resources/keyboard.js +++ b/guacamole-common-js/src/main/resources/keyboard.js @@ -441,6 +441,38 @@ Guacamole.Keyboard = function(element) { } + /** + * Given a keyboard event, updates the local modifier state and remote + * key state based on the modifier flags within the event. This function + * pays no attention to keycodes. + * + * @param {} e The keyboard event containing the flags to update. + */ + function update_modifier_state(e) { + + // Release alt if implicitly released + if (guac_keyboard.modifiers.alt && e.altKey === false) { + release_key(0xFFE9); // Left alt + release_key(0xFFEA); // Right alt (or AltGr) + guac_keyboard.modifiers.alt = false; + } + + // Release shift if implicitly released + if (guac_keyboard.modifiers.shift && e.shiftKey === false) { + release_key(0xFFE1); // Left shift + release_key(0xFFE2); // Right shift + guac_keyboard.modifiers.shift = false; + } + + // Release ctrl if implicitly released + if (guac_keyboard.modifiers.ctrl && e.ctrlKey === false) { + release_key(0xFFE3); // Left ctrl + release_key(0xFFE4); // Right ctrl + guac_keyboard.modifiers.ctrl = false; + } + + } + // When key pressed element.addEventListener("keydown", function(e) { @@ -460,6 +492,9 @@ Guacamole.Keyboard = function(element) { return; } + // Fix modifier states + update_modifier_state(e); + // Ctrl/Alt/Shift/Meta if (keynum == 16) guac_keyboard.modifiers.shift = true; else if (keynum == 17) guac_keyboard.modifiers.ctrl = true; @@ -529,11 +564,16 @@ Guacamole.Keyboard = function(element) { var keysym = keysym_from_charcode(keynum); + // Fix modifier states + update_modifier_state(e); + // If event identified as a typable character, and we're holding Ctrl+Alt, // assume Ctrl+Alt is actually AltGr, and release both. if (!isControlCharacter(keynum) && guac_keyboard.modifiers.ctrl && guac_keyboard.modifiers.alt) { - release_key(0xFFE3); - release_key(0xFFE9); + release_key(0xFFE3); // Left ctrl + release_key(0xFFE4); // Right ctrl + release_key(0xFFE9); // Left alt + release_key(0xFFEA); // Right alt } // Send press + release if keysym known @@ -556,6 +596,9 @@ Guacamole.Keyboard = function(element) { if (window.event) keynum = window.event.keyCode; else if (e.which) keynum = e.which; + // Fix modifier states + update_modifier_state(e); + // Ctrl/Alt/Shift/Meta if (keynum == 16) guac_keyboard.modifiers.shift = false; else if (keynum == 17) guac_keyboard.modifiers.ctrl = false; @@ -572,12 +615,4 @@ Guacamole.Keyboard = function(element) { }, true); - // When focus is lost, clear modifiers. - element.addEventListener("blur", function() { - guac_keyboard.modifiers.alt = false; - guac_keyboard.modifiers.ctrl = false; - guac_keyboard.modifiers.shift = false; - guac_keyboard.modifiers.meta = false; - }, true); - };