X-Git-Url: http://git.alex.org.uk diff --git a/src/main/resources/keyboard.js b/src/main/resources/keyboard.js index af19c26..8c0d3ab 100644 --- a/src/main/resources/keyboard.js +++ b/src/main/resources/keyboard.js @@ -357,13 +357,14 @@ Guacamole.Keyboard = function(element) { } + 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; @@ -417,7 +418,7 @@ Guacamole.Keyboard = function(element) { } // When key pressed - element.onkeydown = function(e) { + element.addEventListener("keydown", function(e) { // Only intercept if handler set if (!guac_keyboard.onkeydown) return; @@ -427,11 +428,13 @@ Guacamole.Keyboard = function(element) { 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; @@ -442,9 +445,8 @@ Guacamole.Keyboard = function(element) { // 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) { @@ -459,26 +461,40 @@ Guacamole.Keyboard = function(element) { 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; @@ -492,15 +508,17 @@ Guacamole.Keyboard = function(element) { 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; @@ -527,13 +545,13 @@ Guacamole.Keyboard = function(element) { // 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); };