Fix remaining issues with MutableDisposable usage

This commit is contained in:
Daniel Imms
2023-08-27 07:15:51 -07:00
parent 37b0e4018c
commit 2eaa9b3b69
2 changed files with 26 additions and 29 deletions
+21 -22
View File
@@ -6,7 +6,7 @@
import { toRGBA8888 } from 'sixel/lib/Colors'; import { toRGBA8888 } from 'sixel/lib/Colors';
import { IDisposable } from 'xterm'; import { IDisposable } from 'xterm';
import { ICellSize, ITerminalExt, IImageSpec, IRenderDimensions, IRenderService } from './Types'; import { ICellSize, ITerminalExt, IImageSpec, IRenderDimensions, IRenderService } from './Types';
import { MutableDisposable } from 'common/Lifecycle'; import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';
const PLACEHOLDER_LENGTH = 4096; const PLACEHOLDER_LENGTH = 4096;
@@ -18,12 +18,12 @@ const PLACEHOLDER_HEIGHT = 24;
* - add canvas layer to DOM (browser only for now) * - add canvas layer to DOM (browser only for now)
* - draw image tiles onRender * - draw image tiles onRender
*/ */
export class ImageRenderer implements IDisposable { export class ImageRenderer extends Disposable implements IDisposable {
public canvas: HTMLCanvasElement | undefined; public canvas: HTMLCanvasElement | undefined;
private _ctx: CanvasRenderingContext2D | null | undefined; private _ctx: CanvasRenderingContext2D | null | undefined;
private _placeholder: HTMLCanvasElement | undefined; private _placeholder: HTMLCanvasElement | undefined;
private _placeholderBitmap: ImageBitmap | undefined; private _placeholderBitmap: ImageBitmap | undefined;
private _optionsRefresh = new MutableDisposable(); private _optionsRefresh = this.register(new MutableDisposable());
private _oldOpen: ((parent: HTMLElement) => void) | undefined; private _oldOpen: ((parent: HTMLElement) => void) | undefined;
private _renderService: IRenderService | undefined; private _renderService: IRenderService | undefined;
private _oldSetRenderer: ((renderer: any) => void) | undefined; private _oldSetRenderer: ((renderer: any) => void) | undefined;
@@ -69,6 +69,7 @@ export class ImageRenderer implements IDisposable {
constructor(private _terminal: ITerminalExt) { constructor(private _terminal: ITerminalExt) {
super();
this._oldOpen = this._terminal._core.open; this._oldOpen = this._terminal._core.open;
this._terminal._core.open = (parent: HTMLElement): void => { this._terminal._core.open = (parent: HTMLElement): void => {
this._oldOpen?.call(this._terminal._core, parent); this._oldOpen?.call(this._terminal._core, parent);
@@ -84,25 +85,23 @@ export class ImageRenderer implements IDisposable {
this._renderService?.refreshRows(0, this._terminal.rows); this._renderService?.refreshRows(0, this._terminal.rows);
} }
}); });
} this.register(toDisposable(() => {
this.removeLayerFromDom();
if (this._terminal._core && this._oldOpen) {
public dispose(): void { this._terminal._core.open = this._oldOpen;
this.removeLayerFromDom(); this._oldOpen = undefined;
if (this._terminal._core && this._oldOpen) { }
this._terminal._core.open = this._oldOpen; if (this._renderService && this._oldSetRenderer) {
this._oldOpen = undefined; this._renderService.setRenderer = this._oldSetRenderer;
} this._oldSetRenderer = undefined;
if (this._renderService && this._oldSetRenderer) { }
this._renderService.setRenderer = this._oldSetRenderer; this._renderService = undefined;
this._oldSetRenderer = undefined; this.canvas = undefined;
} this._ctx = undefined;
this._renderService = undefined; this._placeholderBitmap?.close();
this.canvas = undefined; this._placeholderBitmap = undefined;
this._ctx = undefined; this._placeholder = undefined;
this._placeholderBitmap?.close(); }));
this._placeholderBitmap = undefined;
this._placeholder = undefined;
} }
/** /**
@@ -20,7 +20,7 @@ import { CellData } from 'common/buffer/CellData';
import { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants'; import { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';
import { traceCall } from 'common/services/LogService'; import { traceCall } from 'common/services/LogService';
import { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services'; import { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';
import { IDisposable, Terminal } from 'xterm'; import { Terminal } from 'xterm';
import { GlyphRenderer } from './GlyphRenderer'; import { GlyphRenderer } from './GlyphRenderer';
import { RectangleRenderer } from './RectangleRenderer'; 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'; 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';
@@ -31,7 +31,7 @@ import { IRenderLayer } from './renderLayer/Types';
export class WebglRenderer extends Disposable implements IRenderer { export class WebglRenderer extends Disposable implements IRenderer {
private _renderLayers: IRenderLayer[]; private _renderLayers: IRenderLayer[];
private _cursorBlinkStateManager: MutableDisposable<CursorBlinkStateManager> = new MutableDisposable(); private _cursorBlinkStateManager: MutableDisposable<CursorBlinkStateManager> = new MutableDisposable();
private _charAtlasDisposable: IDisposable | undefined; private _charAtlasDisposable = this.register(new MutableDisposable());
private _charAtlas: ITextureAtlas | undefined; private _charAtlas: ITextureAtlas | undefined;
private _devicePixelRatio: number; private _devicePixelRatio: number;
@@ -247,8 +247,7 @@ export class WebglRenderer extends Disposable implements IRenderer {
// Update dimensions and acquire char atlas // Update dimensions and acquire char atlas
this.handleCharSizeChanged(); this.handleCharSizeChanged();
return [this._rectangleRenderer.value, this._glyphRenderer.value return [this._rectangleRenderer.value, this._glyphRenderer.value];
];
} }
/** /**
@@ -272,9 +271,8 @@ export class WebglRenderer extends Disposable implements IRenderer {
this._coreBrowserService.dpr this._coreBrowserService.dpr
); );
if (this._charAtlas !== atlas) { if (this._charAtlas !== atlas) {
this._charAtlasDisposable?.dispose();
this._onChangeTextureAtlas.fire(atlas.pages[0].canvas); this._onChangeTextureAtlas.fire(atlas.pages[0].canvas);
this._charAtlasDisposable = getDisposeArrayDisposable([ this._charAtlasDisposable.value = getDisposeArrayDisposable([
forwardEvent(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas), forwardEvent(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas),
forwardEvent(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas) forwardEvent(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)
]); ]);
@@ -292,7 +290,7 @@ export class WebglRenderer extends Disposable implements IRenderer {
private _clearModel(clearGlyphRenderer: boolean): void { private _clearModel(clearGlyphRenderer: boolean): void {
this._model.clear(); this._model.clear();
if (clearGlyphRenderer) { if (clearGlyphRenderer) {
this._glyphRenderer?.clear(); this._glyphRenderer.value?.clear();
} }
} }