Skip to content

Commit 37b0e40

Browse files
committed
More adoption of MutableDisposable
1 parent 57db72d commit 37b0e40

File tree

3 files changed

+35
-45
lines changed

3 files changed

+35
-45
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +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';
910

1011

1112
const PLACEHOLDER_LENGTH = 4096;
@@ -22,7 +23,7 @@ export class ImageRenderer implements IDisposable {
2223
private _ctx: CanvasRenderingContext2D | null | undefined;
2324
private _placeholder: HTMLCanvasElement | undefined;
2425
private _placeholderBitmap: ImageBitmap | undefined;
25-
private _optionsRefresh: IDisposable | undefined;
26+
private _optionsRefresh = new MutableDisposable();
2627
private _oldOpen: ((parent: HTMLElement) => void) | undefined;
2728
private _renderService: IRenderService | undefined;
2829
private _oldSetRenderer: ((renderer: any) => void) | undefined;
@@ -77,7 +78,7 @@ export class ImageRenderer implements IDisposable {
7778
this._open();
7879
}
7980
// hack to spot fontSize changes
80-
this._optionsRefresh = this._terminal._core.optionsService.onOptionChange(option => {
81+
this._optionsRefresh.value = this._terminal._core.optionsService.onOptionChange(option => {
8182
if (option === 'fontSize') {
8283
this.rescaleCanvas();
8384
this._renderService?.refreshRows(0, this._terminal.rows);
@@ -87,7 +88,6 @@ export class ImageRenderer implements IDisposable {
8788

8889

8990
public dispose(): void {
90-
this._optionsRefresh?.dispose();
9191
this.removeLayerFromDom();
9292
if (this._terminal._core && this._oldOpen) {
9393
this._terminal._core.open = this._oldOpen;

src/browser/services/RenderService.ts

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { IRenderDebouncerWithCallback } from 'browser/Types';
1010
import { IRenderDimensions, IRenderer } from 'browser/renderer/shared/Types';
1111
import { ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';
1212
import { EventEmitter } from 'common/EventEmitter';
13-
import { Disposable } from 'common/Lifecycle';
13+
import { Disposable, MutableDisposable } from 'common/Lifecycle';
1414
import { DebouncedIdleTask } from 'common/TaskQueue';
1515
import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services';
1616

@@ -23,7 +23,7 @@ interface ISelectionState {
2323
export class RenderService extends Disposable implements IRenderService {
2424
public serviceBrand: undefined;
2525

26-
private _renderer: IRenderer | undefined;
26+
private _renderer: MutableDisposable<IRenderer> = this.register(new MutableDisposable());
2727
private _renderDebouncer: IRenderDebouncerWithCallback;
2828
private _screenDprMonitor: ScreenDprMonitor;
2929
private _pausedResizeTask = new DebouncedIdleTask();
@@ -49,7 +49,7 @@ export class RenderService extends Disposable implements IRenderService {
4949
private readonly _onRefreshRequest = this.register(new EventEmitter<{ start: number, end: number }>());
5050
public readonly onRefreshRequest = this._onRefreshRequest.event;
5151

52-
public get dimensions(): IRenderDimensions { return this._renderer!.dimensions; }
52+
public get dimensions(): IRenderDimensions { return this._renderer.value!.dimensions; }
5353

5454
constructor(
5555
private _rowCount: number,
@@ -63,8 +63,6 @@ export class RenderService extends Disposable implements IRenderService {
6363
) {
6464
super();
6565

66-
this.register({ dispose: () => this._renderer?.dispose() });
67-
6866
this._renderDebouncer = new RenderDebouncer(coreBrowserService.window, (start, end) => this._renderRows(start, end));
6967
this.register(this._renderDebouncer);
7068

@@ -73,7 +71,7 @@ export class RenderService extends Disposable implements IRenderService {
7371
this.register(this._screenDprMonitor);
7472

7573
this.register(bufferService.onResize(() => this._fullRefresh()));
76-
this.register(bufferService.buffers.onBufferActivate(() => this._renderer?.clear()));
74+
this.register(bufferService.buffers.onBufferActivate(() => this._renderer.value?.clear()));
7775
this.register(optionsService.onOptionChange(() => this._handleOptionsChanged()));
7876
this.register(this._charSizeService.onCharSizeChange(() => this.handleCharSizeChanged()));
7977

@@ -148,7 +146,7 @@ export class RenderService extends Disposable implements IRenderService {
148146
}
149147

150148
private _renderRows(start: number, end: number): void {
151-
if (!this._renderer) {
149+
if (!this._renderer.value) {
152150
return;
153151
}
154152

@@ -159,11 +157,11 @@ export class RenderService extends Disposable implements IRenderService {
159157
end = Math.min(end, this._rowCount - 1);
160158

161159
// Render
162-
this._renderer.renderRows(start, end);
160+
this._renderer.value.renderRows(start, end);
163161

164162
// Update selection if needed
165163
if (this._needsSelectionRefresh) {
166-
this._renderer.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);
164+
this._renderer.value.handleSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode);
167165
this._needsSelectionRefresh = false;
168166
}
169167

@@ -181,33 +179,31 @@ export class RenderService extends Disposable implements IRenderService {
181179
}
182180

183181
private _handleOptionsChanged(): void {
184-
if (!this._renderer) {
182+
if (!this._renderer.value) {
185183
return;
186184
}
187185
this.refreshRows(0, this._rowCount - 1);
188186
this._fireOnCanvasResize();
189187
}
190188

191189
private _fireOnCanvasResize(): void {
192-
if (!this._renderer) {
190+
if (!this._renderer.value) {
193191
return;
194192
}
195193
// Don't fire the event if the dimensions haven't changed
196-
if (this._renderer.dimensions.css.canvas.width === this._canvasWidth && this._renderer.dimensions.css.canvas.height === this._canvasHeight) {
194+
if (this._renderer.value.dimensions.css.canvas.width === this._canvasWidth && this._renderer.value.dimensions.css.canvas.height === this._canvasHeight) {
197195
return;
198196
}
199-
this._onDimensionsChange.fire(this._renderer.dimensions);
197+
this._onDimensionsChange.fire(this._renderer.value.dimensions);
200198
}
201199

202200
public hasRenderer(): boolean {
203-
return !!this._renderer;
201+
return !!this._renderer.value;
204202
}
205203

206204
public setRenderer(renderer: IRenderer): void {
207-
// TODO: RenderService should be the only one to dispose the renderer
208-
this._renderer?.dispose();
209-
this._renderer = renderer;
210-
this._renderer.onRequestRedraw(e => this.refreshRows(e.start, e.end, true));
205+
this._renderer.value = renderer;
206+
this._renderer.value.onRequestRedraw(e => this.refreshRows(e.start, e.end, true));
211207

212208
// Force a refresh
213209
this._needsSelectionRefresh = true;
@@ -227,10 +223,10 @@ export class RenderService extends Disposable implements IRenderService {
227223
}
228224

229225
public clearTextureAtlas(): void {
230-
if (!this._renderer) {
226+
if (!this._renderer.value) {
231227
return;
232228
}
233-
this._renderer.clearTextureAtlas?.();
229+
this._renderer.value.clearTextureAtlas?.();
234230
this._fullRefresh();
235231
}
236232

@@ -239,50 +235,50 @@ export class RenderService extends Disposable implements IRenderService {
239235
// when devicePixelRatio changes
240236
this._charSizeService.measure();
241237

242-
if (!this._renderer) {
238+
if (!this._renderer.value) {
243239
return;
244240
}
245-
this._renderer.handleDevicePixelRatioChange();
241+
this._renderer.value.handleDevicePixelRatioChange();
246242
this.refreshRows(0, this._rowCount - 1);
247243
}
248244

249245
public handleResize(cols: number, rows: number): void {
250-
if (!this._renderer) {
246+
if (!this._renderer.value) {
251247
return;
252248
}
253249
if (this._isPaused) {
254-
this._pausedResizeTask.set(() => this._renderer!.handleResize(cols, rows));
250+
this._pausedResizeTask.set(() => this._renderer.value!.handleResize(cols, rows));
255251
} else {
256-
this._renderer.handleResize(cols, rows);
252+
this._renderer.value.handleResize(cols, rows);
257253
}
258254
this._fullRefresh();
259255
}
260256

261257
// TODO: Is this useful when we have onResize?
262258
public handleCharSizeChanged(): void {
263-
this._renderer?.handleCharSizeChanged();
259+
this._renderer.value?.handleCharSizeChanged();
264260
}
265261

266262
public handleBlur(): void {
267-
this._renderer?.handleBlur();
263+
this._renderer.value?.handleBlur();
268264
}
269265

270266
public handleFocus(): void {
271-
this._renderer?.handleFocus();
267+
this._renderer.value?.handleFocus();
272268
}
273269

274270
public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {
275271
this._selectionState.start = start;
276272
this._selectionState.end = end;
277273
this._selectionState.columnSelectMode = columnSelectMode;
278-
this._renderer?.handleSelectionChanged(start, end, columnSelectMode);
274+
this._renderer.value?.handleSelectionChanged(start, end, columnSelectMode);
279275
}
280276

281277
public handleCursorMove(): void {
282-
this._renderer?.handleCursorMove();
278+
this._renderer.value?.handleCursorMove();
283279
}
284280

285281
public clear(): void {
286-
this._renderer?.clear();
282+
this._renderer.value?.clear();
287283
}
288284
}

src/common/CoreTerminal.ts

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
* http://linux.die.net/man/7/urxvt
2222
*/
2323

24-
import { Disposable, toDisposable } from 'common/Lifecycle';
24+
import { Disposable, MutableDisposable, toDisposable } from 'common/Lifecycle';
2525
import { IInstantiationService, IOptionsService, IBufferService, ILogService, ICharsetService, ICoreService, ICoreMouseService, IUnicodeService, LogLevelEnum, ITerminalOptions, IOscLinkService } from 'common/services/Services';
2626
import { InstantiationService } from 'common/services/InstantiationService';
2727
import { LogService } from 'common/services/LogService';
@@ -57,7 +57,7 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
5757

5858
protected _inputHandler: InputHandler;
5959
private _writeBuffer: WriteBuffer;
60-
private _windowsWrappingHeuristics: IDisposable | undefined;
60+
private _windowsWrappingHeuristics = this.register(new MutableDisposable());
6161

6262
private readonly _onBinary = this.register(new EventEmitter<string>());
6363
public readonly onBinary = this._onBinary.event;
@@ -144,11 +144,6 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
144144
// Setup WriteBuffer
145145
this._writeBuffer = this.register(new WriteBuffer((data, promiseResult) => this._inputHandler.parse(data, promiseResult)));
146146
this.register(forwardEvent(this._writeBuffer.onWriteParsed, this._onWriteParsed));
147-
148-
this.register(toDisposable(() => {
149-
this._windowsWrappingHeuristics?.dispose();
150-
this._windowsWrappingHeuristics = undefined;
151-
}));
152147
}
153148

154149
public write(data: string | Uint8Array, callback?: () => void): void {
@@ -267,20 +262,19 @@ export abstract class CoreTerminal extends Disposable implements ICoreTerminal {
267262
if (value) {
268263
this._enableWindowsWrappingHeuristics();
269264
} else {
270-
this._windowsWrappingHeuristics?.dispose();
271-
this._windowsWrappingHeuristics = undefined;
265+
this._windowsWrappingHeuristics.clear();
272266
}
273267
}
274268

275269
protected _enableWindowsWrappingHeuristics(): void {
276-
if (!this._windowsWrappingHeuristics) {
270+
if (!this._windowsWrappingHeuristics.value) {
277271
const disposables: IDisposable[] = [];
278272
disposables.push(this.onLineFeed(updateWindowsModeWrappedState.bind(null, this._bufferService)));
279273
disposables.push(this.registerCsiHandler({ final: 'H' }, () => {
280274
updateWindowsModeWrappedState(this._bufferService);
281275
return false;
282276
}));
283-
this._windowsWrappingHeuristics = toDisposable(() => {
277+
this._windowsWrappingHeuristics.value = toDisposable(() => {
284278
for (const d of disposables) {
285279
d.dispose();
286280
}

0 commit comments

Comments
 (0)