rescale works like a charm now, at least in Firefox. Needed to use the more standards-compliant way (window.innerWidth / innerHeight) instead of offsetWidth / offsetHeight. More work needed to center the canvas to the middle of the screen.
This commit is contained in:
parent
9623234eb1
commit
d3abfcf34d
|
|
@ -23,7 +23,7 @@ var that = {}, // Public API methods
|
||||||
|
|
||||||
// Predefine function variables (jslint)
|
// Predefine function variables (jslint)
|
||||||
imageDataCreate, imageDataGet, rgbxImageData, cmapImageData,
|
imageDataCreate, imageDataGet, rgbxImageData, cmapImageData,
|
||||||
rgbxImageFill, cmapImageFill, setFillColor, rescale, flush,
|
rgbxImageFill, cmapImageFill, setFillColor, rescale, rescaleAuto, flush,
|
||||||
|
|
||||||
c_width = 0,
|
c_width = 0,
|
||||||
c_height = 0,
|
c_height = 0,
|
||||||
|
|
@ -223,15 +223,53 @@ rescale = function(factor) {
|
||||||
factor = 0.1;
|
factor = 0.1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if (conf.scale === factor) {
|
if (conf.scale === factor) {
|
||||||
//Util.Debug("Display already scaled to '" + factor + "'");
|
//Util.Debug("Display already scaled to '" + factor + "'");
|
||||||
|
UI.message("Display already scaled to '" + factor + "'");
|
||||||
return;
|
return;
|
||||||
} */
|
}
|
||||||
|
|
||||||
conf.scale = factor;
|
|
||||||
x = c.width - c.width * factor;
|
x = c.width - c.width * factor;
|
||||||
y = c.height - c.height * factor;
|
y = c.height - c.height * factor;
|
||||||
c.style[tp] = "scale(" + conf.scale + ") translate(-" + x + "px, -" + y + "px)";
|
c.style[tp] = "scale(" + conf.scale + ") translate(-" + x + "px, -" + y + "px)";
|
||||||
|
UI.message("scale: "+conf.scale+", x: "+x+", y: "+y);
|
||||||
|
};
|
||||||
|
|
||||||
|
rescaleAuto = function() {
|
||||||
|
var c, tp, x, y, xFactor, yFactor, factor,
|
||||||
|
properties = ['transform', 'WebkitTransform', 'MozTransform', null];
|
||||||
|
|
||||||
|
c = conf.target;
|
||||||
|
tp = properties.shift();
|
||||||
|
while (tp) {
|
||||||
|
if (typeof c.style[tp] !== 'undefined') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
tp = properties.shift();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tp === null) {
|
||||||
|
Util.Debug("No scaling support");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
xFactor=viewport.w/fb_width;
|
||||||
|
yFactor=viewport.h/fb_height;
|
||||||
|
UI.message("xFactor: "+xFactor+", yFactor: "+yFactor+", viewport.h: "+viewport.h+", fb_height: "+fb_height);
|
||||||
|
|
||||||
|
if (xFactor > 1.0) {xFactor = 1.0;}
|
||||||
|
else if (xFactor < 0.1) {xFactor = 0.1;}
|
||||||
|
|
||||||
|
if (yFactor > 1.0) {yFactor = 1.0;}
|
||||||
|
else if (yFactor < 0.1) {yFactor = 0.1;}
|
||||||
|
|
||||||
|
/* Rescale screen to whichever factor that is smaller (so we get to see the whole screen). */
|
||||||
|
factor=xFactor<yFactor?xFactor:yFactor;
|
||||||
|
|
||||||
|
c.style.MozTransform = "scale(" + factor + ")";
|
||||||
|
c.style.MozTransformOrigin = "top left";
|
||||||
|
|
||||||
|
UI.rfb.get_mouse().set_scale(factor);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Force canvas redraw (for webkit bug #46319 workaround)
|
// Force canvas redraw (for webkit bug #46319 workaround)
|
||||||
|
|
@ -278,11 +316,11 @@ that.resize = function(width, height) {
|
||||||
rescale(conf.scale);
|
rescale(conf.scale);
|
||||||
};
|
};
|
||||||
|
|
||||||
that.resizeAuto = function() {
|
that.resizeAuto = function(canvas) {
|
||||||
var c=$D('vnc');
|
var c=canvas;
|
||||||
var v = viewport,
|
var v = viewport,
|
||||||
cw = c.offsetWidth,
|
cw=window.innerWidth,
|
||||||
ch = c.offsetHeight;
|
ch=window.innerHeight;
|
||||||
|
|
||||||
UI.message("container: " + cw + "," + ch);
|
UI.message("container: " + cw + "," + ch);
|
||||||
|
|
||||||
|
|
@ -301,12 +339,7 @@ that.resizeAuto = function() {
|
||||||
c.width = v.w;
|
c.width = v.w;
|
||||||
c.height = v.h;
|
c.height = v.h;
|
||||||
|
|
||||||
conf.scale=v.w/fb_width;
|
rescaleAuto();
|
||||||
UI.message("fb_width: "+fb_width+", c.width: "+c.offsetWidth+", viewport width: "+v.w+", scale: "+conf.scale);
|
|
||||||
UI.rfb.get_display().set_scale(conf.scale);
|
|
||||||
UI.rfb.get_mouse().set_scale(conf.scale);
|
|
||||||
rescale(conf.scale);
|
|
||||||
//rescale(1.0);
|
|
||||||
that.refresh();
|
that.refresh();
|
||||||
}
|
}
|
||||||
UI.message("framebuffer: "+fb_width+","+fb_height+"; viewport: "+v.w+","+v.h);
|
UI.message("framebuffer: "+fb_width+","+fb_height+"; viewport: "+v.w+","+v.h);
|
||||||
|
|
@ -337,6 +370,7 @@ that.drawArea = function(x, y, w, h) {
|
||||||
that.refresh = function() {
|
that.refresh = function() {
|
||||||
if (UI.rfb) {UI.rfb.refresh();}
|
if (UI.rfb) {UI.rfb.refresh();}
|
||||||
|
|
||||||
|
UI.message('screen refreshed.');
|
||||||
Util.Debug('screen refreshed.');
|
Util.Debug('screen refreshed.');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -80,10 +80,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do not set width/height for VNC_screen or VNC_canvas or incorrect
|
/* Do not set width/height for VNC_screen or VNC_canvas or incorrect
|
||||||
* scaling will occur. Canvas resizes to remote VNC settings */
|
* scaling will occur. Canvas resizes to client browser size (viewport). */
|
||||||
#VNC_screen {
|
#VNC_screen {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
display: table;
|
/* display: table; */
|
||||||
|
display: block;
|
||||||
}
|
}
|
||||||
#VNC_canvas {
|
#VNC_canvas {
|
||||||
background: #eee;
|
background: #eee;
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ var msg_cnt = 0, iterations,
|
||||||
//fb_width = 800,
|
//fb_width = 800,
|
||||||
//fb_height = 768,
|
//fb_height = 768,
|
||||||
fb_width=1920,
|
fb_width=1920,
|
||||||
fb_height=900,
|
fb_height=1200,
|
||||||
viewport = {'x': 0, 'y': 0, 'w' : 0, 'h' : 0 },
|
viewport = {'x': 0, 'y': 0, 'w' : 0, 'h' : 0 },
|
||||||
cleanRect = {},
|
cleanRect = {},
|
||||||
penDown = false, doMove = false,
|
penDown = false, doMove = false,
|
||||||
|
|
@ -178,10 +178,8 @@ load: function(target) {
|
||||||
UI.initSetting('port', '');
|
UI.initSetting('port', '');
|
||||||
UI.initSetting('password', '');
|
UI.initSetting('password', '');
|
||||||
//TODO: Dynamically detect URI to determine encryption mode.
|
//TODO: Dynamically detect URI to determine encryption mode.
|
||||||
//UI.initSetting('encrypt', false);
|
|
||||||
UI.initSetting('encrypt', false);
|
UI.initSetting('encrypt', false);
|
||||||
//UI.initSetting('true_color', true);
|
UI.initSetting('true_color', true);
|
||||||
UI.initSetting('true_color', false);
|
|
||||||
UI.initSetting('cursor', false);
|
UI.initSetting('cursor', false);
|
||||||
UI.initSetting('shared', true);
|
UI.initSetting('shared', true);
|
||||||
UI.initSetting('connectTimeout', 2);
|
UI.initSetting('connectTimeout', 2);
|
||||||
|
|
@ -190,8 +188,6 @@ load: function(target) {
|
||||||
'onUpdateState': UI.updateState,
|
'onUpdateState': UI.updateState,
|
||||||
'onClipboard': UI.clipReceive});
|
'onClipboard': UI.clipReceive});
|
||||||
|
|
||||||
UI.message('uri: '+UI.rfb.rfb_uri);
|
|
||||||
|
|
||||||
// Unfocus clipboard when over the VNC area
|
// Unfocus clipboard when over the VNC area
|
||||||
$D('VNC_screen').onmousemove = function () {
|
$D('VNC_screen').onmousemove = function () {
|
||||||
var keyboard = UI.rfb.get_keyboard();
|
var keyboard = UI.rfb.get_keyboard();
|
||||||
|
|
@ -207,7 +203,7 @@ load: function(target) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx=UI.rfb.get_display().get_context();
|
ctx=UI.rfb.get_display().get_context();
|
||||||
UI.rfb.get_display().resizeAuto();
|
UI.rfb.get_display().resizeAuto(target);
|
||||||
},
|
},
|
||||||
|
|
||||||
// Read form control compatible setting from cookie
|
// Read form control compatible setting from cookie
|
||||||
|
|
@ -355,7 +351,7 @@ settingsApply: function() {
|
||||||
UI.rfb.get_display().set_scale(UI.getSetting('scale'));
|
UI.rfb.get_display().set_scale(UI.getSetting('scale'));
|
||||||
UI.rfb.get_mouse().set_scale(UI.getSetting('scale'));
|
UI.rfb.get_mouse().set_scale(UI.getSetting('scale'));
|
||||||
//UI.rfb.get_display().resize();
|
//UI.rfb.get_display().resize();
|
||||||
UI.rfb.get_display().resizeAuto();
|
UI.rfb.get_display().resizeAuto($D('vnc'));
|
||||||
}
|
}
|
||||||
WebUtil.selectStylesheet(UI.getSetting('stylesheet'));
|
WebUtil.selectStylesheet(UI.getSetting('stylesheet'));
|
||||||
WebUtil.init_logging(UI.getSetting('logging'));
|
WebUtil.init_logging(UI.getSetting('logging'));
|
||||||
|
|
|
||||||
4
vnc.html
4
vnc.html
|
|
@ -23,13 +23,13 @@
|
||||||
<div id="vnc" class="flex-box">Loading...</div>
|
<div id="vnc" class="flex-box">Loading...</div>
|
||||||
<div>
|
<div>
|
||||||
<br>
|
<br>
|
||||||
Results:<br>
|
Log:<br>
|
||||||
<textarea id="messages" font="9pt" cols=80 rows=8></textarea>
|
<textarea id="messages" font="9pt" cols=80 rows=8></textarea>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
//window.onresize=function() {UI.rfb.get_display().resize(); UI.rfb.get_display().refresh();};
|
//window.onresize=function() {UI.rfb.get_display().resize(); UI.rfb.get_display().refresh();};
|
||||||
window.onresize=function() {UI.rfb.get_display().resizeAuto();};
|
window.onresize=function() {UI.rfb.get_display().resizeAuto($D('vnc'));};
|
||||||
window.onload=function() {UI.load('vnc');};
|
window.onload=function() {UI.load('vnc');};
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue