As keydown/keypress are handled via deferred setTimeout(), so should keyup (otherwise...
authorMichael Jumper <zhangmaike@users.sourceforge.net>
Wed, 16 May 2012 20:36:28 +0000 (13:36 -0700)
committerMichael Jumper <zhangmaike@users.sourceforge.net>
Wed, 16 May 2012 20:36:28 +0000 (13:36 -0700)
src/main/resources/keyboard.js

index af19c26..4f95716 100644 (file)
@@ -511,21 +511,27 @@ Guacamole.Keyboard = function(element) {
         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
-        sendKeyReleased(lastKeyDownChar);
+        }, 0);
 
     };