mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-07 13:41:21 +00:00
Defer handling of keypress via JS event queue.
This commit is contained in:
@@ -265,13 +265,44 @@ Guacamole.Keyboard = function(element) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var KEYDOWN = 1;
|
var keydown_code = null;
|
||||||
var KEYPRESS = 2;
|
|
||||||
|
|
||||||
var keySymSource = null;
|
var deferred_keypress = null;
|
||||||
|
var keydown_keysym = null;
|
||||||
|
var keypress_keysym = null;
|
||||||
|
|
||||||
|
function fireKeyPress() {
|
||||||
|
|
||||||
|
// Prefer keysym from keypress
|
||||||
|
var keysym = keypress_keysym || keydown_keysym;
|
||||||
|
var keynum = keydown_code;
|
||||||
|
|
||||||
|
if (keydownChar[keynum] != keysym) {
|
||||||
|
|
||||||
|
// If this button is already pressed, release first
|
||||||
|
var lastKeyDownChar = keydownChar[keydown_code];
|
||||||
|
if (lastKeyDownChar)
|
||||||
|
sendKeyReleased(lastKeyDownChar);
|
||||||
|
|
||||||
|
// Send event
|
||||||
|
keydownChar[keynum] = keysym;
|
||||||
|
sendKeyPressed(keysym);
|
||||||
|
|
||||||
|
// Clear old key repeat, if any.
|
||||||
|
stopRepeat();
|
||||||
|
|
||||||
|
// Start repeating (if not a modifier key) after a short delay
|
||||||
|
if (keynum != 16 && keynum != 17 && keynum != 18)
|
||||||
|
repeatKeyTimeoutId = setTimeout(function() { startRepeat(keysym); }, 500);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Done with deferred key event
|
||||||
|
deferred_keypress = null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// When key pressed
|
// When key pressed
|
||||||
var keydownCode = null;
|
|
||||||
element.onkeydown = function(e) {
|
element.onkeydown = function(e) {
|
||||||
|
|
||||||
// Only intercept if handler set
|
// Only intercept if handler set
|
||||||
@@ -286,58 +317,22 @@ Guacamole.Keyboard = function(element) {
|
|||||||
else if (keynum == 17) guac_keyboard.modifiers.ctrl = true;
|
else if (keynum == 17) guac_keyboard.modifiers.ctrl = true;
|
||||||
else if (keynum == 18) guac_keyboard.modifiers.alt = true;
|
else if (keynum == 18) guac_keyboard.modifiers.alt = true;
|
||||||
|
|
||||||
// If keysym is defined for given key code, key events can come from
|
// Try to get keysym from keycode
|
||||||
// KEYDOWN.
|
keydown_keysym = getKeySymFromKeyCode(keynum);
|
||||||
var keysym = getKeySymFromKeyCode(keynum);
|
|
||||||
if (keysym)
|
|
||||||
keySymSource = KEYDOWN;
|
|
||||||
|
|
||||||
// Otherwise, if modifier keys are held down, try to get from keyIdentifier
|
// Also try to get get keysym from keyIdentifier
|
||||||
else if ((guac_keyboard.modifiers.ctrl || guac_keyboard.modifiers.alt) && e.keyIdentifier) {
|
if (e.keyIdentifier)
|
||||||
|
keydown_keysym = getKeySymFromKeyIdentifier(guac_keyboard.modifiers.shift, e.keyIdentifier);
|
||||||
|
|
||||||
// Get keysym from keyIdentifier
|
// Set keycode which will be associated with any future keypress
|
||||||
keysym = getKeySymFromKeyIdentifier(guac_keyboard.modifiers.shift, e.keyIdentifier);
|
keydown_code = keynum;
|
||||||
|
|
||||||
// Get keysyms and events from KEYDOWN
|
// Defer handling of event until after any other pending
|
||||||
keySymSource = KEYDOWN;
|
// key events.
|
||||||
|
if (!deferred_keypress)
|
||||||
|
deferred_keypress = window.setTimeout(fireKeyPress, 0);
|
||||||
|
|
||||||
}
|
return false;
|
||||||
|
|
||||||
// Otherwise, resort to KEYPRESS
|
|
||||||
else
|
|
||||||
keySymSource = KEYPRESS;
|
|
||||||
|
|
||||||
keydownCode = keynum;
|
|
||||||
|
|
||||||
// Ignore key if we don't need to use KEYPRESS.
|
|
||||||
// Send key event here
|
|
||||||
if (keySymSource == KEYDOWN) {
|
|
||||||
|
|
||||||
if (keydownChar[keynum] != keysym) {
|
|
||||||
|
|
||||||
// Send event
|
|
||||||
keydownChar[keynum] = keysym;
|
|
||||||
var returnValue = sendKeyPressed(keysym);
|
|
||||||
|
|
||||||
// Clear old key repeat, if any.
|
|
||||||
stopRepeat();
|
|
||||||
|
|
||||||
// Start repeating (if not a modifier key) after a short delay
|
|
||||||
if (keynum != 16 && keynum != 17 && keynum != 18)
|
|
||||||
repeatKeyTimeoutId = setTimeout(function() { startRepeat(keysym); }, 500);
|
|
||||||
|
|
||||||
// Use return code provided by handler
|
|
||||||
return returnValue;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default to canceling event if no keypress is being sent, but
|
|
||||||
// source of events is keydown.
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -353,30 +348,13 @@ Guacamole.Keyboard = function(element) {
|
|||||||
if (window.event) keynum = window.event.keyCode;
|
if (window.event) keynum = window.event.keyCode;
|
||||||
else if (e.which) keynum = e.which;
|
else if (e.which) keynum = e.which;
|
||||||
|
|
||||||
var keysym = getKeySymFromCharCode(keynum);
|
keypress_keysym = getKeySymFromCharCode(keynum);
|
||||||
if (keysym && keydownChar[keynum] != keysym) {
|
|
||||||
|
|
||||||
// If this button already pressed, release first
|
// Defer handling of event until after any other pending
|
||||||
var lastKeyDownChar = keydownChar[keydownCode];
|
// key events.
|
||||||
if (lastKeyDownChar)
|
if (!deferred_keypress)
|
||||||
sendKeyReleased(lastKeyDownChar);
|
deferred_keypress = window.setTimeout(fireKeyPress, 0);
|
||||||
|
|
||||||
keydownChar[keydownCode] = keysym;
|
|
||||||
|
|
||||||
// Clear old key repeat, if any.
|
|
||||||
stopRepeat();
|
|
||||||
|
|
||||||
// Send key event
|
|
||||||
var returnValue = sendKeyPressed(keysym);
|
|
||||||
|
|
||||||
// Start repeating (if not a modifier key) after a short delay
|
|
||||||
repeatKeyTimeoutId = setTimeout(function() { startRepeat(keysym); }, 500);
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default to canceling event if no keypress is being sent, but
|
|
||||||
// source of events is keypress.
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user