Use timeout only as failsafe. Send key events immediately when we know we will handle via keypress or keydown.

This commit is contained in:
Michael Jumper
2012-06-20 22:46:53 -07:00
parent 03486264d1
commit 8f8b41fe8b

View File

@@ -432,6 +432,8 @@ Guacamole.Keyboard = function(element) {
return; return;
} }
var expect_keypress = true;
// Ctrl/Alt/Shift // Ctrl/Alt/Shift
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;
@@ -442,7 +444,7 @@ Guacamole.Keyboard = function(element) {
// If key is known from keycode, prevent default // If key is known from keycode, prevent default
if (keydown_keysym) if (keydown_keysym)
e.preventDefault(); expect_keypress = false;
// Also try to get get keysym from keyIdentifier // Also try to get get keysym from keyIdentifier
if (e.keyIdentifier) { if (e.keyIdentifier) {
@@ -458,17 +460,25 @@ Guacamole.Keyboard = function(element) {
if (!isTypable(e.keyIdentifier) if (!isTypable(e.keyIdentifier)
|| ( guac_keyboard.modifiers.ctrl && !guac_keyboard.modifiers.alt) || ( guac_keyboard.modifiers.ctrl && !guac_keyboard.modifiers.alt)
|| (!guac_keyboard.modifiers.ctrl && guac_keyboard.modifiers.alt)) || (!guac_keyboard.modifiers.ctrl && guac_keyboard.modifiers.alt))
e.preventDefault(); expect_keypress = false;
} }
// Set keycode which will be associated with any future keypress // Set keycode which will be associated with any future keypress
keydown_code = keynum; keydown_code = keynum;
// Defer handling of event until after any other pending // If we expect to handle via keypress, set failsafe timeout and
// key events. // wait for keypress.
if (expect_keypress) {
if (!deferred_keypress) if (!deferred_keypress)
deferred_keypress = window.setTimeout(handleKeyEvents, 0); deferred_keypress = window.setTimeout(handleKeyEvents, 0);
}
// Otherwise, handle now
else {
e.preventDefault();
handleKeyEvents();
}
}; };
@@ -493,10 +503,12 @@ Guacamole.Keyboard = function(element) {
sendKeyReleased(0xFFE9); sendKeyReleased(0xFFE9);
} }
// Defer handling of event until after any other pending // Clear timeout, if any
// key events. if (deferred_keypress)
if (!deferred_keypress) window.clearTimeout(deferred_keypress);
deferred_keypress = window.setTimeout(handleKeyEvents, 0);
// Handle event with all aggregated data
handleKeyEvents();
}; };
@@ -512,10 +524,6 @@ 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;
// Defer handling of keyup (otherwise, keyup may happen before
// deferred handling of keydown/keypress).
window.setTimeout(function() {
// Ctrl/Alt/Shift // Ctrl/Alt/Shift
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;
@@ -532,8 +540,6 @@ Guacamole.Keyboard = function(element) {
// Send release event // Send release event
sendKeyReleased(lastKeyDownChar); sendKeyReleased(lastKeyDownChar);
}, 0);
}; };
// When focus is lost, clear modifiers. // When focus is lost, clear modifiers.