fix scaling on static resolutions (#87)

Co-authored-by: matt <matt@kasmweb.com>
This commit is contained in:
Matt McClaskey 2024-01-17 10:45:46 -05:00 committed by GitHub
parent d590bb931a
commit f6c1d8c668
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 13 additions and 15 deletions

View File

@ -60,9 +60,6 @@ export default class Display {
this._targetCtx = this._target.getContext('2d'); this._targetCtx = this._target.getContext('2d');
// the visible canvas viewport (i.e. what actually gets seen)
//this._viewportLoc = { 'x': 0, 'y': 0, 'w': this._target.width, 'h': this._target.height };
Log.Debug("User Agent: " + navigator.userAgent); Log.Debug("User Agent: " + navigator.userAgent);
// performance metrics // performance metrics
@ -123,8 +120,6 @@ export default class Display {
if (!this._isPrimaryDisplay) { if (!this._isPrimaryDisplay) {
this._screens[0].channel = new BroadcastChannel(`screen_${this._screenID}_channel`); this._screens[0].channel = new BroadcastChannel(`screen_${this._screenID}_channel`);
this._screens[0].channel.addEventListener('message', this._handleSecondaryDisplayMessage.bind(this)); this._screens[0].channel.addEventListener('message', this._handleSecondaryDisplayMessage.bind(this));
} else {
//this._animationFrameID = window.requestAnimationFrame( () => { this._pushAsyncFrame(); });
} }
Log.Debug("<< Display.constructor"); Log.Debug("<< Display.constructor");
@ -246,13 +241,11 @@ export default class Display {
//recalculate primary display container size //recalculate primary display container size
this._screens[0].containerHeight = this._target.parentNode.offsetHeight; this._screens[0].containerHeight = this._target.parentNode.offsetHeight;
this._screens[0].containerWidth = this._target.parentNode.offsetWidth; this._screens[0].containerWidth = this._target.parentNode.offsetWidth;
this._screens[0].width = this._target.parentNode.offsetWidth;
this._screens[0].height = this._target.parentNode.offsetHeight;
this._screens[0].pixelRatio = window.devicePixelRatio; this._screens[0].pixelRatio = window.devicePixelRatio;
//this._screens[0].width = this._target.width; this._screens[0].width = this._target.parentNode.offsetWidth;
//this._screens[0].height = this._target.height; this._screens[0].height = this._target.parentNode.offsetHeight;
//calculate server-side resolution of each screen //calculate server-side and client-side resolution of each screen
for (let i=0; i<this._screens.length; i++) { for (let i=0; i<this._screens.length; i++) {
let width = max_width || this._screens[i].containerWidth; let width = max_width || this._screens[i].containerWidth;
let height = max_height || this._screens[i].containerHeight; let height = max_height || this._screens[i].containerHeight;
@ -287,6 +280,11 @@ export default class Display {
Log.Info('Small device with hDPI screen detected, auto scaling at ' + scaleRatio + ' to ' + width + 'x' + height); Log.Info('Small device with hDPI screen detected, auto scaling at ' + scaleRatio + ' to ' + width + 'x' + height);
} }
let clientServerRatioH = this._screens[i].containerHeight / height;
let clientServerRatioW = this._screens[i].containerWidth / width;
this._screens[i].height = Math.floor(height * clientServerRatioH);
this._screens[i].width = Math.floor(width * clientServerRatioW);
this._screens[i].serverWidth = width; this._screens[i].serverWidth = width;
this._screens[i].serverHeight = height; this._screens[i].serverHeight = height;
this._screens[i].scale = scale; this._screens[i].scale = scale;
@ -803,9 +801,9 @@ export default class Display {
const fbAspectRatio = vp.width / vp.height; const fbAspectRatio = vp.width / vp.height;
if (fbAspectRatio >= targetAspectRatio) { if (fbAspectRatio >= targetAspectRatio) {
scaleRatio = containerWidth / vp.width; scaleRatio = containerWidth / vp.serverWidth;
} else { } else {
scaleRatio = containerHeight / vp.height; scaleRatio = containerHeight / vp.serverHeight;
} }
} }

View File

@ -1518,8 +1518,8 @@ export default class RFB extends EventTargetMixin {
if (!this._scaleViewport) { if (!this._scaleViewport) {
this._display.scale = 1.0; this._display.scale = 1.0;
} else { } else {
const size = this._screenSize(false); const size = this._screenSize();
this._display.autoscale(size.screens[0].serverWidth, size.screens[0].serverHeight, size.screens[0].scale); this._display.autoscale(size.screens[0].width, size.screens[0].height, size.screens[0].scale);
} }
this._fixScrollbars(); this._fixScrollbars();
} }