mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-07 13:41:21 +00:00
GUAC-862: Interpret as many events from the log as possible.
This commit is contained in:
@@ -76,9 +76,18 @@ Guacamole.Keyboard = function(element) {
|
|||||||
/**
|
/**
|
||||||
* An arbitrary timestamp in milliseconds, indicating this event's
|
* An arbitrary timestamp in milliseconds, indicating this event's
|
||||||
* position in time relative to other events.
|
* position in time relative to other events.
|
||||||
|
*
|
||||||
|
* @type Number
|
||||||
*/
|
*/
|
||||||
this.timestamp = new Date().getTime();
|
this.timestamp = new Date().getTime();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the default action of this key event should be prevented.
|
||||||
|
*
|
||||||
|
* @type Boolean
|
||||||
|
*/
|
||||||
|
this.defaultPrevented = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the number of milliseconds elapsed since this event was
|
* Returns the number of milliseconds elapsed since this event was
|
||||||
* received.
|
* received.
|
||||||
@@ -719,10 +728,37 @@ Guacamole.Keyboard = function(element) {
|
|||||||
*/
|
*/
|
||||||
function interpret_events() {
|
function interpret_events() {
|
||||||
|
|
||||||
|
// Do not prevent default if no event could be interpreted
|
||||||
|
var handled_event = interpret_event();
|
||||||
|
if (!handled_event)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Interpret as much as possible
|
||||||
|
var last_event;
|
||||||
|
do {
|
||||||
|
last_event = handled_event;
|
||||||
|
handled_event = interpret_event();
|
||||||
|
} while (handled_event !== null);
|
||||||
|
|
||||||
|
return last_event.defaultPrevented;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads through the event log, interpreting the first event, if possible,
|
||||||
|
* and returning that event. If no events can be interpreted, due to a
|
||||||
|
* total lack of events or the need for more events, null is returned. Any
|
||||||
|
* interpreted events are automatically removed from the log.
|
||||||
|
*
|
||||||
|
* @return {KeyEvent} The first key event in the log, if it can be
|
||||||
|
* interpreted, or null otherwise.
|
||||||
|
*/
|
||||||
|
function interpret_event() {
|
||||||
|
|
||||||
// Peek at first event in log
|
// Peek at first event in log
|
||||||
var first = eventLog[0];
|
var first = eventLog[0];
|
||||||
if (!first)
|
if (!first)
|
||||||
return false;
|
return null;
|
||||||
|
|
||||||
// Keydown event
|
// Keydown event
|
||||||
if (first instanceof KeydownEvent) {
|
if (first instanceof KeydownEvent) {
|
||||||
@@ -734,8 +770,8 @@ Guacamole.Keyboard = function(element) {
|
|||||||
|| keysym_from_keycode(first.keyCode, first.location);
|
|| keysym_from_keycode(first.keyCode, first.location);
|
||||||
if (keysym) {
|
if (keysym) {
|
||||||
recentKeysym[first.keyCode] = keysym;
|
recentKeysym[first.keyCode] = keysym;
|
||||||
eventLog.shift();
|
first.defaultPrevented = !press_key(keysym);
|
||||||
return !press_key(keysym);
|
return eventLog.shift();
|
||||||
}
|
}
|
||||||
|
|
||||||
// If keydown is immediately followed by a keypress, use the indicated character
|
// If keydown is immediately followed by a keypress, use the indicated character
|
||||||
@@ -745,20 +781,20 @@ Guacamole.Keyboard = function(element) {
|
|||||||
keysym = keysym_from_charcode(next.charCode);
|
keysym = keysym_from_charcode(next.charCode);
|
||||||
if (keysym) {
|
if (keysym) {
|
||||||
recentKeysym[first.keyCode] = keysym;
|
recentKeysym[first.keyCode] = keysym;
|
||||||
eventLog.shift();
|
first.defaultPrevented = !press_key(keysym);
|
||||||
return !press_key(keysym);
|
return eventLog.shift();
|
||||||
}
|
}
|
||||||
|
|
||||||
// If keypress cannot be identified, then drop
|
// If keypress cannot be identified, then drop
|
||||||
console.log("Warning: Key press was dropped as unidentifiable.", first);
|
console.log("Warning: Key press was dropped as unidentifiable.", first);
|
||||||
eventLog.shift();
|
return eventLog.shift();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Drop event if completely old and uninterpretable
|
// Drop event if completely old and uninterpretable
|
||||||
else if (first.getAge() > 100) {
|
else if (first.getAge() > 100) {
|
||||||
console.log("Warning: Key press was dropped as ambiguous.", first);
|
console.log("Warning: Key press was dropped as ambiguous.", first);
|
||||||
eventLog.shift();
|
return eventLog.shift();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lacking further information, pray for a future keypress event
|
// Lacking further information, pray for a future keypress event
|
||||||
@@ -775,23 +811,23 @@ Guacamole.Keyboard = function(element) {
|
|||||||
|| keysym_from_keycode(first.keyCode, first.location)
|
|| keysym_from_keycode(first.keyCode, first.location)
|
||||||
|| recentKeysym[first.keyCode];
|
|| recentKeysym[first.keyCode];
|
||||||
if (keysym) {
|
if (keysym) {
|
||||||
eventLog.shift();
|
|
||||||
release_key(keysym);
|
release_key(keysym);
|
||||||
return true;
|
first.defaultPrevented = true;
|
||||||
|
return eventLog.shift();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Drop if keyup cannot be narrowed to a specific key
|
// Drop if keyup cannot be narrowed to a specific key
|
||||||
console.log("Warning: Key release was dropped as ambiguous.", first);
|
console.log("Warning: Key release was dropped as ambiguous.", first);
|
||||||
eventLog.shift();
|
return eventLog.shift();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dump any other type of event (keypress by itself is invalid)
|
// Dump any other type of event (keypress by itself is invalid)
|
||||||
else
|
else
|
||||||
eventLog.shift();
|
return eventLog.shift();
|
||||||
|
|
||||||
// Do not prevent anything by default
|
// No event interpreted
|
||||||
return false;
|
return null;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user