From 7ac95fab28ddb62b30d13b15238848fa1b72e9a2 Mon Sep 17 00:00:00 2001 From: jeanp413 Date: Tue, 12 Dec 2023 09:19:53 -0500 Subject: [PATCH] More fixes --- addons/addon-canvas/src/CanvasRenderer.ts | 15 +++++++++++++-- addons/addon-webgl/src/WebglRenderer.ts | 14 ++++++++++++-- src/browser/services/RenderService.ts | 5 +++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/addons/addon-canvas/src/CanvasRenderer.ts b/addons/addon-canvas/src/CanvasRenderer.ts index 40b89546..a8e01b1a 100644 --- a/addons/addon-canvas/src/CanvasRenderer.ts +++ b/addons/addon-canvas/src/CanvasRenderer.ts @@ -12,7 +12,7 @@ import { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeS import { EventEmitter, forwardEvent } from 'common/EventEmitter'; import { Disposable, toDisposable } from 'common/Lifecycle'; import { IBufferService, ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; -import { Terminal } from '@xterm/xterm'; +import { IDisposable, Terminal } from '@xterm/xterm'; import { CursorRenderLayer } from './CursorRenderLayer'; import { LinkRenderLayer } from './LinkRenderLayer'; import { SelectionRenderLayer } from './SelectionRenderLayer'; @@ -22,6 +22,7 @@ import { IRenderLayer } from './Types'; export class CanvasRenderer extends Disposable implements IRenderer { private _renderLayers: IRenderLayer[]; private _devicePixelRatio: number; + private _observerDisposable : IDisposable| undefined; public dimensions: IRenderDimensions; @@ -60,7 +61,12 @@ export class CanvasRenderer extends Disposable implements IRenderer { this._devicePixelRatio = this._coreBrowserService.dpr; this._updateDimensions(); - this.register(observeDevicePixelDimensions(this._renderLayers[0].canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h))); + this._observerDisposable = observeDevicePixelDimensions(this._renderLayers[0].canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h)); + this.register(this._coreBrowserService.onWindowChange(w => { + this._observerDisposable?.dispose(); + this._observerDisposable = observeDevicePixelDimensions(this._renderLayers[0].canvas, w, (w, h) => this._setCanvasDevicePixelDimensions(w, h)); + })); + this.register(toDisposable(() => { for (const l of this._renderLayers) { l.dispose(); @@ -183,4 +189,9 @@ export class CanvasRenderer extends Disposable implements IRenderer { private _requestRedrawViewport(): void { this._onRequestRedraw.fire({ start: 0, end: this._bufferService.rows - 1 }); } + + public override dispose(): void { + this._observerDisposable?.dispose(); + super.dispose(); + } } diff --git a/addons/addon-webgl/src/WebglRenderer.ts b/addons/addon-webgl/src/WebglRenderer.ts index 2bccc9b7..db3c28c8 100644 --- a/addons/addon-webgl/src/WebglRenderer.ts +++ b/addons/addon-webgl/src/WebglRenderer.ts @@ -19,7 +19,7 @@ import { AttributeData } from 'common/buffer/AttributeData'; import { CellData } from 'common/buffer/CellData'; import { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants'; import { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; -import { Terminal } from '@xterm/xterm'; +import { IDisposable, Terminal } from '@xterm/xterm'; import { GlyphRenderer } from './GlyphRenderer'; import { RectangleRenderer } from './RectangleRenderer'; import { COMBINED_CHAR_BIT_MASK, RENDER_MODEL_BG_OFFSET, RENDER_MODEL_EXT_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL, RenderModel } from './RenderModel'; @@ -33,6 +33,7 @@ export class WebglRenderer extends Disposable implements IRenderer { private _charAtlasDisposable = this.register(new MutableDisposable()); private _charAtlas: ITextureAtlas | undefined; private _devicePixelRatio: number; + private _observerDisposable : IDisposable| undefined; private _model: RenderModel = new RenderModel(); private _workCell: CellData = new CellData(); @@ -123,7 +124,11 @@ export class WebglRenderer extends Disposable implements IRenderer { this._requestRedrawViewport(); })); - this.register(observeDevicePixelDimensions(this._canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h))); + this._observerDisposable = observeDevicePixelDimensions(this._canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h)); + this.register(this._coreBrowserService.onWindowChange(w => { + this._observerDisposable?.dispose(); + this._observerDisposable = observeDevicePixelDimensions(this._canvas, w, (w, h) => this._setCanvasDevicePixelDimensions(w, h)); + })); this._core.screenElement!.appendChild(this._canvas); @@ -594,6 +599,11 @@ export class WebglRenderer extends Disposable implements IRenderer { const cursorY = this._terminal.buffer.active.cursorY; this._onRequestRedraw.fire({ start: cursorY, end: cursorY }); } + + public override dispose(): void { + this._observerDisposable?.dispose(); + super.dispose(); + } } // TODO: Share impl with core diff --git a/src/browser/services/RenderService.ts b/src/browser/services/RenderService.ts index f1d25fd2..e8d59f7e 100644 --- a/src/browser/services/RenderService.ts +++ b/src/browser/services/RenderService.ts @@ -283,4 +283,9 @@ export class RenderService extends Disposable implements IRenderService { public clear(): void { this._renderer.value?.clear(); } + + public override dispose(): void { + this._observerDisposable?.dispose(); + super.dispose(); + } }