Fix remaining issues with MutableDisposable usage
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user