mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 13:17:41 +00:00
Merge branch 'unstable' into loadable-websocket-support
This commit is contained in:
@@ -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>
|
||||
|
@@ -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();
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user