mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-08 14:11:21 +00:00
Merge branch 'unstable' into loadable-websocket-support
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
<groupId>net.sourceforge.guacamole</groupId>
|
<groupId>net.sourceforge.guacamole</groupId>
|
||||||
<artifactId>guacamole-default-webapp</artifactId>
|
<artifactId>guacamole-default-webapp</artifactId>
|
||||||
<packaging>war</packaging>
|
<packaging>war</packaging>
|
||||||
<version>0.5.0</version>
|
<version>0.6.0</version>
|
||||||
<name>guacamole-default-webapp</name>
|
<name>guacamole-default-webapp</name>
|
||||||
<url>http://guacamole.sourceforge.net/</url>
|
<url>http://guacamole.sourceforge.net/</url>
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.sourceforge.guacamole</groupId>
|
<groupId>net.sourceforge.guacamole</groupId>
|
||||||
<artifactId>guacamole-common-js</artifactId>
|
<artifactId>guacamole-common-js</artifactId>
|
||||||
<version>0.5.0</version>
|
<version>0.6.0</version>
|
||||||
<type>zip</type>
|
<type>zip</type>
|
||||||
<scope>runtime</scope>
|
<scope>runtime</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
@@ -53,6 +53,9 @@ public class ConfigurationList extends HttpServlet {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do not cache
|
||||||
|
response.setHeader("Cache-Control", "no-cache");
|
||||||
|
|
||||||
// Write XML
|
// Write XML
|
||||||
response.setHeader("Content-Type", "text/xml");
|
response.setHeader("Content-Type", "text/xml");
|
||||||
PrintWriter out = response.getWriter();
|
PrintWriter out = response.getWriter();
|
||||||
|
@@ -56,7 +56,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<!-- Display -->
|
<!-- Display -->
|
||||||
<div id="display" class="guac-display guac-loading">
|
<div id="display">
|
||||||
|
|
||||||
<!-- Menu trigger -->
|
<!-- Menu trigger -->
|
||||||
<div id="menuControl"></div>
|
<div id="menuControl"></div>
|
||||||
@@ -98,15 +98,18 @@
|
|||||||
|
|
||||||
// Start connect after control returns from onload (allow browser
|
// Start connect after control returns from onload (allow browser
|
||||||
// to consider the page loaded).
|
// to consider the page loaded).
|
||||||
document.body.onload = function() {
|
window.onload = function() {
|
||||||
window.setTimeout(function() {
|
window.setTimeout(function() {
|
||||||
|
|
||||||
// Instantiate client
|
// Instantiate client
|
||||||
var guac = new Guacamole.Client(
|
var guac = new Guacamole.Client(
|
||||||
GuacamoleUI.display,
|
|
||||||
new Guacamole.HTTPTunnel("tunnel")
|
new Guacamole.HTTPTunnel("tunnel")
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Add client to UI
|
||||||
|
guac.getDisplay().className = "software-cursor";
|
||||||
|
GuacamoleUI.display.appendChild(guac.getDisplay());
|
||||||
|
|
||||||
// Tie UI to client
|
// Tie UI to client
|
||||||
GuacamoleUI.attach(guac);
|
GuacamoleUI.attach(guac);
|
||||||
|
|
||||||
|
@@ -42,19 +42,69 @@ var GuacamoleUI = {
|
|||||||
var guacErrorImage = new Image();
|
var guacErrorImage = new Image();
|
||||||
guacErrorImage.src = "images/noguacamole-logo-24.png";
|
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() {
|
GuacamoleUI.hideStatus = function() {
|
||||||
document.body.classList.remove("guac-error");
|
removeClass(document.body, "guac-error");
|
||||||
GuacamoleUI.containers.state.style.visibility = "hidden";
|
GuacamoleUI.containers.state.style.visibility = "hidden";
|
||||||
};
|
};
|
||||||
|
|
||||||
GuacamoleUI.showStatus = function(text) {
|
GuacamoleUI.showStatus = function(text) {
|
||||||
document.body.classList.remove("guac-error");
|
removeClass(document.body, "guac-error");
|
||||||
GuacamoleUI.containers.state.style.visibility = "visible";
|
GuacamoleUI.containers.state.style.visibility = "visible";
|
||||||
GuacamoleUI.state.textContent = text;
|
GuacamoleUI.state.textContent = text;
|
||||||
};
|
};
|
||||||
|
|
||||||
GuacamoleUI.showError = function(error) {
|
GuacamoleUI.showError = function(error) {
|
||||||
document.body.classList.add("guac-error");
|
addClass(document.body, "guac-error");
|
||||||
GuacamoleUI.state.textContent = 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
|
// When mouse hovers over top of screen, start detection of intent to open menu
|
||||||
GuacamoleUI.menuControl.addEventListener('mousemove', GuacamoleUI.startMenuOpenDetect, true);
|
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;
|
var menuShowLongPressTimeout = null;
|
||||||
|
|
||||||
GuacamoleUI.startLongPressDetect = function() {
|
GuacamoleUI.startLongPressDetect = function() {
|
||||||
@@ -234,7 +281,7 @@ var GuacamoleUI = {
|
|||||||
menuShowLongPressTimeout = null;
|
menuShowLongPressTimeout = null;
|
||||||
GuacamoleUI.showMenu();
|
GuacamoleUI.showMenu();
|
||||||
|
|
||||||
}, 1000);
|
}, 800);
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -247,35 +294,11 @@ var GuacamoleUI = {
|
|||||||
// Detect long-press at bottom of screen
|
// Detect long-press at bottom of screen
|
||||||
document.body.addEventListener('touchstart', GuacamoleUI.startLongPressDetect, true);
|
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
|
// Reconnect button
|
||||||
GuacamoleUI.buttons.reconnect.onclick = function() {
|
GuacamoleUI.buttons.reconnect.onclick = function() {
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
};
|
};
|
||||||
|
|
||||||
GuacamoleUI.display.onclick = function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
// On-screen keyboard
|
// On-screen keyboard
|
||||||
GuacamoleUI.keyboard = new Guacamole.OnScreenKeyboard("layouts/en-us-qwerty-mobile.xml");
|
GuacamoleUI.keyboard = new Guacamole.OnScreenKeyboard("layouts/en-us-qwerty-mobile.xml");
|
||||||
GuacamoleUI.containers.keyboard.appendChild(GuacamoleUI.keyboard.getElement());
|
GuacamoleUI.containers.keyboard.appendChild(GuacamoleUI.keyboard.getElement());
|
||||||
@@ -295,17 +318,27 @@ var GuacamoleUI = {
|
|||||||
// Tie UI events / behavior to a specific Guacamole client
|
// Tie UI events / behavior to a specific Guacamole client
|
||||||
GuacamoleUI.attach = function(guac) {
|
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
|
// Mouse
|
||||||
var mouse = new Guacamole.Mouse(GuacamoleUI.display);
|
var mouse = new Guacamole.Mouse(guac_display);
|
||||||
mouse.onmousedown = mouse.onmouseup = mouse.onmousemove =
|
mouse.onmousedown = mouse.onmouseup = mouse.onmousemove =
|
||||||
function(mouseState) {
|
function(mouseState) {
|
||||||
|
|
||||||
// Determine mouse position within view
|
// Determine mouse position within view
|
||||||
var mouse_view_x = mouseState.x + GuacamoleUI.display.offsetLeft - window.pageXOffset;
|
var mouse_view_x = mouseState.x + guac_display.offsetLeft - window.pageXOffset;
|
||||||
var mouse_view_y = mouseState.y + GuacamoleUI.display.offsetTop - window.pageYOffset;
|
var mouse_view_y = mouseState.y + guac_display.offsetTop - window.pageYOffset;
|
||||||
|
|
||||||
// Determine viewport dimensioins
|
// Determine viewport dimensioins
|
||||||
var view_width = GuacamoleUI.viewport.offsetWidth;
|
var view_width = GuacamoleUI.viewport.offsetWidth;
|
||||||
var view_height = GuacamoleUI.viewport.offsetHeight;
|
var view_height = GuacamoleUI.viewport.offsetHeight;
|
||||||
|
|
||||||
// Determine scroll amounts based on mouse position relative to document
|
// Determine scroll amounts based on mouse position relative to document
|
||||||
@@ -423,32 +456,6 @@ GuacamoleUI.attach = function(guac) {
|
|||||||
|
|
||||||
// Display error message
|
// Display error message
|
||||||
GuacamoleUI.showError(error);
|
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;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.guac-hide-cursor {
|
.software-cursor {
|
||||||
cursor: url('../images/mouse/dot.gif'),url('../images/mouse/blank.cur'),default;
|
cursor: url('../images/mouse/dot.gif'),url('../images/mouse/blank.cur'),default;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,10 +114,8 @@ div.dialog p {
|
|||||||
background: #D44;
|
background: #D44;
|
||||||
}
|
}
|
||||||
|
|
||||||
div#display {
|
div#display * {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 640px;
|
|
||||||
height: 480px;
|
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
}
|
}
|
||||||
@@ -126,12 +124,41 @@ div#display {
|
|||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
#menu button {
|
#menu span {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
#menu span {
|
#menu button {
|
||||||
vertical-align: middle;
|
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 {
|
div#clipboardDiv {
|
||||||
|
Reference in New Issue
Block a user