Use addEventListener(), only ignore key event if truly unknown (might have keyIdentif...
[guacamole-common-js.git] / src / main / resources / keyboard.js
index a059847..8c0d3ab 100644 (file)
@@ -357,6 +357,7 @@ Guacamole.Keyboard = function(element) {
     }
 
 
+    var expect_keypress = true;
     var keydown_code = null;
 
     var deferred_keypress = null;
@@ -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,12 +428,12 @@ 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;
         }
 
-        var expect_keypress = true;
+        expect_keypress = true;
 
         // Ctrl/Alt/Shift
         if (keynum == 16)      guac_keyboard.modifiers.shift = true;
@@ -480,16 +481,20 @@ Guacamole.Keyboard = function(element) {
             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;
@@ -510,10 +515,10 @@ Guacamole.Keyboard = function(element) {
         // 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;
@@ -540,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);
 
 };