Renamed deferred handler.
[guacamole-common-js.git] / src / main / resources / keyboard.js
index 142d7ac..82a85c5 100644 (file)
@@ -93,6 +93,7 @@ Guacamole.Keyboard = function(element) {
         19:  0xFF13, // pause/break
         20:  0xFFE5, // caps lock
         27:  0xFF1B, // escape
+        32:  0x0020, // space
         33:  0xFF55, // page up
         34:  0xFF56, // page down
         35:  0xFF57, // end
@@ -261,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);
     }
 
@@ -362,7 +363,7 @@ Guacamole.Keyboard = function(element) {
     var keydown_keysym = null;
     var keypress_keysym = null;
 
-    function fireKeyPress() {
+    function handleKeyEvents() {
 
         // Prefer keysym from keypress
         var keysym = keypress_keysym || keydown_keysym;
@@ -425,6 +426,12 @@ 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) {
+            e.preventDefault();
+            return;
+        }
+
         // Ctrl/Alt/Shift
         if (keynum == 16)      guac_keyboard.modifiers.shift = true;
         else if (keynum == 17) guac_keyboard.modifiers.ctrl  = true;
@@ -433,6 +440,10 @@ Guacamole.Keyboard = function(element) {
         // Try to get keysym from keycode
         keydown_keysym = getKeySymFromKeyCode(keynum);
 
+        // If key is known from keycode, prevent default
+        if (keydown_keysym)
+            e.preventDefault();
+        
         // Also try to get get keysym from keyIdentifier
         if (e.keyIdentifier) {
 
@@ -457,7 +468,7 @@ Guacamole.Keyboard = function(element) {
         // Defer handling of event until after any other pending
         // key events.
         if (!deferred_keypress)
-            deferred_keypress = window.setTimeout(fireKeyPress, 0);
+            deferred_keypress = window.setTimeout(handleKeyEvents, 0);
 
     };
 
@@ -465,7 +476,9 @@ Guacamole.Keyboard = function(element) {
     element.onkeypress = function(e) {
 
         // Only intercept if handler set
-        if (!guac_keyboard.onkeydown) return true;
+        if (!guac_keyboard.onkeydown) return;
+
+        e.preventDefault();
 
         var keynum;
         if (window.event) keynum = window.event.keyCode;
@@ -483,9 +496,7 @@ Guacamole.Keyboard = function(element) {
         // Defer handling of event until after any other pending
         // key events.
         if (!deferred_keypress)
-            deferred_keypress = window.setTimeout(fireKeyPress, 0);
-
-        return false;
+            deferred_keypress = window.setTimeout(handleKeyEvents, 0);
 
     };
 
@@ -493,27 +504,35 @@ Guacamole.Keyboard = function(element) {
     element.onkeyup = function(e) {
 
         // Only intercept if handler set
-        if (!guac_keyboard.onkeyup) return true;
+        if (!guac_keyboard.onkeyup) return;
+
+        e.preventDefault();
 
         var keynum;
         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
-        return sendKeyReleased(lastKeyDownChar);
+        }, 0);
 
     };