19: 0xFF13, // pause/break
20: 0xFFE5, // caps lock
27: 0xFF1B, // escape
+ 32: 0x0020, // space
33: 0xFF55, // page up
34: 0xFF56, // page down
35: 0xFF57, // end
// Stops repeating keystrokes
function stopRepeat() {
- if (repeatKeyTimeoutId != -1) clearInterval(repeatKeyTimeoutId);
+ if (repeatKeyTimeoutId != -1) clearTimeout(repeatKeyTimeoutId);
if (repeatKeyIntervalId != -1) clearInterval(repeatKeyIntervalId);
}
var keydown_keysym = null;
var keypress_keysym = null;
- function fireKeyPress() {
+ function handleKeyEvents() {
// Prefer keysym from keypress
var keysym = keypress_keysym || keydown_keysym;
if (window.event) keynum = window.event.keyCode;
else if (e.which) keynum = e.which;
+ // Ignore any unknown key events
+ if (keynum == 0) {
+ e.preventDefault();
+ return;
+ }
+
// Ctrl/Alt/Shift
if (keynum == 16) guac_keyboard.modifiers.shift = true;
else if (keynum == 17) guac_keyboard.modifiers.ctrl = true;
// Try to get keysym from keycode
keydown_keysym = getKeySymFromKeyCode(keynum);
+ // If key is known from keycode, prevent default
+ if (keydown_keysym)
+ e.preventDefault();
+
// Also try to get get keysym from keyIdentifier
if (e.keyIdentifier) {
// Defer handling of event until after any other pending
// key events.
if (!deferred_keypress)
- deferred_keypress = window.setTimeout(fireKeyPress, 0);
+ deferred_keypress = window.setTimeout(handleKeyEvents, 0);
};
element.onkeypress = function(e) {
// Only intercept if handler set
- if (!guac_keyboard.onkeydown) return true;
+ if (!guac_keyboard.onkeydown) return;
+
+ e.preventDefault();
var keynum;
if (window.event) keynum = window.event.keyCode;
// Defer handling of event until after any other pending
// key events.
if (!deferred_keypress)
- deferred_keypress = window.setTimeout(fireKeyPress, 0);
-
- return false;
+ deferred_keypress = window.setTimeout(handleKeyEvents, 0);
};
element.onkeyup = function(e) {
// Only intercept if handler set
- if (!guac_keyboard.onkeyup) return true;
+ if (!guac_keyboard.onkeyup) return;
+
+ e.preventDefault();
var keynum;
if (window.event) keynum = window.event.keyCode;
else if (e.which) keynum = e.which;
- // 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();
+ // 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];
- // Get corresponding character
- var lastKeyDownChar = keydownChar[keynum];
+ // Clear character record
+ keydownChar[keynum] = null;
- // Clear character record
- keydownChar[keynum] = null;
+ // Send release event
+ sendKeyReleased(lastKeyDownChar);
- // Send release event
- return sendKeyReleased(lastKeyDownChar);
+ }, 0);
};