Merge branch 'unstable' into loadable-websocket-support
authorMichael Jumper <zhangmaike@users.sourceforge.net>
Thu, 8 Mar 2012 03:48:28 +0000 (19:48 -0800)
committerMichael Jumper <zhangmaike@users.sourceforge.net>
Thu, 8 Mar 2012 03:48:28 +0000 (19:48 -0800)
pom.xml
src/main/java/net/sourceforge/guacamole/net/basic/ConfigurationList.java
src/main/webapp/client.xhtml
src/main/webapp/scripts/interface.js
src/main/webapp/styles/client.css

diff --git a/pom.xml b/pom.xml
index 2df9860..f039f0c 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
     <groupId>net.sourceforge.guacamole</groupId>
     <artifactId>guacamole-default-webapp</artifactId>
     <packaging>war</packaging>
-    <version>0.5.0</version>
+    <version>0.6.0</version>
     <name>guacamole-default-webapp</name>
     <url>http://guacamole.sourceforge.net/</url>
 
@@ -95,7 +95,7 @@
         <dependency>
             <groupId>net.sourceforge.guacamole</groupId>
             <artifactId>guacamole-common-js</artifactId>
-            <version>0.5.0</version>
+            <version>0.6.0</version>
             <type>zip</type>
             <scope>runtime</scope>
         </dependency>
index dcbc446..f7585a6 100644 (file)
@@ -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();
index ae01eb6..fb8c20c 100644 (file)
@@ -56,7 +56,7 @@
 
 
         <!-- Display -->
-        <div id="display" class="guac-display guac-loading">
+        <div id="display">
             
             <!-- Menu trigger -->
             <div id="menuControl"></div>
 
             // 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);
 
index 527fd77..8ea48a3 100644 (file)
@@ -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<layers.length; i++) {
-            layers[i].filter(desaturateFilter);
-        }
-
-        // Filter for desaturation
-        function desaturateFilter(data, width, height) {
-
-            for (var i=0; i<data.length; i+=4) {
-
-                // Get RGB values
-                var r = data[i];
-                var g = data[i+1];
-                var b = data[i+2];
-
-                // Desaturate
-                var v = Math.max(r, g, b) / 2;
-                data[i]   = v;
-                data[i+1] = v;
-                data[i+2] = v;
-
-            }
-
-        }
         
     };
 
index b3693ae..9d0f9d2 100644 (file)
@@ -28,7 +28,7 @@ img {
     border: none;
 }
 
-.guac-hide-cursor {
+.software-cursor {
     cursor: url('../images/mouse/dot.gif'),url('../images/mouse/blank.cur'),default;
 }
 
@@ -114,10 +114,8 @@ div.dialog p {
     background: #D44;
 }
 
-div#display {
+div#display * {
     position: relative;
-    width: 640px;
-    height: 480px;
     margin-left: auto;
     margin-right: auto;
 }
@@ -126,12 +124,41 @@ div#display {
     vertical-align: middle;
 }
 
-#menu button {
+#menu span {
     vertical-align: middle;
 }
 
-#menu span {
+#menu button {
     vertical-align: middle;
+    background: #DC8;
+    border: 1px solid #986;
+    color: black; 
+    padding: 0.25em;
+    padding-right: 1em;
+    padding-left: 1em;
+}
+
+#menu button:hover {
+    background: #FFC;
+    border: 1px solid #DC8;
+}
+
+#menu button:active {
+    padding-top: 0.35em;
+    padding-left: 1.1em;
+
+    padding-bottom: 0.15em;
+    padding-right: 0.9em;
+}
+
+.guac-error #menu button {
+    background: #B33;
+    border: 1px solid #822;
+}
+
+.guac-error #menu button:hover {
+    background: #F44;
+    border: 1px solid #B33;
 }
 
 div#clipboardDiv {