From 0785a1bf24348f0e18c5f289ec591bc69a9ecda8 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Tue, 19 Apr 2022 08:25:17 -0700 Subject: [PATCH 1/4] fix #3735 (#3736) --- addons/xterm-addon-search/src/SearchAddon.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/xterm-addon-search/src/SearchAddon.ts b/addons/xterm-addon-search/src/SearchAddon.ts index 41fd19b9..536e4873 100644 --- a/addons/xterm-addon-search/src/SearchAddon.ts +++ b/addons/xterm-addon-search/src/SearchAddon.ts @@ -81,7 +81,7 @@ export class SearchAddon implements ITerminalAddon { } if (this._cachedSearchTerm && this._lastSearchOptions?.decorations) { this._highlightTimeout = setTimeout(() => { - this.findPrevious(this._cachedSearchTerm!, { ...this._lastSearchOptions, incremental: true }); + this._highlightAllMatches(this._cachedSearchTerm!, { ...this._lastSearchOptions, incremental: true }); }, 200); } }); From 3bd37115d1f3ff0649ddc992e94fad197518278c Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Tue, 19 Apr 2022 08:49:16 -0700 Subject: [PATCH 2/4] queue refresh when deco is removed (#3738) --- src/browser/Decorations/OverviewRulerRenderer.ts | 1 + src/common/services/DecorationService.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/browser/Decorations/OverviewRulerRenderer.ts b/src/browser/Decorations/OverviewRulerRenderer.ts index f34338ce..dc35b901 100644 --- a/src/browser/Decorations/OverviewRulerRenderer.ts +++ b/src/browser/Decorations/OverviewRulerRenderer.ts @@ -74,6 +74,7 @@ export class OverviewRulerRenderer extends Disposable { */ private _registerDecorationListeners(): void { this.register(this._decorationService.onDecorationRegistered(() => this._queueRefresh(undefined, true))); + this.register(this._decorationService.onDecorationRemoved(() => this._queueRefresh(undefined, true))); } /** diff --git a/src/common/services/DecorationService.ts b/src/common/services/DecorationService.ts index fba5fc35..03cfab4d 100644 --- a/src/common/services/DecorationService.ts +++ b/src/common/services/DecorationService.ts @@ -35,6 +35,7 @@ export class DecorationService extends Disposable implements IDecorationService const index = this._decorations.indexOf(decoration); if (index >= 0) { this._decorations.splice(this._decorations.indexOf(decoration), 1); + this._onDecorationRemoved.fire(decoration); } } }); From 6d801311cd1a30f7c2bd708d26959d879fa7583c Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Tue, 19 Apr 2022 15:23:26 -0700 Subject: [PATCH 3/4] exclude powerline char range from contrast demands (#3740) --- src/browser/renderer/BaseRenderLayer.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/browser/renderer/BaseRenderLayer.ts b/src/browser/renderer/BaseRenderLayer.ts index 629e9436..a95df5fa 100644 --- a/src/browser/renderer/BaseRenderLayer.ts +++ b/src/browser/renderer/BaseRenderLayer.ts @@ -428,6 +428,11 @@ export abstract class BaseRenderLayer implements IRenderLayer { } private _getContrastColor(cell: CellData): IColor | undefined { + const codepoint = cell.getCode(); + if (57344 <= codepoint && codepoint <= 63743) { + // powerline chars #3739 + return undefined; + } if (this._optionsService.rawOptions.minimumContrastRatio === 1) { return undefined; } From 38f0dd9be27bfcf626afa94629eeb7174778a55d Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Tue, 19 Apr 2022 18:46:39 -0700 Subject: [PATCH 4/4] apply to dom and webgl too (#3742) --- .../src/atlas/WebglCharAtlas.ts | 21 +++++++++---------- .../renderer/dom/DomRendererRowFactory.ts | 13 ++++++------ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/addons/xterm-addon-webgl/src/atlas/WebglCharAtlas.ts b/addons/xterm-addon-webgl/src/atlas/WebglCharAtlas.ts index e409f51e..911ea3c0 100644 --- a/addons/xterm-addon-webgl/src/atlas/WebglCharAtlas.ts +++ b/addons/xterm-addon-webgl/src/atlas/WebglCharAtlas.ts @@ -216,8 +216,8 @@ export class WebglCharAtlas implements IDisposable { } } - private _getForegroundCss(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): string { - const minimumContrastCss = this._getMinimumContrastCss(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, bold); + private _getForegroundCss(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean, isPowerLineGlyph: boolean): string { + const minimumContrastCss = this._getMinimumContrastCss(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, bold, isPowerLineGlyph); if (minimumContrastCss) { return minimumContrastCss; } @@ -281,8 +281,8 @@ export class WebglCharAtlas implements IDisposable { } } - private _getMinimumContrastCss(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): string | undefined { - if (this._config.minimumContrastRatio === 1) { + private _getMinimumContrastCss(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean, isPowerLineGlyph: boolean): string | undefined { + if (this._config.minimumContrastRatio === 1 || isPowerLineGlyph) { return undefined; } @@ -370,13 +370,6 @@ export class WebglCharAtlas implements IDisposable { `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`; this._tmpCtx.textBaseline = TEXT_BASELINE; - this._tmpCtx.fillStyle = this._getForegroundCss(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, bold); - - // Apply alpha to dim the character - if (dim) { - this._tmpCtx.globalAlpha = DIM_OPACITY; - } - // Check if the char is a powerline glyph, these will be restricted to a single cell glyph, no // padding on either side that are allowed for other glyphs since they are designed to be pixel // perfect but may render with "bad" anti-aliasing @@ -387,6 +380,12 @@ export class WebglCharAtlas implements IDisposable { isPowerlineGlyph = true; } } + this._tmpCtx.fillStyle = this._getForegroundCss(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, bold, isPowerlineGlyph); + + // Apply alpha to dim the character + if (dim) { + this._tmpCtx.globalAlpha = DIM_OPACITY; + } // For powerline glyphs left/top padding is excluded (https://github.com/microsoft/vscode/issues/120129) const padding = isPowerlineGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING; diff --git a/src/browser/renderer/dom/DomRendererRowFactory.ts b/src/browser/renderer/dom/DomRendererRowFactory.ts index fda800ae..e24c5fe5 100644 --- a/src/browser/renderer/dom/DomRendererRowFactory.ts +++ b/src/browser/renderer/dom/DomRendererRowFactory.ts @@ -3,7 +3,7 @@ * @license MIT */ -import { IBufferLine } from 'common/Types'; +import { IBufferLine, ICellData } from 'common/Types'; import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants'; import { NULL_CELL_CODE, WHITESPACE_CELL_CHAR, Attributes } from 'common/buffer/Constants'; import { CellData } from 'common/buffer/CellData'; @@ -178,7 +178,7 @@ export class DomRendererRowFactory { if (cell.isBold() && fg < 8 && this._optionsService.rawOptions.drawBoldTextInBrightColors) { fg += 8; } - if (!this._applyMinimumContrast(charElement, this._colors.background, this._colors.ansi[fg])) { + if (!this._applyMinimumContrast(charElement, this._colors.background, this._colors.ansi[fg], cell)) { charElement.classList.add(`xterm-fg-${fg}`); } break; @@ -188,13 +188,13 @@ export class DomRendererRowFactory { (fg >> 8) & 0xFF, (fg ) & 0xFF ); - if (!this._applyMinimumContrast(charElement, this._colors.background, color)) { + if (!this._applyMinimumContrast(charElement, this._colors.background, color, cell)) { this._addStyle(charElement, `color:#${padStart(fg.toString(16), '0', 6)}`); } break; case Attributes.CM_DEFAULT: default: - if (!this._applyMinimumContrast(charElement, this._colors.background, this._colors.foreground)) { + if (!this._applyMinimumContrast(charElement, this._colors.background, this._colors.foreground, cell)) { if (isInverse) { charElement.classList.add(`xterm-fg-${INVERTED_DEFAULT_COLOR}`); } @@ -224,8 +224,9 @@ export class DomRendererRowFactory { return fragment; } - private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor): boolean { - if (this._optionsService.rawOptions.minimumContrastRatio === 1) { + private _applyMinimumContrast(element: HTMLElement, bg: IColor, fg: IColor, cell: ICellData): boolean { + const codepoint = cell.getCode(); + if (this._optionsService.rawOptions.minimumContrastRatio === 1 || 57344 <= codepoint && codepoint <= 63743) { return false; }