From 692186f0c9162731a992740024176c4cf95fdf7e Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 23 Jan 2012 15:24:35 -0800 Subject: [PATCH] Track pressed status of keys. Only release/press keys if not already in that status. --- .../src/main/resources/oskeyboard.js | 71 ++++++++++++------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/guacamole-common-js/src/main/resources/oskeyboard.js b/guacamole-common-js/src/main/resources/oskeyboard.js index 69d71a4b9..8fc3b3692 100644 --- a/guacamole-common-js/src/main/resources/oskeyboard.js +++ b/guacamole-common-js/src/main/resources/oskeyboard.js @@ -269,47 +269,65 @@ Guacamole.OnScreenKeyboard = function(url) { key_element.onmousedown = key_element.ontouchstart = function() { - key_element.classList.add("guac-keyboard-pressed"); + // Press key if not yet pressed + if (!key.pressed) { - // Get current cap based on modifier state - var cap = key.getCap(on_screen_keyboard.modifiers); + key_element.classList.add("guac-keyboard-pressed"); - // Update modifier state - if (cap.modifier) { + // Get current cap based on modifier state + var cap = key.getCap(on_screen_keyboard.modifiers); - // Construct classname for modifier - var modifierClass = "guac-keyboard-modifier-" + cap.modifier; - var modifierFlag = getModifier(cap.modifier); + // Update modifier state + if (cap.modifier) { - // Toggle modifier state - on_screen_keyboard.modifiers ^= modifierFlag; + // Construct classname for modifier + var modifierClass = "guac-keyboard-modifier-" + cap.modifier; + var modifierFlag = getModifier(cap.modifier); - // Activate modifier if pressed - if (on_screen_keyboard.modifiers & modifierFlag) - keyboard.classList.add(modifierClass); + // Toggle modifier state + on_screen_keyboard.modifiers ^= modifierFlag; - // Deactivate if not pressed - else - keyboard.classList.remove(modifierClass); + // Activate modifier if pressed + if (on_screen_keyboard.modifiers & modifierFlag) + keyboard.classList.add(modifierClass); + + // Deactivate if not pressed + else + keyboard.classList.remove(modifierClass); + + } + + // Send key event + if (on_screen_keyboard.onkeydown && cap.keysym) + on_screen_keyboard.onkeydown(cap.keysym); + + // Mark key as pressed + key.pressed = true; } - if (on_screen_keyboard.onkeydown && cap.keysym) - on_screen_keyboard.onkeydown(cap.keysym); - }; key_element.onmouseup = key_element.onmouseout = key_element.ontouchend = function() { - // Get current cap based on modifier state - var cap = key.getCap(on_screen_keyboard.modifiers); + // Release key if currently pressed + if (key.pressed) { - key_element.classList.remove("guac-keyboard-pressed"); + // Get current cap based on modifier state + var cap = key.getCap(on_screen_keyboard.modifiers); - if (on_screen_keyboard.onkeyup && cap.keysym) - on_screen_keyboard.onkeyup(cap.keysym); + key_element.classList.remove("guac-keyboard-pressed"); + + // Send key event + if (on_screen_keyboard.onkeyup && cap.keysym) + on_screen_keyboard.onkeyup(cap.keysym); + + // Mark key as released + key.pressed = false; + + } }; @@ -409,6 +427,11 @@ Guacamole.OnScreenKeyboard.Key = function() { var key = this; + /** + * Whether this key is currently pressed. + */ + this.pressed = false; + /** * Width of the key, relative to the size of the keyboard. */