This commit is contained in:
Samuel 2015-02-04 21:07:48 +00:00
commit 1c2803082d
7 changed files with 239 additions and 81 deletions

View File

@ -111,54 +111,12 @@ var Display;
Display.prototype = { Display.prototype = {
// Public methods // Public methods
viewportChange: function (deltaX, deltaY, width, height) { viewportChangePos: function (deltaX, deltaY) {
var vp = this._viewportLoc; var vp = this._viewportLoc;
var cr = this._cleanRect;
var canvas = this._target;
if (!this._viewport) { if (!this._viewport) {
Util.Debug("Setting viewport to full display region");
deltaX = -vp.w; // clamped later of out of bounds deltaX = -vp.w; // clamped later of out of bounds
deltaY = -vp.h; deltaY = -vp.h;
width = this._fb_width;
height = this._fb_height;
}
if (typeof(deltaX) === "undefined") { deltaX = 0; }
if (typeof(deltaY) === "undefined") { deltaY = 0; }
if (typeof(width) === "undefined") { width = vp.w; }
if (typeof(height) === "undefined") { height = vp.h; }
// Size change
if (width > this._fb_width) { width = this._fb_width; }
if (height > this._fb_height) { height = this._fb_height; }
if (vp.w !== width || vp.h !== height) {
// Change width
if (width < vp.w && cr.x2 > vp.x + width - 1) {
cr.x2 = vp.x + width - 1;
}
vp.w = width;
// Change height
if (height < vp.h && cr.y2 > vp.y + height - 1) {
cr.y2 = vp.y + height - 1;
}
vp.h = height;
var saveImg = null;
if (vp.w > 0 && vp.h > 0 && canvas.width > 0 && canvas.height > 0) {
var img_width = canvas.width < vp.w ? canvas.width : vp.w;
var img_height = canvas.height < vp.h ? canvas.height : vp.h;
saveImg = this._drawCtx.getImageData(0, 0, img_width, img_height);
}
canvas.width = vp.w;
canvas.height = vp.h;
if (saveImg) {
this._drawCtx.putImageData(saveImg, 0, 0);
}
} }
var vx2 = vp.x + vp.w - 1; var vx2 = vp.x + vp.w - 1;
@ -191,6 +149,7 @@ var Display;
vy2 += deltaY; vy2 += deltaY;
// Update the clean rectangle // Update the clean rectangle
var cr = this._cleanRect;
if (vp.x > cr.x1) { if (vp.x > cr.x1) {
cr.x1 = vp.x; cr.x1 = vp.x;
} }
@ -228,6 +187,7 @@ var Display;
// Copy the valid part of the viewport to the shifted location // Copy the valid part of the viewport to the shifted location
var saveStyle = this._drawCtx.fillStyle; var saveStyle = this._drawCtx.fillStyle;
var canvas = this._target;
this._drawCtx.fillStyle = "rgb(255,255,255)"; this._drawCtx.fillStyle = "rgb(255,255,255)";
if (deltaX !== 0) { if (deltaX !== 0) {
this._drawCtx.drawImage(canvas, 0, 0, vp.w, vp.h, -deltaX, 0, vp.w, vp.h); this._drawCtx.drawImage(canvas, 0, 0, vp.w, vp.h, -deltaX, 0, vp.w, vp.h);
@ -240,6 +200,58 @@ var Display;
this._drawCtx.fillStyle = saveStyle; this._drawCtx.fillStyle = saveStyle;
}, },
viewportChangeSize: function(width, height) {
if (!this._viewport ||
typeof(width) === "undefined" || typeof(height) === "undefined") {
Util.Debug("Setting viewport to full display region");
width = this._fb_width;
height = this._fb_height;
}
var vp = this._viewportLoc;
if (vp.w !== width || vp.h !== height) {
var cr = this._cleanRect;
if (width < vp.w && cr.x2 > vp.x + width - 1) {
cr.x2 = vp.x + width - 1;
}
if (height < vp.h && cr.y2 > vp.y + height - 1) {
cr.y2 = vp.y + height - 1;
}
if (this.fbuClip()) {
// clipping
vp.w = window.innerWidth;
var cb = document.getElementById('noVNC-control-bar');
var controlbar_h = (cb !== null) ? cb.scrollHeight : 0;
vp.h = window.innerHeight - controlbar_h - 5;
} else {
// scrollbars
vp.w = width;
vp.h = height;
}
var saveImg = null;
var canvas = this._target;
if (vp.w > 0 && vp.h > 0 && canvas.width > 0 && canvas.height > 0) {
var img_width = canvas.width < vp.w ? canvas.width : vp.w;
var img_height = canvas.height < vp.h ? canvas.height : vp.h;
saveImg = this._drawCtx.getImageData(0, 0, img_width, img_height);
}
canvas.width = vp.w;
canvas.height = vp.h;
if (saveImg) {
this._drawCtx.putImageData(saveImg, 0, 0);
}
}
},
// Return a map of clean and dirty areas of the viewport and reset the // Return a map of clean and dirty areas of the viewport and reset the
// tracking of clean and dirty areas // tracking of clean and dirty areas
// //
@ -305,7 +317,7 @@ var Display;
this._rescale(this._scale); this._rescale(this._scale);
this.viewportChange(); this.viewportChangeSize();
}, },
clear: function () { clear: function () {
@ -475,6 +487,14 @@ var Display;
this._target.style.cursor = "none"; this._target.style.cursor = "none";
}, },
fbuClip: function () {
var cb = document.getElementById('noVNC-control-bar');
var controlbar_h = (cb !== null) ? cb.scrollHeight : 0;
return (this._viewport &&
(this._fb_width > window.innerWidth
|| this._fb_height > window.innerHeight - controlbar_h - 5));
},
// Overridden getters/setters // Overridden getters/setters
get_context: function () { get_context: function () {
return this._drawCtx; return this._drawCtx;
@ -485,14 +505,14 @@ var Display;
}, },
set_width: function (w) { set_width: function (w) {
this.resize(w, this._fb_height); this._fb_width = w;
}, },
get_width: function () { get_width: function () {
return this._fb_width; return this._fb_width;
}, },
set_height: function (h) { set_height: function (h) {
this.resize(this._fb_width, h); this._fb_height = h;
}, },
get_height: function () { get_height: function () {
return this._fb_height; return this._fb_height;

View File

@ -53,7 +53,8 @@ var RFB;
//['compress_lo', -255 ], //['compress_lo', -255 ],
['compress_hi', -247 ], ['compress_hi', -247 ],
['last_rect', -224 ], ['last_rect', -224 ],
['xvp', -309 ] ['xvp', -309 ],
['ext_desktop_size', -308 ]
]; ];
this._encHandlers = {}; this._encHandlers = {};
@ -106,6 +107,10 @@ var RFB;
pixels: 0 pixels: 0
}; };
this._supportsSetDesktopSize = false;
this._screen_id = 0;
this._screen_flags = 0;
// Mouse state // Mouse state
this._mouse_buttonMask = 0; this._mouse_buttonMask = 0;
this._mouse_arr = []; this._mouse_arr = [];
@ -305,6 +310,32 @@ var RFB;
this._sock.send(RFB.messages.clientCutText(text)); this._sock.send(RFB.messages.clientCutText(text));
}, },
setDesktopSize: function (width, height) {
if (this._rfb_state !== "normal") { return; }
if (this._supportsSetDesktopSize) {
var arr = [251]; // msg-type
arr.push8(0); // padding
arr.push16(width); // width
arr.push16(height); // height
arr.push8(1); // number-of-screens
arr.push8(0); // padding
// screen array
arr.push32(this._screen_id); // id
arr.push16(0); // x-position
arr.push16(0); // y-position
arr.push16(width); // width
arr.push16(height); // height
arr.push32(this._screen_flags); // flags
this._sock.send(arr);
}
},
// Private methods // Private methods
_connect: function () { _connect: function () {
@ -585,7 +616,7 @@ var RFB;
var deltaY = this._viewportDragPos.y - y; var deltaY = this._viewportDragPos.y - y;
this._viewportDragPos = {'x': x, 'y': y}; this._viewportDragPos = {'x': x, 'y': y};
this._display.viewportChange(deltaX, deltaY); this._display.viewportChangePos(deltaX, deltaY);
// Skip sending mouse events // Skip sending mouse events
return; return;
@ -944,8 +975,8 @@ var RFB;
} }
this._display.set_true_color(this._true_color); this._display.set_true_color(this._true_color);
this._onFBResize(this, this._fb_width, this._fb_height);
this._display.resize(this._fb_width, this._fb_height); this._display.resize(this._fb_width, this._fb_height);
this._onFBResize(this, this._fb_width, this._fb_height);
this._keyboard.grab(); this._keyboard.grab();
this._mouse.grab(); this._mouse.grab();
@ -1839,12 +1870,53 @@ var RFB;
return true; return true;
}, },
ext_desktop_size: function () {
this._FBU.bytes = 1;
if (this._sock.rQwait("ext_desktop_size", this._FBU.bytes)) { return false; }
this._supportsSetDesktopSize = true;
var number_of_screens = this._sock.rQpeek8();
this._FBU.bytes = 4 + (number_of_screens * 16);
if (this._sock.rQwait("ext_desktop_size", this._FBU.bytes)) { return false; }
this._sock.rQshift8(); // number-of-screens
this._sock.rQshift8(); // padding
this._sock.rQshift16(); // padding
for (var i=0; i<number_of_screens; i += 1) {
// Save the id and flags of the first screen
if (i == 0) {
this._screen_id = this._sock.rQshift32(); // id
this._sock.rQshift16(); // x-position
this._sock.rQshift16(); // y-position
this._sock.rQshift16(); // width
this._sock.rQshift16(); // height
this._screen_flags = this._sock.rQshift32(); // flags
} else {
this._sock.rQshiftBytes(16);
}
}
if (this._FBU.x == 0 && this._FBU.y != 0) { return true; }
this._fb_width = this._FBU.width;
this._fb_height = this._FBU.height;
this._display.resize(this._fb_width, this._fb_height);
this._onFBResize(this, this._fb_width, this._fb_height);
this._FBU.bytes = 0;
this._FBU.rects -= 1;
return true;
},
DesktopSize: function () { DesktopSize: function () {
Util.Debug(">> set_desktopsize"); Util.Debug(">> set_desktopsize");
this._fb_width = this._FBU.width; this._fb_width = this._FBU.width;
this._fb_height = this._FBU.height; this._fb_height = this._FBU.height;
this._onFBResize(this, this._fb_width, this._fb_height);
this._display.resize(this._fb_width, this._fb_height); this._display.resize(this._fb_width, this._fb_height);
this._onFBResize(this, this._fb_width, this._fb_height);
this._timing.fbu_rt_start = (new Date()).getTime(); this._timing.fbu_rt_start = (new Date()).getTime();
this._FBU.bytes = 0; this._FBU.bytes = 0;

View File

@ -15,9 +15,22 @@ 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(); };
window.onload = function () { UI.keyboardinputReset(); }; window.onload = function () { UI.keyboardinputReset(); };
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(){
UI.onresize();
}, 500);
};
Util.load_scripts(["webutil.js", "base64.js", "websock.js", "des.js", Util.load_scripts(["webutil.js", "base64.js", "websock.js", "des.js",
"keysymdef.js", "keyboard.js", "input.js", "display.js", "keysymdef.js", "keyboard.js", "input.js", "display.js",
"jsunzip.js", "rfb.js", "keysym.js"]); "jsunzip.js", "rfb.js", "keysym.js"]);
@ -44,6 +57,15 @@ var UI;
WebUtil.initSettings(UI.start, callback); WebUtil.initSettings(UI.start, callback);
}, },
onresize: function (callback) {
var innerWidth = window.innerWidth;
var innerHeight = window.innerHeight;
var controlBarHeight = $D('noVNC-control-bar').scrollHeight;
var borderHeight = 5;
if (innerWidth !== undefined && innerHeight !== undefined)
UI.rfb.setDesktopSize(innerWidth, innerHeight - controlBarHeight - borderHeight);
},
// 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;
@ -99,6 +121,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);
@ -211,7 +235,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 {
@ -649,6 +673,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) {
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";
@ -741,7 +775,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
@ -750,27 +784,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);
@ -780,6 +809,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');

