Merge branch 'unstable' into loadable-websocket-support

This commit is contained in:
Michael Jumper
2012-03-07 19:48:28 -08:00
5 changed files with 112 additions and 72 deletions

View File

@@ -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>

View 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();

View File

@@ -56,7 +56,7 @@
<!-- Display -->
<div id="display" class="guac-display guac-loading">
<div id="display">
<!-- Menu trigger -->
<div id="menuControl"></div>
@@ -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);

View 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;
}
}
};

View 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 {