diff options
author | Pierre Ossman <ossman@cendio.se> | 2018-07-26 14:15:59 +0200 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2018-07-26 14:15:59 +0200 |
commit | ab1ace383e24b2963feb23a59fe50d7aba1c2733 (patch) | |
tree | eab1e7410101bc17a737744bf41d289acfbaa4a2 | |
parent | 862967e08950c2a9c71529420321395737e2734d (diff) | |
download | novnc-ab1ace383e24b2963feb23a59fe50d7aba1c2733.tar.gz |
Handle fractional screen sizes
With high DPI systems we can end up with a container with a size that
is not an integer number of CSS pixels. Make sure we can handle those
cases by allowing a fractional size for the output canvas. Framebuffer
size and viewport coordinates are still restricted to integer dimensions
though.
Based on initial patch by Alexander E. Patrakov.
-rw-r--r-- | core/display.js | 7 | ||||
-rw-r--r-- | core/rfb.js | 7 |
2 files changed, 9 insertions, 5 deletions
diff --git a/core/display.js b/core/display.js index 4955ce2..d6db075 100644 --- a/core/display.js +++ b/core/display.js @@ -168,6 +168,9 @@ export default class Display { height = this._fb_height; } + width = Math.floor(width); + height = Math.floor(height); + if (width > this._fb_width) { width = this._fb_width; } @@ -524,8 +527,8 @@ export default class Display { // style width to a number, the canvas is cleared. // However, if you set the style width to a string // ('NNNpx'), the canvas is scaled without clearing. - const width = Math.round(factor * vp.w) + 'px'; - const height = Math.round(factor * vp.h) + 'px'; + const width = factor * vp.w + 'px'; + const height = factor * vp.h + 'px'; if ((this._target.style.width !== width) || (this._target.style.height !== height)) { diff --git a/core/rfb.js b/core/rfb.js index 3433030..f09e241 100644 --- a/core/rfb.js +++ b/core/rfb.js @@ -546,7 +546,8 @@ export default class RFB extends EventTargetMixin { } const size = this._screenSize(); - RFB.messages.setDesktopSize(this._sock, size.w, size.h, + RFB.messages.setDesktopSize(this._sock, + Math.floor(size.w), Math.floor(size.h), this._screen_id, this._screen_flags); Log.Debug('Requested new desktop size: ' + @@ -555,8 +556,8 @@ export default class RFB extends EventTargetMixin { // Gets the the size of the available screen _screenSize() { - return { w: this._screen.offsetWidth, - h: this._screen.offsetHeight }; + let r = this._screen.getBoundingClientRect(); + return { w: r.width, h: r.height }; } _fixScrollbars() { |