diff --git a/guacamole-common-js/src/main/resources/oskeyboard.js b/guacamole-common-js/src/main/resources/oskeyboard.js index 573b01b13..84f930cfa 100644 --- a/guacamole-common-js/src/main/resources/oskeyboard.js +++ b/guacamole-common-js/src/main/resources/oskeyboard.js @@ -48,421 +48,35 @@ var Guacamole = Guacamole || {}; */ Guacamole.OnScreenKeyboard = function(url) { - var allKeys = new Array(); - var modifierState = new function() {}; + // For each child of element, call handler defined in next + function parseChildren(element, next) { - function getKeySize(size) { - return (5*size) + "ex"; - } + var children = root.childNodes; + for (var i=0; i 0) - return true; - - return false; - } - - function toggleModifierPressed(modifier) { - if (isModifierActive(modifier)) - setModifierReleased(modifier); - else - setModifierPressed(modifier); - } - - function refreshAllKeysState() { - for (var k=0; k= 0x0000 && charCode <= 0x00FF) - keysym = charCode; - - else if (charCode >= 0x0100 && charCode <= 0x10FFFF) - keysym = 0x01000000 | charCode; - } - - // Required modifiers for this keycap - var reqMod = null; - if (cap.attributes["if"]) - reqMod = cap.attributes["if"].value.split(","); - - - // Modifier represented by this keycap - var modifier = null; - if (cap.attributes["modifier"]) - modifier = cap.attributes["modifier"].value; - - - // Whether this key is sticky (toggles) - // Currently only valid for modifiers. - var sticky = false; - if (cap.attributes["sticky"] && cap.attributes["sticky"].value == "true") - sticky = true; - - this.getDisplayText = function() { - return displayText; - }; - - this.getKeySym = function() { - return keysym; - }; - - this.getRequiredModifiers = function() { - return reqMod; - }; - - this.getModifier = function() { - return modifier; - }; - - this.isSticky = function() { - return sticky; - }; - - } - - var size = null; - if (key.attributes["size"]) - size = parseFloat(key.attributes["size"].value); - - var caps = key.getElementsByTagName("cap"); - var keycaps = new Array(); - for (var i=0; i can contain or - if (child.tagName == "key") { - var key = new Key(child); - keyboardRow.appendChild(key); - allKeys.push(key); - } - else if (child.tagName == "gap") { - var gap = new Gap(child); - keyboardRow.appendChild(gap); - } - else if (child.tagName == "column") { - var col = new Column(child); - keyboardRow.appendChild(col); - } + throw new Exception( + "Unexpected " + child.tagName + + " within " + element.tagName + ); } - return keyboardRow; - } - function Column(col) { - - var keyboardCol = document.createElement("div"); - keyboardCol.className = "col"; - - var align = null; - if (col.attributes["align"]) - align = col.attributes["align"].value; - - var children = col.childNodes; - for (var j=0; j can only contain - if (child.tagName == "row") { - var row = new Row(child); - keyboardCol.appendChild(row); - } - - } - - if (align) - keyboardCol.style.textAlign = align; - - return keyboardCol; - - } - - - // Create keyboard var keyboard = document.createElement("div"); keyboard.className = "keyboard"; - // Retrieve keyboard XML var xmlhttprequest = new XMLHttpRequest(); xmlhttprequest.open("GET", url, false); @@ -472,34 +86,107 @@ Guacamole.OnScreenKeyboard = function(url) { if (xml) { - // Parse document - var root = xml.documentElement; - if (root) { + function parse_row(e) { + + var row = document.createElement("div"); + row.className = "row"; - var children = root.childNodes; - for (var i=0; i can contain or - if (child.tagName == "row") { - keyboard.appendChild(new Row(child)); - } - else if (child.tagName == "column") { - keyboard.appendChild(new Column(child)); } + + }); - } + return row; } + function parse_column(e) { + + var col = document.createElement("div"); + col.className = "col"; + + var align = col.attributes["align"]; + + if (align) + col.style.textAlign = align.value; + + // Columns can only contain rows + parseChildren(e, { + "row": function(e) { + col.appendChild(parse_row(e)); + } + }); + + return col; + + } + + + // Parse document + parseChildren(xml.documentElement, { + + "keyboard": function parse_keyboard(e) { + + // Get attributes + var keyboard_size = e.attributes["size"]; + + parseChildren(e, { + + "row": function(e) { + keyboard.appendChild(parse_row(e)); + }, + + "column": function(e) { + keyboard.appendChild(parse_column(e)); + } + + }); + + } // end keyboard + + }); + } - var keyPressedHandler = null; - var keyReleasedHandler = null; - - keyboard.setKeyPressedHandler = function(kh) { keyPressedHandler = kh; }; - keyboard.setKeyReleasedHandler = function(kh) { keyReleasedHandler = kh; }; - // Do not allow selection or mouse movement to propagate/register. keyboard.onselectstart = keyboard.onmousemove = @@ -510,7 +197,53 @@ Guacamole.OnScreenKeyboard = function(url) { return false; }; - return keyboard; + + this.onkeypressed = null; + this.onkeyreleased = null; + + this.getElement = function() { + return keyboard; + }; }; +Guacamole.OnScreenKeyboard.Key = function() { + + /** + * Width of the key, relative to the size of the keyboard. + */ + this.size = 1; + + /** + * Whether this key is currently pressed. + */ + this.pressed = false; + + /** + * An associative map of all caps by modifier. + */ + this.caps = {}; + +} + +Guacamole.OnScreenKeyboard.Cap = function(text, keycode, modifier) { + + /** + * Modifier represented by this keycap + */ + this.modifier = 0; + + /** + * The text to be displayed within this keycap + */ + this.text = text; + + /** + * The keycode this cap sends when its associated key is pressed/released + */ + this.keycode = keycode; + + // Set modifier if provided + if (modifier) this.modifier = modifier; + +}