From 1134d0d7d4ab86093be74861768a1006161f9f9a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 25 Apr 2020 06:22:08 -0700 Subject: [PATCH 1/6] Refresh model colors after changing theme Fixes #2595 --- addons/xterm-addon-webgl/src/GlyphRenderer.ts | 4 ++-- addons/xterm-addon-webgl/src/RectangleRenderer.ts | 4 ++-- addons/xterm-addon-webgl/src/RenderModel.ts | 1 + addons/xterm-addon-webgl/src/Types.d.ts | 1 + addons/xterm-addon-webgl/src/WebglRenderer.ts | 12 ++++++++---- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/addons/xterm-addon-webgl/src/GlyphRenderer.ts b/addons/xterm-addon-webgl/src/GlyphRenderer.ts index f8eed3ae..8be4c011 100644 --- a/addons/xterm-addon-webgl/src/GlyphRenderer.ts +++ b/addons/xterm-addon-webgl/src/GlyphRenderer.ts @@ -213,14 +213,14 @@ export class GlyphRenderer { // a_cellpos only changes on resize } - public updateSelection(model: IRenderModel, columnSelectMode: boolean): void { + public updateSelection(model: IRenderModel): void { const terminal = this._terminal; this._vertices.selectionAttributes = slice(this._vertices.attributes, 0); const bg = (this._colors.selectionOpaque.rgba >>> 8) | Attributes.CM_RGB; - if (columnSelectMode) { + if (model.selection.columnSelectMode) { const startCol = model.selection.startCol; const width = model.selection.endCol - startCol; const height = model.selection.viewportCappedEndRow - model.selection.viewportCappedStartRow + 1; diff --git a/addons/xterm-addon-webgl/src/RectangleRenderer.ts b/addons/xterm-addon-webgl/src/RectangleRenderer.ts index 2246cddd..2b216f0d 100644 --- a/addons/xterm-addon-webgl/src/RectangleRenderer.ts +++ b/addons/xterm-addon-webgl/src/RectangleRenderer.ts @@ -171,7 +171,7 @@ export class RectangleRenderer { ); } - public updateSelection(model: ISelectionRenderModel, columnSelectMode: boolean): void { + public updateSelection(model: ISelectionRenderModel): void { const terminal = this._terminal; if (!model.hasSelection) { @@ -179,7 +179,7 @@ export class RectangleRenderer { return; } - if (columnSelectMode) { + if (model.columnSelectMode) { const startCol = model.startCol; const width = model.endCol - startCol; const height = model.viewportCappedEndRow - model.viewportCappedStartRow + 1; diff --git a/addons/xterm-addon-webgl/src/RenderModel.ts b/addons/xterm-addon-webgl/src/RenderModel.ts index 2b48047f..194f1778 100644 --- a/addons/xterm-addon-webgl/src/RenderModel.ts +++ b/addons/xterm-addon-webgl/src/RenderModel.ts @@ -22,6 +22,7 @@ export class RenderModel implements IRenderModel { this.lineLengths = new Uint32Array(0); this.selection = { hasSelection: false, + columnSelectMode: false, viewportStartRow: 0, viewportEndRow: 0, viewportCappedStartRow: 0, diff --git a/addons/xterm-addon-webgl/src/Types.d.ts b/addons/xterm-addon-webgl/src/Types.d.ts index f01092ee..d8a27aa7 100644 --- a/addons/xterm-addon-webgl/src/Types.d.ts +++ b/addons/xterm-addon-webgl/src/Types.d.ts @@ -56,6 +56,7 @@ export interface IRenderModel { export interface ISelectionRenderModel { hasSelection: boolean; + columnSelectMode: boolean; viewportStartRow: number; viewportEndRow: number; viewportCappedStartRow: number; diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index 8d52a35e..32632918 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -117,6 +117,9 @@ export class WebglRenderer extends Disposable implements IRenderer { this._refreshCharAtlas(); + this._rectangleRenderer.updateSelection(this._model.selection); + this._glyphRenderer.updateSelection(this._model); + // Force a full refresh this._model.clear(); } @@ -173,10 +176,10 @@ export class WebglRenderer extends Disposable implements IRenderer { public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void { this._renderLayers.forEach(l => l.onSelectionChanged(this._terminal, start, end, columnSelectMode)); - this._updateSelectionModel(start, end); + this._updateSelectionModel(start, end, columnSelectMode); - this._rectangleRenderer.updateSelection(this._model.selection, columnSelectMode); - this._glyphRenderer.updateSelection(this._model, columnSelectMode); + this._rectangleRenderer.updateSelection(this._model.selection); + this._glyphRenderer.updateSelection(this._model); this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 }); } @@ -292,7 +295,7 @@ export class WebglRenderer extends Disposable implements IRenderer { this._rectangleRenderer.updateBackgrounds(this._model); } - private _updateSelectionModel(start: [number, number], end: [number, number]): void { + private _updateSelectionModel(start: [number, number], end: [number, number], columnSelectMode: boolean): void { const terminal = this._terminal; // Selection does not exist @@ -314,6 +317,7 @@ export class WebglRenderer extends Disposable implements IRenderer { } this._model.selection.hasSelection = true; + this._model.selection.columnSelectMode = columnSelectMode; this._model.selection.viewportStartRow = viewportStartRow; this._model.selection.viewportEndRow = viewportEndRow; this._model.selection.viewportCappedStartRow = viewportCappedStartRow; From 22aaf0471a0911ec3c0158636dc1bdb199a1430f Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 25 Apr 2020 06:41:25 -0700 Subject: [PATCH 2/6] Invalidate all links above when the terminal scrolls See microsoft/vscode#95556 --- src/browser/Linkifier2.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/browser/Linkifier2.ts b/src/browser/Linkifier2.ts index a21f7621..bcdbffe6 100644 --- a/src/browser/Linkifier2.ts +++ b/src/browser/Linkifier2.ts @@ -237,7 +237,10 @@ export class Linkifier2 implements ILinkifier2 { // Add listener for rerendering if (this._renderService) { this._linkCacheDisposables.push(this._renderService.onRenderedBufferChange(e => { - this._clearCurrentLink(e.start + 1 + this._bufferService.buffer.ydisp, e.end + 1 + this._bufferService.buffer.ydisp); + // When start is 0 a scroll most likely occurred, make sure links above the fold also get + // cleared. + const start = e.start === 0 ? 0 : e.start + 1 + this._bufferService.buffer.ydisp; + this._clearCurrentLink(start, e.end + 1 + this._bufferService.buffer.ydisp); })); } } From 3a5def98e574909ad34385c0bcaa3112a6807e0e Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 25 Apr 2020 06:56:00 -0700 Subject: [PATCH 3/6] Correct selection types being optional --- addons/xterm-addon-webgl/src/WebglRenderer.ts | 4 ++-- addons/xterm-addon-webgl/src/renderLayer/BaseRenderLayer.ts | 2 +- addons/xterm-addon-webgl/src/renderLayer/Types.ts | 2 +- src/browser/renderer/BaseRenderLayer.ts | 2 +- src/browser/renderer/Renderer.ts | 2 +- src/browser/renderer/SelectionRenderLayer.ts | 4 ++-- src/browser/renderer/Types.d.ts | 4 ++-- src/browser/renderer/dom/DomRenderer.ts | 2 +- src/browser/services/RenderService.ts | 2 +- src/browser/services/Services.ts | 2 +- 10 files changed, 13 insertions(+), 13 deletions(-) diff --git a/addons/xterm-addon-webgl/src/WebglRenderer.ts b/addons/xterm-addon-webgl/src/WebglRenderer.ts index 8d52a35e..4ea4589a 100644 --- a/addons/xterm-addon-webgl/src/WebglRenderer.ts +++ b/addons/xterm-addon-webgl/src/WebglRenderer.ts @@ -170,7 +170,7 @@ export class WebglRenderer extends Disposable implements IRenderer { this._renderLayers.forEach(l => l.onFocus(this._terminal)); } - public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void { + public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void { this._renderLayers.forEach(l => l.onSelectionChanged(this._terminal, start, end, columnSelectMode)); this._updateSelectionModel(start, end); @@ -292,7 +292,7 @@ export class WebglRenderer extends Disposable implements IRenderer { this._rectangleRenderer.updateBackgrounds(this._model); } - private _updateSelectionModel(start: [number, number], end: [number, number]): void { + private _updateSelectionModel(start: [number, number] | undefined, end: [number, number] | undefined): void { const terminal = this._terminal; // Selection does not exist diff --git a/addons/xterm-addon-webgl/src/renderLayer/BaseRenderLayer.ts b/addons/xterm-addon-webgl/src/renderLayer/BaseRenderLayer.ts index 93f84492..da3b4d41 100644 --- a/addons/xterm-addon-webgl/src/renderLayer/BaseRenderLayer.ts +++ b/addons/xterm-addon-webgl/src/renderLayer/BaseRenderLayer.ts @@ -58,7 +58,7 @@ export abstract class BaseRenderLayer implements IRenderLayer { public onFocus(terminal: Terminal): void {} public onCursorMove(terminal: Terminal): void {} public onGridChanged(terminal: Terminal, startRow: number, endRow: number): void {} - public onSelectionChanged(terminal: Terminal, start: [number, number], end: [number, number], columnSelectMode: boolean = false): void {} + public onSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {} public setColors(terminal: Terminal, colorSet: IColorSet): void { this._refreshCharAtlas(terminal, colorSet); diff --git a/addons/xterm-addon-webgl/src/renderLayer/Types.ts b/addons/xterm-addon-webgl/src/renderLayer/Types.ts index 148ea469..70acff34 100644 --- a/addons/xterm-addon-webgl/src/renderLayer/Types.ts +++ b/addons/xterm-addon-webgl/src/renderLayer/Types.ts @@ -42,7 +42,7 @@ export interface IRenderLayer extends IDisposable { /** * Calls when the selection changes. */ - onSelectionChanged(terminal: Terminal, start: [number, number], end: [number, number], columnSelectMode: boolean): void; + onSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void; /** * Registers a handler to join characters to render as a group diff --git a/src/browser/renderer/BaseRenderLayer.ts b/src/browser/renderer/BaseRenderLayer.ts index 595aa1a5..837f18e4 100644 --- a/src/browser/renderer/BaseRenderLayer.ts +++ b/src/browser/renderer/BaseRenderLayer.ts @@ -77,7 +77,7 @@ export abstract class BaseRenderLayer implements IRenderLayer { public onFocus(): void {} public onCursorMove(): void {} public onGridChanged(startRow: number, endRow: number): void {} - public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean = false): void {} + public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {} public setColors(colorSet: IColorSet): void { this._refreshCharAtlas(colorSet); diff --git a/src/browser/renderer/Renderer.ts b/src/browser/renderer/Renderer.ts index 0856553f..5142e4cb 100644 --- a/src/browser/renderer/Renderer.ts +++ b/src/browser/renderer/Renderer.ts @@ -119,7 +119,7 @@ export class Renderer extends Disposable implements IRenderer { this._runOperation(l => l.onFocus()); } - public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean = false): void { + public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void { this._runOperation(l => l.onSelectionChanged(start, end, columnSelectMode)); } diff --git a/src/browser/renderer/SelectionRenderLayer.ts b/src/browser/renderer/SelectionRenderLayer.ts index 257944fc..5689ce93 100644 --- a/src/browser/renderer/SelectionRenderLayer.ts +++ b/src/browser/renderer/SelectionRenderLayer.ts @@ -52,7 +52,7 @@ export class SelectionRenderLayer extends BaseRenderLayer { } } - public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void { + public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void { // Selection has not changed if (!this._didStateChange(start, end, columnSelectMode, this._bufferService.buffer.ydisp)) { return; @@ -110,7 +110,7 @@ export class SelectionRenderLayer extends BaseRenderLayer { this._state.ydisp = this._bufferService.buffer.ydisp; } - private _didStateChange(start: [number, number], end: [number, number], columnSelectMode: boolean, ydisp: number): boolean { + private _didStateChange(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean, ydisp: number): boolean { return !this._areCoordinatesEqual(start, this._state.start) || !this._areCoordinatesEqual(end, this._state.end) || columnSelectMode !== this._state.columnSelectMode || diff --git a/src/browser/renderer/Types.d.ts b/src/browser/renderer/Types.d.ts index 02c62ab2..cab14b88 100644 --- a/src/browser/renderer/Types.d.ts +++ b/src/browser/renderer/Types.d.ts @@ -49,7 +49,7 @@ export interface IRenderer extends IDisposable { onCharSizeChanged(): void; onBlur(): void; onFocus(): void; - onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void; + onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void; onCursorMove(): void; onOptionsChanged(): void; clear(): void; @@ -104,7 +104,7 @@ export interface IRenderLayer extends IDisposable { /** * Calls when the selection changes. */ - onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void; + onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void; /** * Registers a handler to join characters to render as a group diff --git a/src/browser/renderer/dom/DomRenderer.ts b/src/browser/renderer/dom/DomRenderer.ts index 1303ec1b..ff955140 100644 --- a/src/browser/renderer/dom/DomRenderer.ts +++ b/src/browser/renderer/dom/DomRenderer.ts @@ -273,7 +273,7 @@ export class DomRenderer extends Disposable implements IRenderer { this._rowContainer.classList.add(FOCUS_CLASS); } - public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void { + public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void { // Remove all selections while (this._selectionContainer.children.length) { this._selectionContainer.removeChild(this._selectionContainer.children[0]); diff --git a/src/browser/services/RenderService.ts b/src/browser/services/RenderService.ts index d7ff5814..109db2e6 100644 --- a/src/browser/services/RenderService.ts +++ b/src/browser/services/RenderService.ts @@ -163,7 +163,7 @@ export class RenderService extends Disposable implements IRenderService { this._renderer.onFocus(); } - public onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void { + public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void { this._renderer.onSelectionChanged(start, end, columnSelectMode); } diff --git a/src/browser/services/Services.ts b/src/browser/services/Services.ts index 3754e6fe..7a559dab 100644 --- a/src/browser/services/Services.ts +++ b/src/browser/services/Services.ts @@ -63,7 +63,7 @@ export interface IRenderService extends IDisposable { onCharSizeChanged(): void; onBlur(): void; onFocus(): void; - onSelectionChanged(start: [number, number], end: [number, number], columnSelectMode: boolean): void; + onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void; onCursorMove(): void; clear(): void; registerCharacterJoiner(handler: CharacterJoinerHandler): number; From c185529ad5e1fe6cade88ca98159d882c992f97d Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 25 Apr 2020 07:11:43 -0700 Subject: [PATCH 4/6] Make sure selection gets redrawn when switching renderers Fixes #2555 --- src/browser/RenderDebouncer.ts | 12 ++++++------ src/browser/services/RenderService.ts | 28 ++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/browser/RenderDebouncer.ts b/src/browser/RenderDebouncer.ts index 27c866df..814afcef 100644 --- a/src/browser/RenderDebouncer.ts +++ b/src/browser/RenderDebouncer.ts @@ -49,15 +49,15 @@ export class RenderDebouncer implements IDisposable { } // Clamp values - this._rowStart = Math.max(this._rowStart, 0); - this._rowEnd = Math.min(this._rowEnd, this._rowCount - 1); + const start = Math.max(this._rowStart, 0); + const end = Math.min(this._rowEnd, this._rowCount - 1); - // Run render callback - this._renderCallback(this._rowStart, this._rowEnd); - - // Reset debouncer + // Reset debouncer (this happens before render callback as the render could trigger it again) this._rowStart = undefined; this._rowEnd = undefined; this._animationFrame = undefined; + + // Run render callback + this._renderCallback(start, end); } } diff --git a/src/browser/services/RenderService.ts b/src/browser/services/RenderService.ts index 109db2e6..7c8a13cc 100644 --- a/src/browser/services/RenderService.ts +++ b/src/browser/services/RenderService.ts @@ -13,6 +13,12 @@ import { IColorSet } from 'browser/Types'; import { IOptionsService } from 'common/services/Services'; import { ICharSizeService, IRenderService } from 'browser/services/Services'; +interface ISelectionState { + start: [number, number] | undefined; + end: [number, number] | undefined; + columnSelectMode: boolean; +} + export class RenderService extends Disposable implements IRenderService { public serviceBrand: any; @@ -22,8 +28,14 @@ export class RenderService extends Disposable implements IRenderService { private _isPaused: boolean = false; private _needsFullRefresh: boolean = false; private _isNextRenderRedrawOnly: boolean = true; + private _needsSelectionRefresh: boolean = false; private _canvasWidth: number = 0; private _canvasHeight: number = 0; + private _selectionState: ISelectionState = { + start: undefined, + end: undefined, + columnSelectMode: false + }; private _onDimensionsChange = new EventEmitter(); public get onDimensionsChange(): IEvent { return this._onDimensionsChange.event; } @@ -89,6 +101,14 @@ export class RenderService extends Disposable implements IRenderService { private _renderRows(start: number, end: number): void { this._renderer.renderRows(start, end); + + // Update selection if needed + if (this._needsSelectionRefresh) { + this._renderer.onSelectionChanged(this._selectionState.start, this._selectionState.end, this._selectionState.columnSelectMode); + this._needsSelectionRefresh = false; + } + + // Fire render event only if it was not a redraw if (!this._isNextRenderRedrawOnly) { this._onRender.fire({ start, end }); } @@ -124,7 +144,10 @@ export class RenderService extends Disposable implements IRenderService { this._renderer.dispose(); this._renderer = renderer; this._renderer.onRequestRedraw(e => this.refreshRows(e.start, e.end, true)); - this.refreshRows(0, this._rowCount - 1); + + // Force a refresh + this._needsSelectionRefresh = true; + this._fullRefresh(); } private _fullRefresh(): void { @@ -164,6 +187,9 @@ export class RenderService extends Disposable implements IRenderService { } public onSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void { + this._selectionState.start = start; + this._selectionState.end = end; + this._selectionState.columnSelectMode = columnSelectMode; this._renderer.onSelectionChanged(start, end, columnSelectMode); } From a5d50960a73705996c5f4691cf3efd8dc4833f35 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 25 Apr 2020 07:27:09 -0700 Subject: [PATCH 5/6] Support DI in UnicodeService --- src/Terminal.test.ts | 4 ++-- src/Terminal.ts | 2 +- src/browser/Linkifier.test.ts | 4 ++-- src/browser/Linkifier.ts | 7 +++---- src/common/TestUtils.test.ts | 1 + src/common/services/Services.ts | 1 + src/common/services/UnicodeService.ts | 2 ++ 7 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/Terminal.test.ts b/src/Terminal.test.ts index e2bd4d56..4d590699 100644 --- a/src/Terminal.test.ts +++ b/src/Terminal.test.ts @@ -9,7 +9,7 @@ import { DEFAULT_ATTR_DATA } from 'common/buffer/BufferLine'; import { CellData } from 'common/buffer/CellData'; import { IBufferService, IUnicodeService } from 'common/services/Services'; import { Linkifier } from 'browser/Linkifier'; -import { MockLogService, MockOptionsService, MockUnicodeService } from 'common/TestUtils.test'; +import { MockLogService, MockUnicodeService } from 'common/TestUtils.test'; import { IRegisteredLinkMatcher, IMouseZoneManager, IMouseZone } from 'browser/Types'; const INIT_COLS = 80; @@ -1407,7 +1407,7 @@ describe('Terminal', () => { class TestLinkifier extends Linkifier { constructor(bufferService: IBufferService, unicodeService: IUnicodeService) { - super(bufferService, new MockLogService(), new MockOptionsService(), unicodeService); + super(bufferService, new MockLogService(), unicodeService); Linkifier._timeBeforeLatency = 0; } diff --git a/src/Terminal.ts b/src/Terminal.ts index ea689877..e7188164 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -257,7 +257,7 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp } if (!this.linkifier) { - this.linkifier = new Linkifier(this._bufferService, this._logService, this.optionsService, this.unicodeService); + this.linkifier = this._instantiationService.createInstance(Linkifier); } if (!this.linkifier2) { this.linkifier2 = new Linkifier2(this._bufferService); diff --git a/src/browser/Linkifier.test.ts b/src/browser/Linkifier.test.ts index c0dc6bf6..81741df4 100644 --- a/src/browser/Linkifier.test.ts +++ b/src/browser/Linkifier.test.ts @@ -9,13 +9,13 @@ import { IBufferLine } from 'common/Types'; import { Linkifier } from 'browser/Linkifier'; import { BufferLine } from 'common/buffer/BufferLine'; import { CellData } from 'common/buffer/CellData'; -import { MockLogService, MockBufferService, MockOptionsService } from 'common/TestUtils.test'; +import { MockLogService, MockBufferService } from 'common/TestUtils.test'; import { IBufferService } from 'common/services/Services'; import { UnicodeService } from 'common/services/UnicodeService'; class TestLinkifier extends Linkifier { constructor(bufferService: IBufferService) { - super(bufferService, new MockLogService(), new MockOptionsService(), new UnicodeService()); + super(bufferService, new MockLogService(), new UnicodeService()); Linkifier._timeBeforeLatency = 0; } diff --git a/src/browser/Linkifier.ts b/src/browser/Linkifier.ts index ca45ef2a..6d25e730 100644 --- a/src/browser/Linkifier.ts +++ b/src/browser/Linkifier.ts @@ -43,10 +43,9 @@ export class Linkifier implements ILinkifier { public get onLinkTooltip(): IEvent { return this._onLinkTooltip.event; } constructor( - protected readonly _bufferService: IBufferService, - private readonly _logService: ILogService, - private readonly _optionsService: IOptionsService, - private readonly _unicodeService: IUnicodeService + @IBufferService protected readonly _bufferService: IBufferService, + @ILogService private readonly _logService: ILogService, + @IUnicodeService private readonly _unicodeService: IUnicodeService ) { this._rowsToLinkify = { start: undefined, diff --git a/src/common/TestUtils.test.ts b/src/common/TestUtils.test.ts index 7e024140..cfa1abd7 100644 --- a/src/common/TestUtils.test.ts +++ b/src/common/TestUtils.test.ts @@ -109,6 +109,7 @@ export class MockOptionsService implements IOptionsService { // defaults to V6 always to keep tests passing export class MockUnicodeService implements IUnicodeService { + public serviceBrand: any; private _provider = new UnicodeV6(); public register(provider: IUnicodeVersionProvider): void { throw new Error('Method not implemented.'); diff --git a/src/common/services/Services.ts b/src/common/services/Services.ts index 0f3ab374..8a3e9b28 100644 --- a/src/common/services/Services.ts +++ b/src/common/services/Services.ts @@ -311,6 +311,7 @@ export interface ITheme { export const IUnicodeService = createDecorator('UnicodeService'); export interface IUnicodeService { + serviceBrand: any; /** Register an Unicode version provider. */ register(provider: IUnicodeVersionProvider): void; /** Registered Unicode versions. */ diff --git a/src/common/services/UnicodeService.ts b/src/common/services/UnicodeService.ts index 14b9979f..e96b7579 100644 --- a/src/common/services/UnicodeService.ts +++ b/src/common/services/UnicodeService.ts @@ -8,6 +8,8 @@ import { UnicodeV6 } from 'common/input/UnicodeV6'; export class UnicodeService implements IUnicodeService { + public serviceBrand: any; + private _providers: {[key: string]: IUnicodeVersionProvider} = Object.create(null); private _active: string = ''; private _activeProvider: IUnicodeVersionProvider; From e3c81048af17b8a37b8cd2a643d4ecf493de1b25 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 25 Apr 2020 07:29:07 -0700 Subject: [PATCH 6/6] Use DI with Linkifier2 --- src/Terminal.ts | 2 +- src/browser/Linkifier2.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Terminal.ts b/src/Terminal.ts index e7188164..e3a3801d 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -260,7 +260,7 @@ export class Terminal extends Disposable implements ITerminal, IDisposable, IInp this.linkifier = this._instantiationService.createInstance(Linkifier); } if (!this.linkifier2) { - this.linkifier2 = new Linkifier2(this._bufferService); + this.linkifier2 = this._instantiationService.createInstance(Linkifier2); } if (this.options.windowsMode) { diff --git a/src/browser/Linkifier2.ts b/src/browser/Linkifier2.ts index bcdbffe6..54812169 100644 --- a/src/browser/Linkifier2.ts +++ b/src/browser/Linkifier2.ts @@ -32,7 +32,7 @@ export class Linkifier2 implements ILinkifier2 { public get onHideLinkUnderline(): IEvent { return this._onHideLinkUnderline.event; } constructor( - private readonly _bufferService: IBufferService + @IBufferService private readonly _bufferService: IBufferService ) { }