Skip to content

Commit 2eaa9b3

Browse files
committed
Fix remaining issues with MutableDisposable usage
1 parent 37b0e40 commit 2eaa9b3

File tree

2 files changed

+26
-29
lines changed

2 files changed

+26
-29
lines changed

addons/xterm-addon-image/src/ImageRenderer.ts

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { toRGBA8888 } from 'sixel/lib/Colors';
77
import { IDisposable } from 'xterm';
88
import { ICellSize, ITerminalExt, IImageSpec, IRenderDimensions, IRenderService } from './Types';
9-
import { MutableDisposable } from 'common/Lifecycle';
9+
import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';
1010

1111

1212
const PLACEHOLDER_LENGTH = 4096;
@@ -18,12 +18,12 @@ const PLACEHOLDER_HEIGHT = 24;
1818
* - add canvas layer to DOM (browser only for now)
1919
* - draw image tiles onRender
2020
*/
21-
export class ImageRenderer implements IDisposable {
21+
export class ImageRenderer extends Disposable implements IDisposable {
2222
public canvas: HTMLCanvasElement | undefined;
2323
private _ctx: CanvasRenderingContext2D | null | undefined;
2424
private _placeholder: HTMLCanvasElement | undefined;
2525
private _placeholderBitmap: ImageBitmap | undefined;
26-
private _optionsRefresh = new MutableDisposable();
26+
private _optionsRefresh = this.register(new MutableDisposable());
2727
private _oldOpen: ((parent: HTMLElement) => void) | undefined;
2828
private _renderService: IRenderService | undefined;
2929
private _oldSetRenderer: ((renderer: any) => void) | undefined;
@@ -69,6 +69,7 @@ export class ImageRenderer implements IDisposable {
6969

7070

7171
constructor(private _terminal: ITerminalExt) {
72+
super();
7273
this._oldOpen = this._terminal._core.open;
7374
this._terminal._core.open = (parent: HTMLElement): void => {
7475
this._oldOpen?.call(this._terminal._core, parent);
@@ -84,25 +85,23 @@ export class ImageRenderer implements IDisposable {
8485
this._renderService?.refreshRows(0, this._terminal.rows);
8586
}
8687
});
87-
}
88-
89-
90-
public dispose(): void {
91-
this.removeLayerFromDom();
92-
if (this._terminal._core && this._oldOpen) {
93-
this._terminal._core.open = this._oldOpen;
94-
this._oldOpen = undefined;
95-
}
96-
if (this._renderService && this._oldSetRenderer) {
97-
this._renderService.setRenderer = this._oldSetRenderer;
98-
this._oldSetRenderer = undefined;
99-
}
100-
this._renderService = undefined;
101-
this.canvas = undefined;
102-
this._ctx = undefined;
103-
this._placeholderBitmap?.close();
104-
this._placeholderBitmap = undefined;
105-
this._placeholder = undefined;
88+
this.register(toDisposable(() => {
89+
this.removeLayerFromDom();
90+
if (this._terminal._core && this._oldOpen) {
91+
this._terminal._core.open = this._oldOpen;
92+
this._oldOpen = undefined;
93+
}
94+
if (this._renderService && this._oldSetRenderer) {
95+
this._renderService.setRenderer = this._oldSetRenderer;
96+
this._oldSetRenderer = undefined;
97+
}
98+
this._renderService = undefined;
99+
this.canvas = undefined;
100+
this._ctx = undefined;
101+
this._placeholderBitmap?.close();
102+
this._placeholderBitmap = undefined;
103+
this._placeholder = undefined;
104+
}));
106105
}
107106

108107
/**

addons/xterm-addon-webgl/src/WebglRenderer.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { CellData } from 'common/buffer/CellData';
2020
import { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';
2121
import { traceCall } from 'common/services/LogService';
2222
import { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';
23-
import { IDisposable, Terminal } from 'xterm';
23+
import { Terminal } from 'xterm';
2424
import { GlyphRenderer } from './GlyphRenderer';
2525
import { RectangleRenderer } from './RectangleRenderer';
2626
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';
3131
export class WebglRenderer extends Disposable implements IRenderer {
3232
private _renderLayers: IRenderLayer[];
3333
private _cursorBlinkStateManager: MutableDisposable<CursorBlinkStateManager> = new MutableDisposable();
34-
private _charAtlasDisposable: IDisposable | undefined;
34+
private _charAtlasDisposable = this.register(new MutableDisposable());
3535
private _charAtlas: ITextureAtlas | undefined;
3636
private _devicePixelRatio: number;
3737

@@ -247,8 +247,7 @@ export class WebglRenderer extends Disposable implements IRenderer {
247247
// Update dimensions and acquire char atlas
248248
this.handleCharSizeChanged();
249249

250-
return [this._rectangleRenderer.value, this._glyphRenderer.value
251-
];
250+
return [this._rectangleRenderer.value, this._glyphRenderer.value];
252251
}
253252

254253
/**
@@ -272,9 +271,8 @@ export class WebglRenderer extends Disposable implements IRenderer {
272271
this._coreBrowserService.dpr
273272
);
274273
if (this._charAtlas !== atlas) {
275-
this._charAtlasDisposable?.dispose();
276274
this._onChangeTextureAtlas.fire(atlas.pages[0].canvas);
277-
this._charAtlasDisposable = getDisposeArrayDisposable([
275+
this._charAtlasDisposable.value = getDisposeArrayDisposable([
278276
forwardEvent(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas),
279277
forwardEvent(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)
280278
]);
@@ -292,7 +290,7 @@ export class WebglRenderer extends Disposable implements IRenderer {
292290
private _clearModel(clearGlyphRenderer: boolean): void {
293291
this._model.clear();
294292
if (clearGlyphRenderer) {
295-
this._glyphRenderer?.clear();
293+
this._glyphRenderer.value?.clear();
296294
}
297295
}
298296

0 commit comments

Comments
 (0)