From 1134d0d7d4ab86093be74861768a1006161f9f9a Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 25 Apr 2020 06:22:08 -0700 Subject: [PATCH 1/2] 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/2] 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); })); } }