summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2018-07-26 14:15:59 +0200
committerPierre Ossman <ossman@cendio.se>2018-07-26 14:15:59 +0200
commitab1ace383e24b2963feb23a59fe50d7aba1c2733 (patch)
treeeab1e7410101bc17a737744bf41d289acfbaa4a2
parent862967e08950c2a9c71529420321395737e2734d (diff)
downloadnovnc-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.js7
-rw-r--r--core/rfb.js7
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() {