From f2b90d690f97ec72e5ca82d46787975ac9277901 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Mon, 16 May 2022 15:17:03 -0700 Subject: [PATCH] Selection foreground for canvas (circular dep issue) --- src/browser/renderer/BaseRenderLayer.ts | 11 ++++++++++- src/browser/renderer/CursorRenderLayer.ts | 7 ++++--- src/browser/renderer/LinkRenderLayer.ts | 6 ++++-- src/browser/renderer/SelectionRenderLayer.ts | 6 ++++-- src/browser/renderer/TextRenderLayer.ts | 7 ++++--- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/browser/renderer/BaseRenderLayer.ts b/src/browser/renderer/BaseRenderLayer.ts index 696b793f..7bcc6881 100644 --- a/src/browser/renderer/BaseRenderLayer.ts +++ b/src/browser/renderer/BaseRenderLayer.ts @@ -18,6 +18,7 @@ import { isPowerlineGlyph, throwIfFalsy } from 'browser/renderer/RendererUtils'; import { channels, color, rgba } from 'common/Color'; import { removeElementFromParent } from 'browser/Dom'; import { tryDrawCustomChar } from 'browser/renderer/CustomGlyphs'; +import { ISelectionService } from 'browser/services/Services'; export abstract class BaseRenderLayer implements IRenderLayer { private _canvas: HTMLCanvasElement; @@ -53,7 +54,8 @@ export abstract class BaseRenderLayer implements IRenderLayer { private _rendererId: number, protected readonly _bufferService: IBufferService, protected readonly _optionsService: IOptionsService, - protected readonly _decorationService: IDecorationService + protected readonly _decorationService: IDecorationService, + protected readonly _selectionService: ISelectionService ) { this._canvas = document.createElement('canvas'); this._canvas.classList.add(`xterm-${id}-layer`); @@ -457,6 +459,13 @@ export abstract class BaseRenderLayer implements IRenderLayer { isTop = d.options.layer === 'top'; } + // Apply selection foreground if applicable + if (!isTop) { + if (this._colors.selectionForeground && this._selectionService.isCellInSelection(x, y)) { + fgOverride = this._colors.selectionForeground.rgba; + } + } + if (!bgOverride && !fgOverride && (this._optionsService.rawOptions.minimumContrastRatio === 1 || isPowerlineGlyph(cell.getCode()))) { return undefined; } diff --git a/src/browser/renderer/CursorRenderLayer.ts b/src/browser/renderer/CursorRenderLayer.ts index 3fa576a9..6405390e 100644 --- a/src/browser/renderer/CursorRenderLayer.ts +++ b/src/browser/renderer/CursorRenderLayer.ts @@ -10,7 +10,7 @@ import { CellData } from 'common/buffer/CellData'; import { IColorSet } from 'browser/Types'; import { IBufferService, IOptionsService, ICoreService, IDecorationService } from 'common/services/Services'; import { IEventEmitter } from 'common/EventEmitter'; -import { ICoreBrowserService } from 'browser/services/Services'; +import { ICoreBrowserService, ISelectionService } from 'browser/services/Services'; interface ICursorState { x: number; @@ -41,9 +41,10 @@ export class CursorRenderLayer extends BaseRenderLayer { @IOptionsService optionsService: IOptionsService, @ICoreService private readonly _coreService: ICoreService, @ICoreBrowserService private readonly _coreBrowserService: ICoreBrowserService, - @IDecorationService decorationService: IDecorationService + @IDecorationService decorationService: IDecorationService, + @ISelectionService selectionService: ISelectionService ) { - super(container, 'cursor', zIndex, true, colors, rendererId, bufferService, optionsService, decorationService); + super(container, 'cursor', zIndex, true, colors, rendererId, bufferService, optionsService, decorationService, selectionService); this._state = { x: 0, y: 0, diff --git a/src/browser/renderer/LinkRenderLayer.ts b/src/browser/renderer/LinkRenderLayer.ts index 15086d9a..4d350f4d 100644 --- a/src/browser/renderer/LinkRenderLayer.ts +++ b/src/browser/renderer/LinkRenderLayer.ts @@ -9,6 +9,7 @@ import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/atlas/Constants'; import { is256Color } from 'browser/renderer/atlas/CharAtlasUtils'; import { IColorSet, ILinkifierEvent, ILinkifier, ILinkifier2 } from 'browser/Types'; import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; +import { ISelectionService } from 'browser/services/Services'; export class LinkRenderLayer extends BaseRenderLayer { private _state: ILinkifierEvent | undefined; @@ -22,9 +23,10 @@ export class LinkRenderLayer extends BaseRenderLayer { linkifier2: ILinkifier2, @IBufferService bufferService: IBufferService, @IOptionsService optionsService: IOptionsService, - @IDecorationService decorationService: IDecorationService + @IDecorationService decorationService: IDecorationService, + @ISelectionService selectionService: ISelectionService ) { - super(container, 'link', zIndex, true, colors, rendererId, bufferService, optionsService, decorationService); + super(container, 'link', zIndex, true, colors, rendererId, bufferService, optionsService, decorationService, selectionService); linkifier.onShowLinkUnderline(e => this._onShowLinkUnderline(e)); linkifier.onHideLinkUnderline(e => this._onHideLinkUnderline(e)); diff --git a/src/browser/renderer/SelectionRenderLayer.ts b/src/browser/renderer/SelectionRenderLayer.ts index be911eb9..60c53eaf 100644 --- a/src/browser/renderer/SelectionRenderLayer.ts +++ b/src/browser/renderer/SelectionRenderLayer.ts @@ -7,6 +7,7 @@ import { IRenderDimensions } from 'browser/renderer/Types'; import { BaseRenderLayer } from 'browser/renderer/BaseRenderLayer'; import { IColorSet } from 'browser/Types'; import { IBufferService, IDecorationService, IOptionsService } from 'common/services/Services'; +import { ISelectionService } from 'browser/services/Services'; interface ISelectionState { start?: [number, number]; @@ -25,9 +26,10 @@ export class SelectionRenderLayer extends BaseRenderLayer { rendererId: number, @IBufferService bufferService: IBufferService, @IOptionsService optionsService: IOptionsService, - @IDecorationService decorationService: IDecorationService + @IDecorationService decorationService: IDecorationService, + @ISelectionService selectionService: ISelectionService ) { - super(container, 'selection', zIndex, true, colors, rendererId, bufferService, optionsService, decorationService); + super(container, 'selection', zIndex, true, colors, rendererId, bufferService, optionsService, decorationService, selectionService); this._clearState(); } diff --git a/src/browser/renderer/TextRenderLayer.ts b/src/browser/renderer/TextRenderLayer.ts index ef5a9b62..97c7e6f6 100644 --- a/src/browser/renderer/TextRenderLayer.ts +++ b/src/browser/renderer/TextRenderLayer.ts @@ -12,7 +12,7 @@ import { NULL_CELL_CODE, Content } from 'common/buffer/Constants'; import { IColorSet } from 'browser/Types'; import { CellData } from 'common/buffer/CellData'; import { IOptionsService, IBufferService, IDecorationService } from 'common/services/Services'; -import { ICharacterJoinerService } from 'browser/services/Services'; +import { ICharacterJoinerService, ISelectionService } from 'browser/services/Services'; import { JoinedCellData } from 'browser/services/CharacterJoinerService'; /** @@ -38,9 +38,10 @@ export class TextRenderLayer extends BaseRenderLayer { @IBufferService bufferService: IBufferService, @IOptionsService optionsService: IOptionsService, @ICharacterJoinerService private readonly _characterJoinerService: ICharacterJoinerService, - @IDecorationService decorationService: IDecorationService + @IDecorationService decorationService: IDecorationService, + @ISelectionService selectionService: ISelectionService ) { - super(container, 'text', zIndex, alpha, colors, rendererId, bufferService, optionsService, decorationService); + super(container, 'text', zIndex, alpha, colors, rendererId, bufferService, optionsService, decorationService, selectionService); this._state = new GridCache(); }