From: Michael Jumper Date: Thu, 21 Jun 2012 05:46:53 +0000 (-0700) Subject: Use timeout only as failsafe. Send key events immediately when we know we will handle... X-Git-Url: http://git.alex.org.uk Use timeout only as failsafe. Send key events immediately when we know we will handle via keypress or keydown. --- diff --git a/src/main/resources/keyboard.js b/src/main/resources/keyboard.js index 82a85c5..a059847 100644 --- a/src/main/resources/keyboard.js +++ b/src/main/resources/keyboard.js @@ -432,6 +432,8 @@ Guacamole.Keyboard = function(element) { 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; @@ -442,7 +444,7 @@ 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) { @@ -458,17 +460,25 @@ 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(handleKeyEvents, 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(); + } }; @@ -493,10 +503,12 @@ Guacamole.Keyboard = function(element) { sendKeyReleased(0xFFE9); } - // Defer handling of event until after any other pending - // key events. - if (!deferred_keypress) - deferred_keypress = window.setTimeout(handleKeyEvents, 0); + // Clear timeout, if any + if (deferred_keypress) + window.clearTimeout(deferred_keypress); + + // Handle event with all aggregated data + handleKeyEvents(); }; @@ -512,27 +524,21 @@ Guacamole.Keyboard = function(element) { 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); };