preventDefault() in keypress, too.
[guacamole-common-js.git] / src / main / resources / keyboard.js
index d1d2224..fe2e777 100644 (file)
@@ -262,7 +262,7 @@ Guacamole.Keyboard = function(element) {
 
     // Stops repeating keystrokes
     function stopRepeat() {
-        if (repeatKeyTimeoutId != -1) clearInterval(repeatKeyTimeoutId);
+        if (repeatKeyTimeoutId != -1) clearTimeout(repeatKeyTimeoutId);
         if (repeatKeyIntervalId != -1) clearInterval(repeatKeyIntervalId);
     }
 
@@ -444,7 +444,6 @@ Guacamole.Keyboard = function(element) {
         if (keydown_keysym)
             e.preventDefault();
         
-
         // Also try to get get keysym from keyIdentifier
         if (e.keyIdentifier) {
 
@@ -479,6 +478,8 @@ Guacamole.Keyboard = function(element) {
         // Only intercept if handler set
         if (!guac_keyboard.onkeydown) return;
 
+        e.preventDefault();
+
         var keynum;
         if (window.event) keynum = window.event.keyCode;
         else if (e.which) keynum = e.which;
@@ -511,25 +512,27 @@ Guacamole.Keyboard = function(element) {
         if (window.event) keynum = window.event.keyCode;
         else if (e.which) keynum = e.which;
         
-        // Ignore any unknown key events
-        if (keynum == 0)
-            return;
+        // 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();
 
-        // 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
-        sendKeyReleased(lastKeyDownChar);
+        }, 0);
 
     };