Unify modifier behavior across browsers, maintain state between events.

This commit is contained in:
Michael Jumper
2013-05-07 16:09:01 -07:00
parent e4008c973d
commit 52579d6f5c

View File

@@ -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 // When key pressed
element.addEventListener("keydown", function(e) { element.addEventListener("keydown", function(e) {
@@ -460,6 +492,9 @@ Guacamole.Keyboard = function(element) {
return; return;
} }
// Fix modifier states
update_modifier_state(e);
// Ctrl/Alt/Shift/Meta // Ctrl/Alt/Shift/Meta
if (keynum == 16) guac_keyboard.modifiers.shift = true; if (keynum == 16) guac_keyboard.modifiers.shift = true;
else if (keynum == 17) guac_keyboard.modifiers.ctrl = true; else if (keynum == 17) guac_keyboard.modifiers.ctrl = true;
@@ -529,11 +564,16 @@ Guacamole.Keyboard = function(element) {
var keysym = keysym_from_charcode(keynum); 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, // If event identified as a typable character, and we're holding Ctrl+Alt,
// assume Ctrl+Alt is actually AltGr, and release both. // assume Ctrl+Alt is actually AltGr, and release both.
if (!isControlCharacter(keynum) && guac_keyboard.modifiers.ctrl && guac_keyboard.modifiers.alt) { if (!isControlCharacter(keynum) && guac_keyboard.modifiers.ctrl && guac_keyboard.modifiers.alt) {
release_key(0xFFE3); release_key(0xFFE3); // Left ctrl
release_key(0xFFE9); release_key(0xFFE4); // Right ctrl
release_key(0xFFE9); // Left alt
release_key(0xFFEA); // Right alt
} }
// Send press + release if keysym known // Send press + release if keysym known
@@ -556,6 +596,9 @@ Guacamole.Keyboard = function(element) {
if (window.event) keynum = window.event.keyCode; if (window.event) keynum = window.event.keyCode;
else if (e.which) keynum = e.which; else if (e.which) keynum = e.which;
// Fix modifier states
update_modifier_state(e);
// Ctrl/Alt/Shift/Meta // Ctrl/Alt/Shift/Meta
if (keynum == 16) guac_keyboard.modifiers.shift = false; if (keynum == 16) guac_keyboard.modifiers.shift = false;
else if (keynum == 17) guac_keyboard.modifiers.ctrl = false; else if (keynum == 17) guac_keyboard.modifiers.ctrl = false;
@@ -572,12 +615,4 @@ Guacamole.Keyboard = function(element) {
}, true); }, 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);
}; };