*
* @event
* @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
*
* @event
* @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
18: 0xFFE7 // alt
};
- // Single key state/modifier buffer
- var modShift = false;
- var modCtrl = false;
- var modAlt = false;
+ // Single key state/modifier buffer
+ var modShift = false;
+ var modCtrl = false;
+ var modAlt = false;
var keydownChar = new Array();
var repeatKeyTimeoutId = -1;
var repeatKeyIntervalId = -1;
- // Starts repeating keystrokes
- function startRepeat(keySym) {
- repeatKeyIntervalId = setInterval(function() {
+ // Starts repeating keystrokes
+ function startRepeat(keySym) {
+ repeatKeyIntervalId = setInterval(function() {
sendKeyReleased(keySym);
sendKeyPressed(keySym);
}, 50);
- }
+ }
- // Stops repeating keystrokes
- function stopRepeat() {
- if (repeatKeyTimeoutId != -1) clearInterval(repeatKeyTimeoutId);
- if (repeatKeyIntervalId != -1) clearInterval(repeatKeyIntervalId);
- }
+ // Stops repeating keystrokes
+ function stopRepeat() {
+ if (repeatKeyTimeoutId != -1) clearInterval(repeatKeyTimeoutId);
+ if (repeatKeyIntervalId != -1) clearInterval(repeatKeyIntervalId);
+ }
function getKeySymFromKeyIdentifier(shifted, keyIdentifier) {
function getKeySymFromKeyCode(keyCode) {
var keysym = null;
- if (!modShift) keysym = unshiftedKeySym[keyCode];
- else {
+ if (!modShift) keysym = unshiftedKeySym[keyCode];
+ else {
keysym = shiftedKeySym[keyCode];
if (keysym == null) keysym = unshiftedKeySym[keyCode];
}
}
- // Sends a single keystroke over the network
- function sendKeyPressed(keysym) {
- if (keysym != null && guac_keyboard.onkeydown)
- guac_keyboard.onkeydown(keysym);
- }
+ // Sends a single keystroke over the network
+ function sendKeyPressed(keysym) {
+ if (keysym != null && guac_keyboard.onkeydown)
+ return guac_keyboard.onkeydown(keysym) != false;
+ return true;
+ }
- // Sends a single keystroke over the network
- function sendKeyReleased(keysym) {
- if (keysym != null && guac_keyboard.onkeyup)
- guac_keyboard.onkeyup(keysym);
- }
+ // Sends a single keystroke over the network
+ function sendKeyReleased(keysym) {
+ if (keysym != null && guac_keyboard.onkeyup)
+ return guac_keyboard.onkeyup(keysym) != false;
+ return true;
+ }
var KEYDOWN = 1;
var keySymSource = null;
- // When key pressed
+ // When key pressed
var keydownCode = null;
- element.onkeydown = function(e) {
+ element.onkeydown = function(e) {
// Only intercept if handler set
if (!guac_keyboard.onkeydown) return true;
- var keynum;
- if (window.event) keynum = window.event.keyCode;
- else if (e.which) keynum = e.which;
+ var keynum;
+ if (window.event) keynum = window.event.keyCode;
+ else if (e.which) keynum = e.which;
- // Ctrl/Alt/Shift
- if (keynum == 16)
- modShift = true;
- else if (keynum == 17)
- modCtrl = true;
- else if (keynum == 18)
- modAlt = true;
+ // Ctrl/Alt/Shift
+ if (keynum == 16)
+ modShift = true;
+ else if (keynum == 17)
+ modCtrl = true;
+ else if (keynum == 18)
+ modAlt = true;
var keysym = getKeySymFromKeyCode(keynum);
if (keysym) {
// Send event
keydownChar[keynum] = keysym;
- sendKeyPressed(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;
- };
+ };
- // When key pressed
+ // When key pressed
element.onkeypress = function(e) {
// Only intercept if handler set
if (keySymSource != KEYPRESS) return false;
- var keynum;
- if (window.event) keynum = window.event.keyCode;
- else if (e.which) keynum = e.which;
+ var keynum;
+ if (window.event) keynum = window.event.keyCode;
+ else if (e.which) keynum = e.which;
var keysym = getKeySymFromCharCode(keynum);
if (keysym && keydownChar[keynum] != keysym) {
stopRepeat();
// Send key event
- sendKeyPressed(keysym);
+ 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;
- };
- // When key released
- element.onkeyup = function(e) {
+ };
+
+ // When key released
+ element.onkeyup = function(e) {
// Only intercept if handler set
if (!guac_keyboard.onkeyup) return true;
- var keynum;
- if (window.event) keynum = window.event.keyCode;
- else if (e.which) keynum = e.which;
-
- // Ctrl/Alt/Shift
- if (keynum == 16)
- modShift = false;
- else if (keynum == 17)
- modCtrl = false;
- else if (keynum == 18)
- modAlt = false;
+ var keynum;
+ if (window.event) keynum = window.event.keyCode;
+ else if (e.which) keynum = e.which;
+
+ // Ctrl/Alt/Shift
+ if (keynum == 16)
+ modShift = false;
+ else if (keynum == 17)
+ modCtrl = false;
+ else if (keynum == 18)
+ modAlt = false;
else
stopRepeat();
keydownChar[keynum] = null;
// Send release event
- sendKeyReleased(lastKeyDownChar);
+ return sendKeyReleased(lastKeyDownChar);
- return false;
- };
+ };
- // When focus is lost, clear modifiers.
- element.onblur = function() {
- modAlt = false;
- modCtrl = false;
- modShift = false;
- };
+ // When focus is lost, clear modifiers.
+ element.onblur = function() {
+ modAlt = false;
+ modCtrl = false;
+ modShift = false;
+ };
};