diff --git a/guacamole/pom.xml b/guacamole/pom.xml index 2df9860d7..f039f0c9f 100644 --- a/guacamole/pom.xml +++ b/guacamole/pom.xml @@ -5,7 +5,7 @@ net.sourceforge.guacamole guacamole-default-webapp war - 0.5.0 + 0.6.0 guacamole-default-webapp http://guacamole.sourceforge.net/ @@ -95,7 +95,7 @@ net.sourceforge.guacamole guacamole-common-js - 0.5.0 + 0.6.0 zip runtime diff --git a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/ConfigurationList.java b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/ConfigurationList.java index dcbc446e6..f7585a662 100644 --- a/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/ConfigurationList.java +++ b/guacamole/src/main/java/net/sourceforge/guacamole/net/basic/ConfigurationList.java @@ -53,6 +53,9 @@ public class ConfigurationList extends HttpServlet { return; } + // Do not cache + response.setHeader("Cache-Control", "no-cache"); + // Write XML response.setHeader("Content-Type", "text/xml"); PrintWriter out = response.getWriter(); diff --git a/guacamole/src/main/webapp/client.xhtml b/guacamole/src/main/webapp/client.xhtml index ae01eb611..fb8c20c65 100644 --- a/guacamole/src/main/webapp/client.xhtml +++ b/guacamole/src/main/webapp/client.xhtml @@ -56,7 +56,7 @@ -
+
@@ -98,15 +98,18 @@ // Start connect after control returns from onload (allow browser // to consider the page loaded). - document.body.onload = function() { + window.onload = function() { window.setTimeout(function() { // Instantiate client var guac = new Guacamole.Client( - GuacamoleUI.display, new Guacamole.HTTPTunnel("tunnel") ); + // Add client to UI + guac.getDisplay().className = "software-cursor"; + GuacamoleUI.display.appendChild(guac.getDisplay()); + // Tie UI to client GuacamoleUI.attach(guac); diff --git a/guacamole/src/main/webapp/scripts/interface.js b/guacamole/src/main/webapp/scripts/interface.js index 527fd77da..8ea48a34d 100644 --- a/guacamole/src/main/webapp/scripts/interface.js +++ b/guacamole/src/main/webapp/scripts/interface.js @@ -42,19 +42,69 @@ var GuacamoleUI = { var guacErrorImage = new Image(); guacErrorImage.src = "images/noguacamole-logo-24.png"; + // Function for adding a class to an element + var addClass; + + // Function for removing a class from an element + var removeClass; + + // If Node.classList is supported, implement addClass/removeClass using that + if (Node.classList) { + + addClass = function(element, classname) { + element.classList.add(classname); + }; + + removeClass = function(element, classname) { + element.classList.remove(classname); + }; + + } + + // Otherwise, implement own + else { + + addClass = function(element, classname) { + + // Simply add new class + element.className += " " + classname; + + }; + + removeClass = function(element, classname) { + + // Filter out classes with given name + element.className = element.className.replace(/([^ ]+)[ ]*/g, + function(match, testClassname, spaces, offset, string) { + + // If same class, remove + if (testClassname == classname) + return ""; + + // Otherwise, allow + return match; + + } + ); + + }; + + } + + GuacamoleUI.hideStatus = function() { - document.body.classList.remove("guac-error"); + removeClass(document.body, "guac-error"); GuacamoleUI.containers.state.style.visibility = "hidden"; }; GuacamoleUI.showStatus = function(text) { - document.body.classList.remove("guac-error"); + removeClass(document.body, "guac-error"); GuacamoleUI.containers.state.style.visibility = "visible"; GuacamoleUI.state.textContent = text; }; GuacamoleUI.showError = function(error) { - document.body.classList.add("guac-error"); + addClass(document.body, "guac-error"); GuacamoleUI.state.textContent = error; }; @@ -220,9 +270,6 @@ var GuacamoleUI = { // When mouse hovers over top of screen, start detection of intent to open menu GuacamoleUI.menuControl.addEventListener('mousemove', GuacamoleUI.startMenuOpenDetect, true); - // When mouse enters display, start detection of intent to close menu - GuacamoleUI.display.addEventListener('mouseover', GuacamoleUI.startMenuCloseDetect, true); - var menuShowLongPressTimeout = null; GuacamoleUI.startLongPressDetect = function() { @@ -234,7 +281,7 @@ var GuacamoleUI = { menuShowLongPressTimeout = null; GuacamoleUI.showMenu(); - }, 1000); + }, 800); } }; @@ -247,35 +294,11 @@ var GuacamoleUI = { // Detect long-press at bottom of screen document.body.addEventListener('touchstart', GuacamoleUI.startLongPressDetect, true); - // Show menu if mouse leaves document - document.addEventListener('mouseout', function(e) { - - // Get parent of the element the mouse pointer is leaving - if (!e) e = window.event; - var target = e.relatedTarget || e.toElement; - - // Ensure target is not document nor child of document - var targetParent = target; - while (targetParent != null) { - if (targetParent == document) return; - targetParent = targetParent.parentNode; - } - - // Start detection of intent to open menu - GuacamoleUI.startMenuOpenDetect(); - - }, true); - // Reconnect button GuacamoleUI.buttons.reconnect.onclick = function() { window.location.reload(); }; - GuacamoleUI.display.onclick = function(e) { - e.preventDefault(); - return false; - }; - // On-screen keyboard GuacamoleUI.keyboard = new Guacamole.OnScreenKeyboard("layouts/en-us-qwerty-mobile.xml"); GuacamoleUI.containers.keyboard.appendChild(GuacamoleUI.keyboard.getElement()); @@ -295,17 +318,27 @@ var GuacamoleUI = { // Tie UI events / behavior to a specific Guacamole client GuacamoleUI.attach = function(guac) { + var guac_display = guac.getDisplay(); + + // When mouse enters display, start detection of intent to close menu + guac_display.addEventListener('mouseover', GuacamoleUI.startMenuCloseDetect, true); + + guac_display.onclick = function(e) { + e.preventDefault(); + return false; + }; + // Mouse - var mouse = new Guacamole.Mouse(GuacamoleUI.display); + var mouse = new Guacamole.Mouse(guac_display); mouse.onmousedown = mouse.onmouseup = mouse.onmousemove = function(mouseState) { // Determine mouse position within view - var mouse_view_x = mouseState.x + GuacamoleUI.display.offsetLeft - window.pageXOffset; - var mouse_view_y = mouseState.y + GuacamoleUI.display.offsetTop - window.pageYOffset; + var mouse_view_x = mouseState.x + guac_display.offsetLeft - window.pageXOffset; + var mouse_view_y = mouseState.y + guac_display.offsetTop - window.pageYOffset; // Determine viewport dimensioins - var view_width = GuacamoleUI.viewport.offsetWidth; + var view_width = GuacamoleUI.viewport.offsetWidth; var view_height = GuacamoleUI.viewport.offsetHeight; // Determine scroll amounts based on mouse position relative to document @@ -423,32 +456,6 @@ GuacamoleUI.attach = function(guac) { // Display error message GuacamoleUI.showError(error); - - // Show error by desaturating display - var layers = guac.getLayers(); - for (var i=0; i