"use strict";
// Fallback for all uncought errors
- window.addEventListener('error', function(msg, url, line) {
+ window.addEventListener('error', function(event) {
try {
+ var msg = "";
+
+ msg += "<div>";
+ msg += event.message;
+ msg += "</div>";
+
+ msg += " <div class=\"noVNC_location\">";
+ msg += event.filename;
+ msg += ":" + event.lineno + ":" + event.colno;
+ msg += "</div>";
+
+ if ((event.error !== undefined) &&
+ (event.error.stack !== undefined)) {
+ msg += "<div class=\"noVNC_stack\">";
+ msg += event.error.stack;
+ msg += "</div>";
+ }
+
document.getElementById('noVNC_fallback_error')
.classList.add("noVNC_open");
- document.getElementById('noVNC_fallback_errormsg').innerHTML =
- url + ' (' + line + ') <br><br>' + msg;
+ document.getElementById('noVNC_fallback_errormsg').innerHTML = msg;
} catch (exc) {
document.write("noVNC encountered an error.");
}
return false;
});
+ // Set up translations
+ var LINGUAS = ["de", "el", "nl", "sv"];
+ Util.Localisation.setup(LINGUAS);
+ if (Util.Localisation.language !== "en") {
+ WebUtil.load_scripts(
+ {'app': ["locale/" + Util.Localisation.language + ".js"]});
+ }
+
/* [begin skip-as-module] */
// Load supporting scripts
WebUtil.load_scripts(
- {'core': [WebUtil.getLanguageFileLocation(), "base64.js", "websock.js",
- "des.js", "input/keysymdef.js", "input/xtscancodes.js",
- "input/util.js", "input/devices.js", "display.js",
- "inflator.js", "rfb.js", "input/keysym.js"]});
+ {'core': ["base64.js", "websock.js", "des.js", "input/keysymdef.js",
+ "input/xtscancodes.js", "input/util.js", "input/devices.js",
+ "display.js", "inflator.js", "rfb.js", "input/keysym.js"]});
window.onscriptsload = function () { UI.load(); };
/* [end skip-as-module] */
UI.initSettings();
+ // Translate the DOM
+ Util.Localisation.translateDOM();
+
// Adapt the interface for touch screen devices
if (Util.isTouchDevice) {
document.documentElement.classList.add("noVNC_touch");
UI.initSetting('clip', false);
}
+ // Restore control bar position
+ if (WebUtil.readSetting('controlbar_pos') === 'right') {
+ UI.toggleControlbarSide();
+ }
+
// Setup and initialize event handlers
UI.setupWindowEvents();
UI.setupFullscreen();
},
initSettings: function() {
- // Stylesheet selection dropdown
- var sheet = WebUtil.selectStylesheet();
- var sheets = WebUtil.getStylesheets();
var i;
- for (i = 0; i < sheets.length; i += 1) {
- UI.addOption(document.getElementById('noVNC_setting_stylesheet'),sheets[i].title, sheets[i].title);
- }
// Logging selection dropdown
var llevels = ['error', 'warn', 'info', 'debug'];
UI.initSetting('logging', 'warn');
WebUtil.init_logging(UI.getSetting('logging'));
- UI.initSetting('stylesheet', 'default');
- WebUtil.selectStylesheet(null);
- // call twice to get around webkit bug
- WebUtil.selectStylesheet(UI.getSetting('stylesheet'));
-
// if port == 80 (or 443) then it won't be present and should be
// set manually
var port = window.location.port;
UI.initSetting('view_only', false);
UI.initSetting('path', 'websockify');
UI.initSetting('repeaterID', '');
- UI.initSetting('token', '');
},
setupWindowEvents: function() {
'onClipboard': UI.clipboardReceive,
'onBell': UI.bell,
'onFBUComplete': UI.initialResize,
- 'onFBResize': UI.updateViewDrag,
+ 'onFBResize': UI.updateSessionSize,
'onDesktopName': UI.updateDesktopName});
return true;
} catch (exc) {
UI.showStatus(msg);
break;
case 'disconnecting':
+ UI.connected = false;
document.getElementById("noVNC_transition_text").innerHTML = _("Disconnecting...");
document.documentElement.classList.add("noVNC_disconnecting");
break;
case 'disconnected':
- UI.connected = false;
UI.showStatus(_("Disconnected"));
break;
default:
}
},
+ toggleControlbarSide: function () {
+ // Temporarily disable animation to avoid weird movement
+ var bar = document.getElementById('noVNC_control_bar');
+ bar.style.transitionDuration = '0s';
+ bar.addEventListener('transitionend', function () { this.style.transitionDuration = ""; });
+
+ var anchor = document.getElementById('noVNC_control_bar_anchor');
+ if (anchor.classList.contains("noVNC_right")) {
+ WebUtil.writeSetting('controlbar_pos', 'left');
+ anchor.classList.remove("noVNC_right");
+ } else {
+ WebUtil.writeSetting('controlbar_pos', 'right');
+ anchor.classList.add("noVNC_right");
+ }
+
+ // Consider this a movement of the handle
+ UI.controlbarDrag = true;
+ },
+
dragControlbarHandle: function (e) {
if (!UI.controlbarGrabbed) return;
var ptr = Util.getPointerEvent(e);
+ var anchor = document.getElementById('noVNC_control_bar_anchor');
+ if (ptr.clientX < (window.innerWidth * 0.1)) {
+ if (anchor.classList.contains("noVNC_right")) {
+ UI.toggleControlbarSide();
+ }
+ } else if (ptr.clientX > (window.innerWidth * 0.9)) {
+ if (!anchor.classList.contains("noVNC_right")) {
+ UI.toggleControlbarSide();
+ }
+ }
+
if (!UI.controlbarDrag) {
// The goal is to trigger on a certain physical width, the
// devicePixelRatio brings us a bit closer but is not optimal.
e.preventDefault();
e.stopPropagation();
+ UI.keepControlbar();
+ UI.activateControlbar();
},
// Move the handle but don't allow any position outside the bounds
UI.toggleControlbar();
e.preventDefault();
e.stopPropagation();
+ UI.keepControlbar();
+ UI.activateControlbar();
}
UI.controlbarGrabbed = false;
},
UI.controlbarMouseDownOffsetY = ptr.clientY - bounds.top;
e.preventDefault();
e.stopPropagation();
+ UI.keepControlbar();
+ UI.activateControlbar();
},
/* ------^-------
UI.saveSetting('view_only');
UI.saveSetting('path');
UI.saveSetting('repeaterID');
- UI.saveSetting('stylesheet');
UI.saveSetting('logging');
// Settings with immediate (non-connected related) effect
- WebUtil.selectStylesheet(UI.getSetting('stylesheet'));
WebUtil.init_logging(UI.getSetting('logging'));
UI.updateViewClip();
UI.updateViewDrag();
UI.updateSetting('view_only');
UI.updateSetting('path');
UI.updateSetting('repeaterID');
- UI.updateSetting('stylesheet');
UI.updateSetting('logging');
document.getElementById('noVNC_settings')
UI.saveSetting('host');
UI.saveSetting('port');
- UI.saveSetting('token');
//UI.saveSetting('password');
},
var host = document.getElementById('noVNC_setting_host').value;
var port = document.getElementById('noVNC_setting_port').value;
var password = document.getElementById('noVNC_setting_password').value;
- var token = document.getElementById('noVNC_setting_token').value;
var path = document.getElementById('noVNC_setting_path').value;
- //if token is in path then ignore the new token variable
- if (token) {
- path = WebUtil.injectParamIfMissing(path, "token", token);
- }
-
if ((!host) || (!port)) {
var msg = _("Must set host and port");
Util.Error(msg);
}, 100);
if (typeof msg === 'undefined') {
- msg = "Password is required";
+ msg = _("Password is required");
}
Util.Warn(msg);
UI.showStatus(msg, "warning");
// is finished we wait 0.5 seconds before sending the request.
clearTimeout(UI.resizeTimeout);
UI.resizeTimeout = setTimeout(function(){
-
- // Limit the viewport to the size of the browser window
- display.set_maxWidth(screen.w);
- display.set_maxHeight(screen.h);
-
// Request a remote size covering the viewport
if (UI.rfb.requestDesktopSize(screen.w, screen.h)) {
Util.Debug('Requested new desktop size: ' +
if (new_clip && size) {
// When clipping is enabled, the screen is limited to
// the size of the browser window.
- display.set_maxWidth(size.w);
- display.set_maxHeight(size.h);
-
- var screen = document.getElementById('noVNC_screen');
- var canvas = document.getElementById('noVNC_canvas');
-
- // Hide potential scrollbars that can skew the position
- screen.style.overflow = "hidden";
-
- // The x position marks the left margin of the canvas,
- // remove the margin from both sides to keep it centered.
- var new_w = size.w - (2 * Util.getPosition(canvas).x);
-
- screen.style.overflow = "visible";
-
- display.viewportChangeSize(new_w, size.h);
- } else {
- // Disable max dimensions
- display.set_maxWidth(0);
- display.set_maxHeight(0);
- display.viewportChangeSize();
+ display.viewportChangeSize(size.w, size.h);
}
},
}
// Allow clicking on links
- if (event.target.tagName === "a") {
+ if (event.target.tagName === "A") {
return;
}
}
},
+ updateSessionSize: function(rfb, width, height) {
+ UI.updateViewClip();
+ UI.updateViewDrag();
+ },
+
updateDesktopName: function(rfb, name) {
UI.desktopName = name;
// Display the desktop name in the document title