Use addEventListener(), only ignore key event if truly unknown (might have keyIdentif...
[guacamole-common-js.git] / src / main / resources / keyboard.js
index af19c26..8c0d3ab 100644 (file)
@@ -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);
 
 };