View File

@ -65,13 +65,15 @@ describe('Display/Canvas Helper', function () {
beforeEach(function () { beforeEach(function () {
display = new Display({ target: document.createElement('canvas'), prefer_js: false, viewport: true }); display = new Display({ target: document.createElement('canvas'), prefer_js: false, viewport: true });
display.resize(5, 5); display.resize(5, 5);
display.viewportChange(1, 1, 3, 3); display.viewportChangeSize(3, 3);
display.viewportChangePos(1, 1);
display.getCleanDirtyReset(); display.getCleanDirtyReset();
}); });
it('should take viewport location into consideration when drawing images', function () { it('should take viewport location into consideration when drawing images', function () {
display.resize(4, 4); display.set_width(4);
display.viewportChange(0, 0, 2, 2); display.set_height(4);
display.viewportChangeSize(2, 2);
display.drawImage(make_image_canvas(basic_data), 1, 1); display.drawImage(make_image_canvas(basic_data), 1, 1);
var expected = new Uint8Array(16); var expected = new Uint8Array(16);
@ -82,7 +84,7 @@ describe('Display/Canvas Helper', function () {
}); });
it('should redraw the left side when shifted left', function () { it('should redraw the left side when shifted left', function () {
display.viewportChange(-1, 0, 3, 3); display.viewportChangePos(-1, 0);
var cdr = display.getCleanDirtyReset(); var cdr = display.getCleanDirtyReset();
expect(cdr.cleanBox).to.deep.equal({ x: 1, y: 1, w: 2, h: 3 }); expect(cdr.cleanBox).to.deep.equal({ x: 1, y: 1, w: 2, h: 3 });
expect(cdr.dirtyBoxes).to.have.length(1); expect(cdr.dirtyBoxes).to.have.length(1);
@ -90,7 +92,7 @@ describe('Display/Canvas Helper', function () {
}); });
it('should redraw the right side when shifted right', function () { it('should redraw the right side when shifted right', function () {
display.viewportChange(1, 0, 3, 3); display.viewportChangePos(1, 0);
var cdr = display.getCleanDirtyReset(); var cdr = display.getCleanDirtyReset();
expect(cdr.cleanBox).to.deep.equal({ x: 2, y: 1, w: 2, h: 3 }); expect(cdr.cleanBox).to.deep.equal({ x: 2, y: 1, w: 2, h: 3 });
expect(cdr.dirtyBoxes).to.have.length(1); expect(cdr.dirtyBoxes).to.have.length(1);
@ -98,7 +100,7 @@ describe('Display/Canvas Helper', function () {
}); });
it('should redraw the top part when shifted up', function () { it('should redraw the top part when shifted up', function () {
display.viewportChange(0, -1, 3, 3); display.viewportChangePos(0, -1);
var cdr = display.getCleanDirtyReset(); var cdr = display.getCleanDirtyReset();
expect(cdr.cleanBox).to.deep.equal({ x: 1, y: 1, w: 3, h: 2 }); expect(cdr.cleanBox).to.deep.equal({ x: 1, y: 1, w: 3, h: 2 });
expect(cdr.dirtyBoxes).to.have.length(1); expect(cdr.dirtyBoxes).to.have.length(1);
@ -106,7 +108,7 @@ describe('Display/Canvas Helper', function () {
}); });
it('should redraw the bottom part when shifted down', function () { it('should redraw the bottom part when shifted down', function () {
display.viewportChange(0, 1, 3, 3); display.viewportChangePos(0, 1);
var cdr = display.getCleanDirtyReset(); var cdr = display.getCleanDirtyReset();
expect(cdr.cleanBox).to.deep.equal({ x: 1, y: 2, w: 3, h: 2 }); expect(cdr.cleanBox).to.deep.equal({ x: 1, y: 2, w: 3, h: 2 });
expect(cdr.dirtyBoxes).to.have.length(1); expect(cdr.dirtyBoxes).to.have.length(1);
@ -114,7 +116,7 @@ describe('Display/Canvas Helper', function () {
}); });
it('should reset the entire viewport to being clean after calculating the clean/dirty boxes', function () { it('should reset the entire viewport to being clean after calculating the clean/dirty boxes', function () {
display.viewportChange(0, 1, 3, 3); display.viewportChangePos(0, 1);
var cdr1 = display.getCleanDirtyReset(); var cdr1 = display.getCleanDirtyReset();
var cdr2 = display.getCleanDirtyReset(); var cdr2 = display.getCleanDirtyReset();
expect(cdr1).to.not.deep.equal(cdr2); expect(cdr1).to.not.deep.equal(cdr2);
@ -146,9 +148,9 @@ describe('Display/Canvas Helper', function () {
}); });
it('should update the viewport dimensions', function () { it('should update the viewport dimensions', function () {
sinon.spy(display, 'viewportChange'); sinon.spy(display, 'viewportChangeSize');
display.resize(2, 2); display.resize(2, 2);
expect(display.viewportChange).to.have.been.calledOnce; expect(display.viewportChangeSize).to.have.been.calledOnce;
}); });
}); });

View File

@ -1593,7 +1593,7 @@ describe('Remote Frame Buffer Protocol Client', function() {
it('should not send movement messages when viewport dragging', function () { it('should not send movement messages when viewport dragging', function () {
client._viewportDragging = true; client._viewportDragging = true;
client._display.viewportChange = sinon.spy(); client._display.viewportChangePos = sinon.spy();
client._mouse._onMouseMove(13, 9); client._mouse._onMouseMove(13, 9);
expect(client._sock.send).to.not.have.been.called; expect(client._sock.send).to.not.have.been.called;
}); });
@ -1622,14 +1622,14 @@ describe('Remote Frame Buffer Protocol Client', function() {
client._viewportDrag = true; client._viewportDrag = true;
client._viewportDragging = true; client._viewportDragging = true;
client._viewportDragPos = { x: 13, y: 9 }; client._viewportDragPos = { x: 13, y: 9 };
client._display.viewportChange = sinon.spy(); client._display.viewportChangePos = sinon.spy();
client._mouse._onMouseMove(10, 4); client._mouse._onMouseMove(10, 4);
expect(client._viewportDragging).to.be.true; expect(client._viewportDragging).to.be.true;
expect(client._viewportDragPos).to.deep.equal({ x: 10, y: 4 }); expect(client._viewportDragPos).to.deep.equal({ x: 10, y: 4 });
expect(client._display.viewportChange).to.have.been.calledOnce; expect(client._display.viewportChangePos).to.have.been.calledOnce;
expect(client._display.viewportChange).to.have.been.calledWith(3, 5); expect(client._display.viewportChangePos).to.have.been.calledWith(3, 5);
}); });
}); });

View File

@ -97,7 +97,7 @@
deltaY = lastPos.y - y; // drag frame buffer deltaY = lastPos.y - y; // drag frame buffer
lastPos = {'x': x, 'y': y}; lastPos = {'x': x, 'y': y};
display.viewportChange(deltaX, deltaY); display.viewportChangePos(deltaX, deltaY);
return; return;
} }
@ -166,14 +166,13 @@
var p = $D('canvas').parentNode; var p = $D('canvas').parentNode;
message("doResize1: [" + (p.offsetWidth - padW) + message("doResize1: [" + (p.offsetWidth - padW) +
"," + (p.offsetHeight - padH) + "]"); "," + (p.offsetHeight - padH) + "]");
display.viewportChange(0, 0, display.viewportChangeSize(p.offsetWidth - padW, p.offsetHeight - padH);
p.offsetWidth - padW, p.offsetHeight - padH);
/* /*
var pos, new_w, new_h;pos var pos, new_w, new_h;pos
pos = Util.getPosition($D('canvas').parentNode); pos = Util.getPosition($D('canvas').parentNode);
new_w = window.innerWidth - pos.x; new_w = window.innerWidth - pos.x;
new_h = window.innerHeight - pos.y; new_h = window.innerHeight - pos.y;
display.viewportChange(0, 0, new_w, new_h); display.viewportChangeSize(new_w, new_h);
*/ */
} }
@ -194,7 +193,7 @@
Util.addEvent(window, 'resize', doResize); Util.addEvent(window, 'resize', doResize);
// Shrink viewport for first resize call so that the // Shrink viewport for first resize call so that the
// scrollbars are disabled // scrollbars are disabled
display.viewportChange(0, 0, 10, 10); display.viewportChangeSize(10, 10);
setTimeout(doResize, 1); setTimeout(doResize, 1);
setInterval(dirtyRedraw, 50); setInterval(dirtyRedraw, 50);

View File

@ -80,7 +80,21 @@
"jsunzip.js", "rfb.js", "keysym.js"]); "jsunzip.js", "rfb.js", "keysym.js"]);
var rfb; var rfb;
var resizeTimeout;
function UIresize() {
var innerWidth = window.innerWidth;
var innerHeight = window.innerHeight;
var controlBarHeight = $D('noVNC_status_bar').scrollHeight;
var borderHeight = 5;
if (innerWidth !== undefined && innerHeight !== undefined)
rfb.setDesktopSize(innerWidth, innerHeight - controlBarHeight - borderHeight);
}
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 +152,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');
@ -198,9 +222,10 @@
'local_cursor': WebUtil.getQueryVar('cursor', true), 'local_cursor': WebUtil.getQueryVar('cursor', true),
'shared': WebUtil.getQueryVar('shared', true), 'shared': WebUtil.getQueryVar('shared', true),
'view_only': WebUtil.getQueryVar('view_only', false), 'view_only': WebUtil.getQueryVar('view_only', false),
'onUpdateState': updateState, 'updateState': 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>