Support automatic resize [Part 3/4]: ui.js
* Added a resize request (setDesktopSize) triggered when connecting and by changes to the browser window's size. * Hid the view-drag-hand when the display area is the same or smaller than the remote session size. * Added a setting for the automatic resize feature. * Updated vnc.html and vnc_auto.html to reflect the changes to the UI.
This commit is contained in:
parent
b0ec6509f1
commit
f8b399d7df
|
@ -15,6 +15,8 @@ var UI;
|
||||||
(function () {
|
(function () {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
var resizeTimeout;
|
||||||
|
|
||||||
// Load supporting scripts
|
// Load supporting scripts
|
||||||
window.onscriptsload = function () { UI.load(); };
|
window.onscriptsload = function () { UI.load(); };
|
||||||
Util.load_scripts(["webutil.js", "base64.js", "websock.js", "des.js",
|
Util.load_scripts(["webutil.js", "base64.js", "websock.js", "des.js",
|
||||||
|
@ -43,6 +45,19 @@ var UI;
|
||||||
WebUtil.initSettings(UI.start, callback);
|
WebUtil.initSettings(UI.start, callback);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onresize: function (callback) {
|
||||||
|
if (UI.getSetting('resize')) {
|
||||||
|
var innerW = window.innerWidth;
|
||||||
|
var innerH = window.innerHeight;
|
||||||
|
var controlbarH = $D('noVNC-control-bar').offsetHeight;
|
||||||
|
// For some unknown reason the container is higher than the canvas,
|
||||||
|
// 5px higher in Firefox and 4px higher in Chrome
|
||||||
|
var padding = 5;
|
||||||
|
if (innerW !== undefined && innerH !== undefined)
|
||||||
|
UI.rfb.setDesktopSize(innerW, innerH - controlbarH - padding);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
// Render default UI and initialize settings menu
|
// Render default UI and initialize settings menu
|
||||||
start: function(callback) {
|
start: function(callback) {
|
||||||
UI.isTouchDevice = 'ontouchstart' in document.documentElement;
|
UI.isTouchDevice = 'ontouchstart' in document.documentElement;
|
||||||
|
@ -89,6 +104,7 @@ var UI;
|
||||||
UI.initSetting('encrypt', (window.location.protocol === "https:"));
|
UI.initSetting('encrypt', (window.location.protocol === "https:"));
|
||||||
UI.initSetting('true_color', true);
|
UI.initSetting('true_color', true);
|
||||||
UI.initSetting('cursor', !UI.isTouchDevice);
|
UI.initSetting('cursor', !UI.isTouchDevice);
|
||||||
|
UI.initSetting('resize', false);
|
||||||
UI.initSetting('shared', true);
|
UI.initSetting('shared', true);
|
||||||
UI.initSetting('view_only', false);
|
UI.initSetting('view_only', false);
|
||||||
UI.initSetting('path', 'websockify');
|
UI.initSetting('path', 'websockify');
|
||||||
|
@ -98,6 +114,8 @@ var UI;
|
||||||
'onUpdateState': UI.updateState,
|
'onUpdateState': UI.updateState,
|
||||||
'onXvpInit': UI.updateXvpVisualState,
|
'onXvpInit': UI.updateXvpVisualState,
|
||||||
'onClipboard': UI.clipReceive,
|
'onClipboard': UI.clipReceive,
|
||||||
|
'onFBUComplete': UI.FBUComplete,
|
||||||
|
'onFBResize': UI.updateViewDragButton,
|
||||||
'onDesktopName': UI.updateDocumentTitle});
|
'onDesktopName': UI.updateDocumentTitle});
|
||||||
|
|
||||||
var autoconnect = WebUtil.getQueryVar('autoconnect', false);
|
var autoconnect = WebUtil.getQueryVar('autoconnect', false);
|
||||||
|
@ -118,7 +136,6 @@ var UI;
|
||||||
// Remove the address bar
|
// Remove the address bar
|
||||||
setTimeout(function() { window.scrollTo(0, 1); }, 100);
|
setTimeout(function() { window.scrollTo(0, 1); }, 100);
|
||||||
UI.forceSetting('clip', true);
|
UI.forceSetting('clip', true);
|
||||||
$D('noVNC_clip').disabled = true;
|
|
||||||
} else {
|
} else {
|
||||||
UI.initSetting('clip', false);
|
UI.initSetting('clip', false);
|
||||||
}
|
}
|
||||||
|
@ -136,7 +153,17 @@ var UI;
|
||||||
$D('noVNC_host').focus();
|
$D('noVNC_host').focus();
|
||||||
|
|
||||||
UI.setViewClip();
|
UI.setViewClip();
|
||||||
Util.addEvent(window, 'resize', UI.setViewClip);
|
|
||||||
|
Util.addEvent(window, 'resize', function () {
|
||||||
|
UI.setViewClip();
|
||||||
|
// When the window has been resized, wait until the size remains
|
||||||
|
// the same for 0.5 seconds before sending the request for changing
|
||||||
|
// the resolution of the session
|
||||||
|
clearTimeout(resizeTimeout);
|
||||||
|
resizeTimeout = setTimeout(function(){
|
||||||
|
UI.onresize();
|
||||||
|
}, 500);
|
||||||
|
} );
|
||||||
|
|
||||||
Util.addEvent(window, 'load', UI.keyboardinputReset);
|
Util.addEvent(window, 'load', UI.keyboardinputReset);
|
||||||
|
|
||||||
|
@ -212,7 +239,7 @@ var UI;
|
||||||
getSetting: function(name) {
|
getSetting: function(name) {
|
||||||
var ctrl = $D('noVNC_' + name);
|
var ctrl = $D('noVNC_' + name);
|
||||||
var val = WebUtil.readSetting(name);
|
var val = WebUtil.readSetting(name);
|
||||||
if (val !== null && ctrl.type === 'checkbox') {
|
if (typeof val !== 'undefined' && val !== null && ctrl.type === 'checkbox') {
|
||||||
if (val.toString().toLowerCase() in {'0':1, 'no':1, 'false':1}) {
|
if (val.toString().toLowerCase() in {'0':1, 'no':1, 'false':1}) {
|
||||||
val = false;
|
val = false;
|
||||||
} else {
|
} else {
|
||||||
|
@ -427,6 +454,7 @@ var UI;
|
||||||
$D('noVNC_cursor').disabled = true;
|
$D('noVNC_cursor').disabled = true;
|
||||||
}
|
}
|
||||||
UI.updateSetting('clip');
|
UI.updateSetting('clip');
|
||||||
|
UI.updateSetting('resize');
|
||||||
UI.updateSetting('shared');
|
UI.updateSetting('shared');
|
||||||
UI.updateSetting('view_only');
|
UI.updateSetting('view_only');
|
||||||
UI.updateSetting('path');
|
UI.updateSetting('path');
|
||||||
|
@ -479,6 +507,7 @@ var UI;
|
||||||
UI.saveSetting('cursor');
|
UI.saveSetting('cursor');
|
||||||
}
|
}
|
||||||
UI.saveSetting('clip');
|
UI.saveSetting('clip');
|
||||||
|
UI.saveSetting('resize');
|
||||||
UI.saveSetting('shared');
|
UI.saveSetting('shared');
|
||||||
UI.saveSetting('view_only');
|
UI.saveSetting('view_only');
|
||||||
UI.saveSetting('path');
|
UI.saveSetting('path');
|
||||||
|
@ -595,6 +624,8 @@ var UI;
|
||||||
UI.updateSetting('cursor', !UI.isTouchDevice);
|
UI.updateSetting('cursor', !UI.isTouchDevice);
|
||||||
$D('noVNC_cursor').disabled = true;
|
$D('noVNC_cursor').disabled = true;
|
||||||
}
|
}
|
||||||
|
$D('noVNC_clip').disabled = connected || UI.isTouchDevice;
|
||||||
|
$D('noVNC_resize').disabled = connected;
|
||||||
$D('noVNC_shared').disabled = connected;
|
$D('noVNC_shared').disabled = connected;
|
||||||
$D('noVNC_view_only').disabled = connected;
|
$D('noVNC_view_only').disabled = connected;
|
||||||
$D('noVNC_path').disabled = connected;
|
$D('noVNC_path').disabled = connected;
|
||||||
|
@ -650,6 +681,16 @@ var UI;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// This resize can not be done until we know from the first Frame Buffer Update
|
||||||
|
// if it is supported or not.
|
||||||
|
// The resize is needed to make sure the server desktop size is updated to the
|
||||||
|
// corresponding size of the current local window when reconnecting to an
|
||||||
|
// existing session.
|
||||||
|
FBUComplete: function(rfb, fbu) {
|
||||||
|
UI.onresize();
|
||||||
|
UI.rfb.set_onFBUComplete(function() { });
|
||||||
|
},
|
||||||
|
|
||||||
// Display the desktop name in the document title
|
// Display the desktop name in the document title
|
||||||
updateDocumentTitle: function(rfb, name) {
|
updateDocumentTitle: function(rfb, name) {
|
||||||
document.title = name + " - noVNC";
|
document.title = name + " - noVNC";
|
||||||
|
@ -691,6 +732,9 @@ var UI;
|
||||||
UI.closeSettingsMenu();
|
UI.closeSettingsMenu();
|
||||||
UI.rfb.disconnect();
|
UI.rfb.disconnect();
|
||||||
|
|
||||||
|
// Restore the callback used for initial resize
|
||||||
|
UI.rfb.set_onFBUComplete(UI.FBUComplete);
|
||||||
|
|
||||||
$D('noVNC_logo').style.display = "block";
|
$D('noVNC_logo').style.display = "block";
|
||||||
UI.connSettingsOpen = false;
|
UI.connSettingsOpen = false;
|
||||||
UI.toggleConnectPanel();
|
UI.toggleConnectPanel();
|
||||||
|
@ -742,7 +786,7 @@ var UI;
|
||||||
UI.updateSetting('clip', false);
|
UI.updateSetting('clip', false);
|
||||||
display.set_viewport(false);
|
display.set_viewport(false);
|
||||||
$D('noVNC_canvas').style.position = 'static';
|
$D('noVNC_canvas').style.position = 'static';
|
||||||
display.viewportChange();
|
display.viewportChangeSize();
|
||||||
}
|
}
|
||||||
if (UI.getSetting('clip')) {
|
if (UI.getSetting('clip')) {
|
||||||
// If clipping, update clipping settings
|
// If clipping, update clipping settings
|
||||||
|
@ -751,27 +795,22 @@ var UI;
|
||||||
var new_w = window.innerWidth - pos.x;
|
var new_w = window.innerWidth - pos.x;
|
||||||
var new_h = window.innerHeight - pos.y;
|
var new_h = window.innerHeight - pos.y;
|
||||||
display.set_viewport(true);
|
display.set_viewport(true);
|
||||||
display.viewportChange(0, 0, new_w, new_h);
|
display.viewportChangeSize(new_w, new_h);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
// Toggle/set/unset the viewport drag/move button
|
// Toggle/set/unset the viewport drag/move button
|
||||||
setViewDrag: function(drag) {
|
setViewDrag: function(drag) {
|
||||||
var vmb = $D('noVNC_view_drag_button');
|
|
||||||
if (!UI.rfb) { return; }
|
if (!UI.rfb) { return; }
|
||||||
|
|
||||||
if (UI.rfb_state === 'normal' &&
|
UI.updateViewDragButton();
|
||||||
UI.rfb.get_display().get_viewport()) {
|
|
||||||
vmb.style.display = "inline";
|
|
||||||
} else {
|
|
||||||
vmb.style.display = "none";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof(drag) === "undefined" ||
|
if (typeof(drag) === "undefined" ||
|
||||||
typeof(drag) === "object") {
|
typeof(drag) === "object") {
|
||||||
// If not specified, then toggle
|
// If not specified, then toggle
|
||||||
drag = !UI.rfb.get_viewportDrag();
|
drag = !UI.rfb.get_viewportDrag();
|
||||||
}
|
}
|
||||||
|
var vmb = $D('noVNC_view_drag_button');
|
||||||
if (drag) {
|
if (drag) {
|
||||||
vmb.className = "noVNC_status_button_selected";
|
vmb.className = "noVNC_status_button_selected";
|
||||||
UI.rfb.set_viewportDrag(true);
|
UI.rfb.set_viewportDrag(true);
|
||||||
|
@ -781,6 +820,17 @@ var UI;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
updateViewDragButton: function() {
|
||||||
|
var vmb = $D('noVNC_view_drag_button');
|
||||||
|
if (UI.rfb_state === 'normal' &&
|
||||||
|
UI.rfb.get_display().get_viewport() &&
|
||||||
|
UI.rfb.get_display().fbuClip()) {
|
||||||
|
vmb.style.display = "inline";
|
||||||
|
} else {
|
||||||
|
vmb.style.display = "none";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
// On touch devices, show the OS keyboard
|
// On touch devices, show the OS keyboard
|
||||||
showKeyboard: function() {
|
showKeyboard: function() {
|
||||||
var kbi = $D('keyboardinput');
|
var kbi = $D('keyboardinput');
|
||||||
|
|
1
vnc.html
1
vnc.html
|
@ -157,6 +157,7 @@
|
||||||
<li><input id="noVNC_true_color" type="checkbox" checked> True Color</li>
|
<li><input id="noVNC_true_color" type="checkbox" checked> True Color</li>
|
||||||
<li><input id="noVNC_cursor" type="checkbox"> Local Cursor</li>
|
<li><input id="noVNC_cursor" type="checkbox"> Local Cursor</li>
|
||||||
<li><input id="noVNC_clip" type="checkbox"> Clip to Window</li>
|
<li><input id="noVNC_clip" type="checkbox"> Clip to Window</li>
|
||||||
|
<li><input id="noVNC_resize" type="checkbox"> Resize Remote to Window</li>
|
||||||
<li><input id="noVNC_shared" type="checkbox"> Shared Mode</li>
|
<li><input id="noVNC_shared" type="checkbox"> Shared Mode</li>
|
||||||
<li><input id="noVNC_view_only" type="checkbox"> View Only</li>
|
<li><input id="noVNC_view_only" type="checkbox"> View Only</li>
|
||||||
<li><input id="noVNC_path" type="input" value="websockify"> Path</li>
|
<li><input id="noVNC_path" type="input" value="websockify"> Path</li>
|
||||||
|
|
|
@ -80,7 +80,23 @@
|
||||||
"jsunzip.js", "rfb.js", "keysym.js"]);
|
"jsunzip.js", "rfb.js", "keysym.js"]);
|
||||||
|
|
||||||
var rfb;
|
var rfb;
|
||||||
|
var resizeTimeout;
|
||||||
|
|
||||||
|
|
||||||
|
function UIresize() {
|
||||||
|
if (WebUtil.getQueryVar('resize', false)) {
|
||||||
|
var innerW = window.innerWidth;
|
||||||
|
var innerH = window.innerHeight;
|
||||||
|
var controlbarH = $D('noVNC_status_bar').offsetHeight;
|
||||||
|
var padding = 5;
|
||||||
|
if (innerW !== undefined && innerH !== undefined)
|
||||||
|
rfb.setDesktopSize(innerW, innerH - controlbarH - padding);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function FBUComplete(rfb, fbu) {
|
||||||
|
UIresize();
|
||||||
|
rfb.set_onFBUComplete(function() { });
|
||||||
|
}
|
||||||
function passwordRequired(rfb) {
|
function passwordRequired(rfb) {
|
||||||
var msg;
|
var msg;
|
||||||
msg = '<form onsubmit="return setPassword();"';
|
msg = '<form onsubmit="return setPassword();"';
|
||||||
|
@ -138,6 +154,16 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
window.onresize = function () {
|
||||||
|
// When the window has been resized, wait until the size remains
|
||||||
|
// the same for 0.5 seconds before sending the request for changing
|
||||||
|
// the resolution of the session
|
||||||
|
clearTimeout(resizeTimeout);
|
||||||
|
resizeTimeout = setTimeout(function(){
|
||||||
|
UIresize();
|
||||||
|
}, 500);
|
||||||
|
};
|
||||||
|
|
||||||
function xvpInit(ver) {
|
function xvpInit(ver) {
|
||||||
var xvpbuttons;
|
var xvpbuttons;
|
||||||
xvpbuttons = $D('noVNC_xvp_buttons');
|
xvpbuttons = $D('noVNC_xvp_buttons');
|
||||||
|
@ -200,7 +226,8 @@
|
||||||
'view_only': WebUtil.getQueryVar('view_only', false),
|
'view_only': WebUtil.getQueryVar('view_only', false),
|
||||||
'onUpdateState': updateState,
|
'onUpdateState': updateState,
|
||||||
'onXvpInit': xvpInit,
|
'onXvpInit': xvpInit,
|
||||||
'onPasswordRequired': passwordRequired});
|
'onPasswordRequired': passwordRequired,
|
||||||
|
'onFBUComplete': FBUComplete});
|
||||||
rfb.connect(host, port, password, path);
|
rfb.connect(host, port, password, path);
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Reference in New Issue