GUAC-862: Add keysym to all KeyEvents. Move keysym determination logic to KeydownEvent/KeyupEvent/KeypressEvent.

This commit is contained in:
Michael Jumper
2014-09-28 15:14:29 -07:00
parent 5141c5e063
commit aae59f6709

View File

@@ -88,6 +88,15 @@ Guacamole.Keyboard = function(element) {
*/ */
this.defaultPrevented = false; this.defaultPrevented = false;
/**
* The keysym of the key associated with this key event, as determined
* by a best-effort guess using available event properties and keyboard
* state.
*
* @type Number
*/
this.keysym = null;
/** /**
* Returns the number of milliseconds elapsed since this event was * Returns the number of milliseconds elapsed since this event was
* received. * received.
@@ -156,6 +165,22 @@ Guacamole.Keyboard = function(element) {
*/ */
this.location = location; this.location = location;
// If key is known from keyCode or DOM3 alone, use that
this.keysym = keysym_from_key_identifier(key, location)
|| keysym_from_keycode(keyCode, location);
// We must use the (potentially buggy) keyIdentifier immediately if
// keypress will likely not fire, as we need to make a best effort
// to prevent default if requested
if (guac_keyboard.modifiers.ctrl
|| guac_keyboard.modifiers.alt
|| guac_keyboard.modifiers.meta
|| guac_keyboard.modifiers.hyper)
this.keysym = this.keysym || keysym_from_key_identifier(keyIdentifier, location, guac_keyboard.modifiers.shift);
// Record most recently known keysym by associated key code
recentKeysym[keyCode] = this.keysym;
}; };
KeydownEvent.prototype = new KeyEvent(); KeydownEvent.prototype = new KeyEvent();
@@ -184,6 +209,9 @@ Guacamole.Keyboard = function(element) {
*/ */
this.charCode = charCode; this.charCode = charCode;
// Pull keysym from char code
this.keysym = keysym_from_charcode(charCode);
}; };
KeypressEvent.prototype = new KeyEvent(); KeypressEvent.prototype = new KeyEvent();
@@ -243,6 +271,11 @@ Guacamole.Keyboard = function(element) {
*/ */
this.location = location; this.location = location;
// If key is known from keyCode or DOM3 alone, use that
this.keysym = keysym_from_key_identifier(key, location)
|| keysym_from_keycode(keyCode, location)
|| recentKeysym[keyCode];
}; };
KeyupEvent.prototype = new KeyEvent(); KeyupEvent.prototype = new KeyEvent();
@@ -769,21 +802,7 @@ Guacamole.Keyboard = function(element) {
// Keydown event // Keydown event
if (first instanceof KeydownEvent) { if (first instanceof KeydownEvent) {
var keysym; var keysym = first.keysym;
// If key is known from keyCode or DOM3 alone, use that
keysym = keysym_from_key_identifier(first.key, first.location)
|| keysym_from_keycode(first.keyCode, first.location);
// We must use the (potentially buggy) keyIdentifier immediately if
// keypress will likely not fire, as we need to make a best effort
// to prevent default if requested
if (guac_keyboard.modifiers.ctrl
|| guac_keyboard.modifiers.alt
|| guac_keyboard.modifiers.meta
|| guac_keyboard.modifiers.hyper)
keysym = keysym || keysym_from_key_identifier(first.keyIdentifier, first.location, guac_keyboard.modifiers.shift);
if (keysym) { if (keysym) {
recentKeysym[first.keyCode] = keysym; recentKeysym[first.keyCode] = keysym;
first.defaultPrevented = !press_key(keysym); first.defaultPrevented = !press_key(keysym);
@@ -794,7 +813,7 @@ Guacamole.Keyboard = function(element) {
var next = eventLog[1]; var next = eventLog[1];
if (next && next instanceof KeypressEvent) { if (next && next instanceof KeypressEvent) {
keysym = keysym_from_charcode(next.charCode); keysym = next.keysym;
if (keysym) { if (keysym) {
recentKeysym[first.keyCode] = keysym; recentKeysym[first.keyCode] = keysym;
first.defaultPrevented = next.defaultPrevented = !press_key(keysym); first.defaultPrevented = next.defaultPrevented = !press_key(keysym);
@@ -822,10 +841,7 @@ Guacamole.Keyboard = function(element) {
// Keyup event // Keyup event
else if (first instanceof KeyupEvent) { else if (first instanceof KeyupEvent) {
// If key is known from keyCode or DOM3 alone, use that var keysym = first.keysym;
var keysym = keysym_from_key_identifier(first.key, first.location)
|| keysym_from_keycode(first.keyCode, first.location)
|| recentKeysym[first.keyCode];
if (keysym) { if (keysym) {
release_key(keysym); release_key(keysym);
first.defaultPrevented = true; first.defaultPrevented = true;