*
* ***** END LICENSE BLOCK ***** */
-// Guacamole namespace
+/**
+ * Namespace for all Guacamole JavaScript objects.
+ * @namespace
+ */
var Guacamole = Guacamole || {};
/**
*
* @event
* @param {Number} keysym The keysym of the key being pressed.
- * @returns {Boolean} true if the originating event of this keypress should
- * be allowed through to the browser, false or undefined
- * otherwise.
*/
this.onkeydown = null;
*
* @event
* @param {Number} keysym The keysym of the key being released.
- * @returns {Boolean} true if the originating event of this key release
- * should be allowed through to the browser, false or
- * undefined otherwise.
*/
this.onkeyup = null;
// Send key event
if (keysym != null && guac_keyboard.onkeydown)
- return guac_keyboard.onkeydown(keysym) != false;
-
- return true;
+ guac_keyboard.onkeydown(keysym);
}
// Send key event
if (keysym != null && guac_keyboard.onkeyup)
- return guac_keyboard.onkeyup(keysym) != false;
-
- return true;
+ guac_keyboard.onkeyup(keysym);
}
+ var expect_keypress = true;
var keydown_code = null;
var deferred_keypress = null;
var keydown_keysym = null;
var keypress_keysym = null;
- function fireKeyPress() {
+ function handleKeyEvents() {
// Prefer keysym from keypress
var keysym = keypress_keysym || keydown_keysym;
}
// When key pressed
- element.onkeydown = function(e) {
+ element.addEventListener("keydown", function(e) {
// Only intercept if handler set
if (!guac_keyboard.onkeydown) return;
else if (e.which) keynum = e.which;
// Ignore any unknown key events
- if (keynum == 0) {
+ if (keynum == 0 && !e.keyIdentifier) {
e.preventDefault();
return;
}
+ 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();
+ }
+
+ }, true);
// When key pressed
- element.onkeypress = function(e) {
+ element.addEventListener("keypress", function(e) {
// Only intercept if handler set
if (!guac_keyboard.onkeydown) return;
+ e.preventDefault();
+
+ // Do not handle if we weren't expecting this event (will have already
+ // been handled by keydown)
+ if (!expect_keypress) return;
+
var keynum;
if (window.event) keynum = window.event.keyCode;
else if (e.which) keynum = e.which;
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();
+
+ }, true);
// When key released
- element.onkeyup = function(e) {
+ element.addEventListener("keyup", function(e) {
// Only intercept if handler set
if (!guac_keyboard.onkeyup) return;
// Send release event
sendKeyReleased(lastKeyDownChar);
- };
+ }, true);
// When focus is lost, clear modifiers.
- element.onblur = function() {
+ element.addEventListener("blur", function() {
guac_keyboard.modifiers.alt = false;
guac_keyboard.modifiers.ctrl = false;
guac_keyboard.modifiers.shift = false;
- };
+ }, true);
};