diff --git a/addons/addon-canvas/src/CanvasRenderer.ts b/addons/addon-canvas/src/CanvasRenderer.ts index 947213d4..148ae736 100644 --- a/addons/addon-canvas/src/CanvasRenderer.ts +++ b/addons/addon-canvas/src/CanvasRenderer.ts @@ -10,9 +10,9 @@ import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils'; import { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types'; import { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services'; import { EventEmitter, forwardEvent } from 'common/EventEmitter'; -import { Disposable, toDisposable } from 'common/Lifecycle'; +import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle'; import { IBufferService, ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; -import { IDisposable, Terminal } from '@xterm/xterm'; +import { Terminal } from '@xterm/xterm'; import { CursorRenderLayer } from './CursorRenderLayer'; import { LinkRenderLayer } from './LinkRenderLayer'; import { SelectionRenderLayer } from './SelectionRenderLayer'; @@ -22,7 +22,7 @@ import { IRenderLayer } from './Types'; export class CanvasRenderer extends Disposable implements IRenderer { private _renderLayers: IRenderLayer[]; private _devicePixelRatio: number; - private _observerDisposable: IDisposable | undefined; + private _observerDisposable = this.register(new MutableDisposable()); public dimensions: IRenderDimensions; @@ -61,10 +61,9 @@ export class CanvasRenderer extends Disposable implements IRenderer { this._devicePixelRatio = this._coreBrowserService.dpr; this._updateDimensions(); - this._observerDisposable = observeDevicePixelDimensions(this._renderLayers[0].canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h)); + this._observerDisposable.value = 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._observerDisposable.value = observeDevicePixelDimensions(this._renderLayers[0].canvas, w, (w, h) => this._setCanvasDevicePixelDimensions(w, h)); })); this.register(toDisposable(() => { @@ -189,9 +188,4 @@ 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 b5f378c2..f2f2c83e 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 { IDisposable, Terminal } from '@xterm/xterm'; +import { 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,7 +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 _observerDisposable = this.register(new MutableDisposable()); private _model: RenderModel = new RenderModel(); private _workCell: CellData = new CellData(); @@ -124,10 +124,9 @@ export class WebglRenderer extends Disposable implements IRenderer { this._requestRedrawViewport(); })); - this._observerDisposable = observeDevicePixelDimensions(this._canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h)); + this._observerDisposable.value = 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._observerDisposable.value = observeDevicePixelDimensions(this._canvas, w, (w, h) => this._setCanvasDevicePixelDimensions(w, h)); })); this._core.screenElement!.appendChild(this._canvas); @@ -599,11 +598,6 @@ 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 e8d59f7e..c2cb9a05 100644 --- a/src/browser/services/RenderService.ts +++ b/src/browser/services/RenderService.ts @@ -3,7 +3,6 @@ * @license MIT */ -import { IDisposable } from 'common/Types'; import { RenderDebouncer } from 'browser/RenderDebouncer'; import { IRenderDebouncerWithCallback } from 'browser/Types'; import { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types'; @@ -25,7 +24,7 @@ export class RenderService extends Disposable implements IRenderService { private _renderer: MutableDisposable = this.register(new MutableDisposable()); private _renderDebouncer: IRenderDebouncerWithCallback; private _pausedResizeTask = new DebouncedIdleTask(); - private _observerDisposable: IDisposable | undefined; + private _observerDisposable = this.register(new MutableDisposable()); private _isPaused: boolean = false; private _needsFullRefresh: boolean = false; @@ -110,11 +109,10 @@ export class RenderService extends Disposable implements IRenderService { private _registerIntersectionObserver(w: Window & typeof globalThis, screenElement: HTMLElement): void { // Detect whether IntersectionObserver is detected and enable renderer pause // and resume based on terminal visibility if so - this._observerDisposable?.dispose(); if ('IntersectionObserver' in w) { const observer = new w.IntersectionObserver(e => this._handleIntersectionChange(e[e.length - 1]), { threshold: 0 }); observer.observe(screenElement); - this._observerDisposable = toDisposable(() => observer.disconnect()); + this._observerDisposable.value = toDisposable(() => observer.disconnect()); } } @@ -283,9 +281,4 @@ export class RenderService extends Disposable implements IRenderService { public clear(): void { this._renderer.value?.clear(); } - - public override dispose(): void { - this._observerDisposable?.dispose(); - super.dispose(); - } }