var keydown_keysym = null;
var keypress_keysym = null;
- function fireKeyPress() {
+ function handleKeyEvents() {
// Prefer keysym from keypress
var keysym = keypress_keysym || keydown_keysym;
return;
}
+ var expect_keypress = true;
+
// Ctrl/Alt/Shift
if (keynum == 16) guac_keyboard.modifiers.shift = true;
else if (keynum == 17) guac_keyboard.modifiers.ctrl = true;
// If key is known from keycode, prevent default
if (keydown_keysym)
- e.preventDefault();
+ expect_keypress = false;
// Also try to get get keysym from keyIdentifier
if (e.keyIdentifier) {
if (!isTypable(e.keyIdentifier)
|| ( 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
keydown_code = keynum;
- // Defer handling of event until after any other pending
- // key events.
- if (!deferred_keypress)
- deferred_keypress = window.setTimeout(fireKeyPress, 0);
+ // If we expect to handle via keypress, set failsafe timeout and
+ // wait for keypress.
+ if (expect_keypress) {
+ if (!deferred_keypress)
+ deferred_keypress = window.setTimeout(handleKeyEvents, 0);
+ }
+
+ // Otherwise, handle now
+ else {
+ e.preventDefault();
+ handleKeyEvents();
+ }
};
sendKeyReleased(0xFFE9);
}
- // Defer handling of event until after any other pending
- // key events.
- if (!deferred_keypress)
- deferred_keypress = window.setTimeout(fireKeyPress, 0);
+ // Clear timeout, if any
+ if (deferred_keypress)
+ window.clearTimeout(deferred_keypress);
+
+ // Handle event with all aggregated data
+ handleKeyEvents();
};
if (window.event) keynum = window.event.keyCode;
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
- if (keynum == 16) guac_keyboard.modifiers.shift = false;
- else if (keynum == 17) guac_keyboard.modifiers.ctrl = false;
- else if (keynum == 18) guac_keyboard.modifiers.alt = false;
- else
- stopRepeat();
-
- // Get corresponding character
- var lastKeyDownChar = keydownChar[keynum];
+ // Ctrl/Alt/Shift
+ if (keynum == 16) guac_keyboard.modifiers.shift = false;
+ else if (keynum == 17) guac_keyboard.modifiers.ctrl = false;
+ else if (keynum == 18) guac_keyboard.modifiers.alt = false;
+ else
+ stopRepeat();
- // Clear character record
- keydownChar[keynum] = null;
+ // Get corresponding character
+ var lastKeyDownChar = keydownChar[keynum];
- // Send release event
- sendKeyReleased(lastKeyDownChar);
+ // Clear character record
+ keydownChar[keynum] = null;
- }, 0);
+ // Send release event
+ sendKeyReleased(lastKeyDownChar);
};