summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Leeds <baleeds@ncsu.edu>2020-02-07 09:59:58 -0500
committerSamuel Mannehed <samuel@cendio.se>2021-09-01 23:45:55 +0200
commita9c2ff30b636cf5bb0c5f183302646a5b6ec8481 (patch)
tree0abb443ba7fdf60993db6ccaccf7898f730901f1
parentfcb95821b76e105ed4a7ce4c2c19549c8dbbeb44 (diff)
downloadnovnc-a9c2ff30b636cf5bb0c5f183302646a5b6ec8481.tar.gz
Replace window.onresize with ResizeObserver
Fixes an issue where if the screen div resizes for a reason other than window resize, the canvas wouldn't redraw.
-rw-r--r--core/rfb.js14
1 files changed, 8 insertions, 6 deletions
diff --git a/core/rfb.js b/core/rfb.js
index 228aeca..ea3bf58 100644
--- a/core/rfb.js
+++ b/core/rfb.js
@@ -134,6 +134,7 @@ export default class RFB extends EventTargetMixin {
this._flushing = false; // Display flushing state
this._keyboard = null; // Keyboard input handler object
this._gestures = null; // Gesture input handler object
+ this._resizeObserver = null; // Resize observer object
// Timers
this._disconnTimer = null; // disconnection timer
@@ -171,7 +172,7 @@ export default class RFB extends EventTargetMixin {
// Bound event handlers
this._eventHandlers = {
focusCanvas: this._focusCanvas.bind(this),
- windowResize: this._windowResize.bind(this),
+ handleResize: this._handleResize.bind(this),
handleMouse: this._handleMouse.bind(this),
handleWheel: this._handleWheel.bind(this),
handleGesture: this._handleGesture.bind(this),
@@ -239,6 +240,8 @@ export default class RFB extends EventTargetMixin {
this._sock.on('message', this._handleMessage.bind(this));
this._sock.on('error', this._socketError.bind(this));
+ this._resizeObserver = new ResizeObserver(this._eventHandlers.handleResize);
+
// All prepared, kick off the connection
this._updateConnectionState('connecting');
@@ -488,9 +491,8 @@ export default class RFB extends EventTargetMixin {
this._cursor.attach(this._canvas);
this._refreshCursor();
- // Monitor size changes of the screen
- // FIXME: Use ResizeObserver, or hidden overflow
- window.addEventListener('resize', this._eventHandlers.windowResize);
+ // Monitor size changes of the screen element
+ this._resizeObserver.observe(this._screen);
// Always grab focus on some kind of click event
this._canvas.addEventListener("mousedown", this._eventHandlers.focusCanvas);
@@ -531,7 +533,7 @@ export default class RFB extends EventTargetMixin {
this._canvas.removeEventListener('contextmenu', this._eventHandlers.handleMouse);
this._canvas.removeEventListener("mousedown", this._eventHandlers.focusCanvas);
this._canvas.removeEventListener("touchstart", this._eventHandlers.focusCanvas);
- window.removeEventListener('resize', this._eventHandlers.windowResize);
+ this._resizeObserver.disconnect();
this._keyboard.ungrab();
this._gestures.detach();
this._sock.close();
@@ -617,7 +619,7 @@ export default class RFB extends EventTargetMixin {
{ detail: { name: this._fbName } }));
}
- _windowResize(event) {
+ _handleResize() {
// If the window resized then our screen element might have
// as well. Update the viewport dimensions.
window.requestAnimationFrame(() => {