mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 13:17:41 +00:00
Allow user of API to decide whether keyboard events are canceled.
This commit is contained in:
@@ -60,8 +60,11 @@ Guacamole.Keyboard = function(element) {
|
|||||||
*
|
*
|
||||||
* @event
|
* @event
|
||||||
* @param {Number} keysym The keysym of the key being pressed.
|
* @param {Number} keysym The keysym of the key being pressed.
|
||||||
|
* @returns {Boolean} true if the originating event of this keypress should
|
||||||
|
* be allowed through to the browser, false or undefined
|
||||||
|
* otherwise.
|
||||||
*/
|
*/
|
||||||
this.onkeydown = null;
|
this.onkeydown = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fired whenever the user releases a key with the element associated
|
* Fired whenever the user releases a key with the element associated
|
||||||
@@ -69,8 +72,11 @@ Guacamole.Keyboard = function(element) {
|
|||||||
*
|
*
|
||||||
* @event
|
* @event
|
||||||
* @param {Number} keysym The keysym of the key being released.
|
* @param {Number} keysym The keysym of the key being released.
|
||||||
|
* @returns {Boolean} true if the originating event of this key release
|
||||||
|
* should be allowed through to the browser, false or
|
||||||
|
* undefined otherwise.
|
||||||
*/
|
*/
|
||||||
this.onkeyup = null;
|
this.onkeyup = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map of known JavaScript keycodes which do not map to typable characters
|
* Map of known JavaScript keycodes which do not map to typable characters
|
||||||
@@ -127,10 +133,10 @@ Guacamole.Keyboard = function(element) {
|
|||||||
18: 0xFFE7 // alt
|
18: 0xFFE7 // alt
|
||||||
};
|
};
|
||||||
|
|
||||||
// Single key state/modifier buffer
|
// Single key state/modifier buffer
|
||||||
var modShift = false;
|
var modShift = false;
|
||||||
var modCtrl = false;
|
var modCtrl = false;
|
||||||
var modAlt = false;
|
var modAlt = false;
|
||||||
|
|
||||||
var keydownChar = new Array();
|
var keydownChar = new Array();
|
||||||
|
|
||||||
@@ -138,19 +144,19 @@ Guacamole.Keyboard = function(element) {
|
|||||||
var repeatKeyTimeoutId = -1;
|
var repeatKeyTimeoutId = -1;
|
||||||
var repeatKeyIntervalId = -1;
|
var repeatKeyIntervalId = -1;
|
||||||
|
|
||||||
// Starts repeating keystrokes
|
// Starts repeating keystrokes
|
||||||
function startRepeat(keySym) {
|
function startRepeat(keySym) {
|
||||||
repeatKeyIntervalId = setInterval(function() {
|
repeatKeyIntervalId = setInterval(function() {
|
||||||
sendKeyReleased(keySym);
|
sendKeyReleased(keySym);
|
||||||
sendKeyPressed(keySym);
|
sendKeyPressed(keySym);
|
||||||
}, 50);
|
}, 50);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stops repeating keystrokes
|
// Stops repeating keystrokes
|
||||||
function stopRepeat() {
|
function stopRepeat() {
|
||||||
if (repeatKeyTimeoutId != -1) clearInterval(repeatKeyTimeoutId);
|
if (repeatKeyTimeoutId != -1) clearInterval(repeatKeyTimeoutId);
|
||||||
if (repeatKeyIntervalId != -1) clearInterval(repeatKeyIntervalId);
|
if (repeatKeyIntervalId != -1) clearInterval(repeatKeyIntervalId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function getKeySymFromKeyIdentifier(shifted, keyIdentifier) {
|
function getKeySymFromKeyIdentifier(shifted, keyIdentifier) {
|
||||||
@@ -194,8 +200,8 @@ Guacamole.Keyboard = function(element) {
|
|||||||
function getKeySymFromKeyCode(keyCode) {
|
function getKeySymFromKeyCode(keyCode) {
|
||||||
|
|
||||||
var keysym = null;
|
var keysym = null;
|
||||||
if (!modShift) keysym = unshiftedKeySym[keyCode];
|
if (!modShift) keysym = unshiftedKeySym[keyCode];
|
||||||
else {
|
else {
|
||||||
keysym = shiftedKeySym[keyCode];
|
keysym = shiftedKeySym[keyCode];
|
||||||
if (keysym == null) keysym = unshiftedKeySym[keyCode];
|
if (keysym == null) keysym = unshiftedKeySym[keyCode];
|
||||||
}
|
}
|
||||||
@@ -205,17 +211,19 @@ Guacamole.Keyboard = function(element) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Sends a single keystroke over the network
|
// Sends a single keystroke over the network
|
||||||
function sendKeyPressed(keysym) {
|
function sendKeyPressed(keysym) {
|
||||||
if (keysym != null && guac_keyboard.onkeydown)
|
if (keysym != null && guac_keyboard.onkeydown)
|
||||||
guac_keyboard.onkeydown(keysym);
|
return guac_keyboard.onkeydown(keysym) != false;
|
||||||
}
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Sends a single keystroke over the network
|
// Sends a single keystroke over the network
|
||||||
function sendKeyReleased(keysym) {
|
function sendKeyReleased(keysym) {
|
||||||
if (keysym != null && guac_keyboard.onkeyup)
|
if (keysym != null && guac_keyboard.onkeyup)
|
||||||
guac_keyboard.onkeyup(keysym);
|
return guac_keyboard.onkeyup(keysym) != false;
|
||||||
}
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
var KEYDOWN = 1;
|
var KEYDOWN = 1;
|
||||||
@@ -223,24 +231,24 @@ Guacamole.Keyboard = function(element) {
|
|||||||
|
|
||||||
var keySymSource = null;
|
var keySymSource = null;
|
||||||
|
|
||||||
// When key pressed
|
// When key pressed
|
||||||
var keydownCode = null;
|
var keydownCode = null;
|
||||||
element.onkeydown = function(e) {
|
element.onkeydown = function(e) {
|
||||||
|
|
||||||
// Only intercept if handler set
|
// Only intercept if handler set
|
||||||
if (!guac_keyboard.onkeydown) return true;
|
if (!guac_keyboard.onkeydown) return true;
|
||||||
|
|
||||||
var keynum;
|
var keynum;
|
||||||
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;
|
||||||
|
|
||||||
// Ctrl/Alt/Shift
|
// Ctrl/Alt/Shift
|
||||||
if (keynum == 16)
|
if (keynum == 16)
|
||||||
modShift = true;
|
modShift = true;
|
||||||
else if (keynum == 17)
|
else if (keynum == 17)
|
||||||
modCtrl = true;
|
modCtrl = true;
|
||||||
else if (keynum == 18)
|
else if (keynum == 18)
|
||||||
modAlt = true;
|
modAlt = true;
|
||||||
|
|
||||||
var keysym = getKeySymFromKeyCode(keynum);
|
var keysym = getKeySymFromKeyCode(keynum);
|
||||||
if (keysym) {
|
if (keysym) {
|
||||||
@@ -269,11 +277,13 @@ Guacamole.Keyboard = function(element) {
|
|||||||
// Send key event here
|
// Send key event here
|
||||||
if (keySymSource == KEYDOWN) {
|
if (keySymSource == KEYDOWN) {
|
||||||
|
|
||||||
|
var returnValue = true;
|
||||||
|
|
||||||
if (keydownChar[keynum] != keysym) {
|
if (keydownChar[keynum] != keysym) {
|
||||||
|
|
||||||
// Send event
|
// Send event
|
||||||
keydownChar[keynum] = keysym;
|
keydownChar[keynum] = keysym;
|
||||||
sendKeyPressed(keysym);
|
returnValue = sendKeyPressed(keysym);
|
||||||
|
|
||||||
// Clear old key repeat, if any.
|
// Clear old key repeat, if any.
|
||||||
stopRepeat();
|
stopRepeat();
|
||||||
@@ -283,14 +293,14 @@ Guacamole.Keyboard = function(element) {
|
|||||||
repeatKeyTimeoutId = setTimeout(function() { startRepeat(keysym); }, 500);
|
repeatKeyTimeoutId = setTimeout(function() { startRepeat(keysym); }, 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return returnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// When key pressed
|
// When key pressed
|
||||||
element.onkeypress = function(e) {
|
element.onkeypress = function(e) {
|
||||||
|
|
||||||
// Only intercept if handler set
|
// Only intercept if handler set
|
||||||
@@ -298,10 +308,11 @@ Guacamole.Keyboard = function(element) {
|
|||||||
|
|
||||||
if (keySymSource != KEYPRESS) return false;
|
if (keySymSource != KEYPRESS) return false;
|
||||||
|
|
||||||
var keynum;
|
var keynum;
|
||||||
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 returnValue = true;
|
||||||
var keysym = getKeySymFromCharCode(keynum);
|
var keysym = getKeySymFromCharCode(keynum);
|
||||||
if (keysym && keydownChar[keynum] != keysym) {
|
if (keysym && keydownChar[keynum] != keysym) {
|
||||||
|
|
||||||
@@ -316,32 +327,33 @@ Guacamole.Keyboard = function(element) {
|
|||||||
stopRepeat();
|
stopRepeat();
|
||||||
|
|
||||||
// Send key event
|
// Send key event
|
||||||
sendKeyPressed(keysym);
|
returnValue = sendKeyPressed(keysym);
|
||||||
|
|
||||||
// Start repeating (if not a modifier key) after a short delay
|
// Start repeating (if not a modifier key) after a short delay
|
||||||
repeatKeyTimeoutId = setTimeout(function() { startRepeat(keysym); }, 500);
|
repeatKeyTimeoutId = setTimeout(function() { startRepeat(keysym); }, 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return returnValue;
|
||||||
};
|
|
||||||
|
|
||||||
// When key released
|
};
|
||||||
element.onkeyup = function(e) {
|
|
||||||
|
// When key released
|
||||||
|
element.onkeyup = function(e) {
|
||||||
|
|
||||||
// Only intercept if handler set
|
// Only intercept if handler set
|
||||||
if (!guac_keyboard.onkeyup) return true;
|
if (!guac_keyboard.onkeyup) return true;
|
||||||
|
|
||||||
var keynum;
|
var keynum;
|
||||||
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;
|
||||||
|
|
||||||
// Ctrl/Alt/Shift
|
// Ctrl/Alt/Shift
|
||||||
if (keynum == 16)
|
if (keynum == 16)
|
||||||
modShift = false;
|
modShift = false;
|
||||||
else if (keynum == 17)
|
else if (keynum == 17)
|
||||||
modCtrl = false;
|
modCtrl = false;
|
||||||
else if (keynum == 18)
|
else if (keynum == 18)
|
||||||
modAlt = false;
|
modAlt = false;
|
||||||
else
|
else
|
||||||
stopRepeat();
|
stopRepeat();
|
||||||
|
|
||||||
@@ -352,16 +364,15 @@ Guacamole.Keyboard = function(element) {
|
|||||||
keydownChar[keynum] = null;
|
keydownChar[keynum] = null;
|
||||||
|
|
||||||
// Send release event
|
// Send release event
|
||||||
sendKeyReleased(lastKeyDownChar);
|
return sendKeyReleased(lastKeyDownChar);
|
||||||
|
|
||||||
return false;
|
};
|
||||||
};
|
|
||||||
|
|
||||||
// When focus is lost, clear modifiers.
|
// When focus is lost, clear modifiers.
|
||||||
element.onblur = function() {
|
element.onblur = function() {
|
||||||
modAlt = false;
|
modAlt = false;
|
||||||
modCtrl = false;
|
modCtrl = false;
|
||||||
modShift = false;
|
modShift = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user