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); - };