From e0fb3b4d199f51a88c94b080636c7034cb979aa8 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sat, 8 Oct 2022 15:23:29 -0700 Subject: [PATCH] Remove ColorManager --- .../src/SerializeAddon.test.ts | 13 +- .../src/SerializeAddon.ts | 2 +- src/browser/ColorManager.ts | 217 ------------------ src/browser/TestUtils.test.ts | 3 +- src/browser/Types.d.ts | 5 - src/browser/services/ThemeService.test.ts | 3 +- 6 files changed, 7 insertions(+), 236 deletions(-) delete mode 100644 src/browser/ColorManager.ts diff --git a/addons/xterm-addon-serialize/src/SerializeAddon.test.ts b/addons/xterm-addon-serialize/src/SerializeAddon.test.ts index b47c7928..205927f6 100644 --- a/addons/xterm-addon-serialize/src/SerializeAddon.test.ts +++ b/addons/xterm-addon-serialize/src/SerializeAddon.test.ts @@ -7,9 +7,10 @@ import jsdom = require('jsdom'); import { assert } from 'chai'; import { SerializeAddon } from './SerializeAddon'; import { Terminal } from 'browser/public/Terminal'; -import { ColorManager } from 'browser/ColorManager'; import { SelectionModel } from 'browser/selection/SelectionModel'; import { IBufferService } from 'common/services/Services'; +import { OptionsService } from 'common/services/OptionsService'; +import { ThemeService } from 'browser/services/ThemeService'; function sgr(...seq: string[]): string { return `\x1b[${seq.join(';')}m`; @@ -44,14 +45,11 @@ class TestSelectionService { } describe('xterm-addon-serialize', () => { - let cm: ColorManager; let dom: jsdom.JSDOM; - let document: Document; let window: jsdom.DOMWindow; let serializeAddon: SerializeAddon; let terminal: Terminal; - let selectionService: any; before(() => { serializeAddon = new SerializeAddon(); @@ -77,11 +75,8 @@ describe('xterm-addon-serialize', () => { terminal = new Terminal({ cols: 10, rows: 2, allowProposedApi: true }); terminal.loadAddon(serializeAddon); - // TODO: Fix color manager reference - selectionService = new TestSelectionService((terminal as any)._core._bufferService); - cm = new ColorManager(); - (terminal as any)._core._colorManager = cm; - (terminal as any)._core._selectionService = selectionService; + (terminal as any)._core._themeService = new ThemeService(new OptionsService({})); + (terminal as any)._core._selectionService = new TestSelectionService((terminal as any)._core._bufferService); }); describe('text', () => { diff --git a/addons/xterm-addon-serialize/src/SerializeAddon.ts b/addons/xterm-addon-serialize/src/SerializeAddon.ts index 99967374..b83ff160 100644 --- a/addons/xterm-addon-serialize/src/SerializeAddon.ts +++ b/addons/xterm-addon-serialize/src/SerializeAddon.ts @@ -544,7 +544,7 @@ export class HTMLSerializeHandler extends BaseSerializeHandler { super(buffer); // https://github.com/xtermjs/xterm.js/issues/3601 - this._colors = (_terminal as any)._core._colorManager.colors; + this._colors = (_terminal as any)._core._themeService.colors; } private _padStart(target: string, targetLength: number, padString: string): string { diff --git a/src/browser/ColorManager.ts b/src/browser/ColorManager.ts deleted file mode 100644 index de5c828c..00000000 --- a/src/browser/ColorManager.ts +++ /dev/null @@ -1,217 +0,0 @@ -/** - * Copyright (c) 2017 The xterm.js authors. All rights reserved. - * @license MIT - */ - -import { IColorManager, IColorSet, IColorContrastCache } from 'browser/Types'; -import { ITheme } from 'common/services/Services'; -import { channels, color, css, NULL_COLOR } from 'common/Color'; -import { ColorContrastCache } from 'browser/ColorContrastCache'; -import { ColorIndex, IColor } from 'common/Types'; - - -interface IRestoreColorSet { - foreground: IColor; - background: IColor; - cursor: IColor; - ansi: IColor[]; -} - - -const DEFAULT_FOREGROUND = css.toColor('#ffffff'); -const DEFAULT_BACKGROUND = css.toColor('#000000'); -const DEFAULT_CURSOR = css.toColor('#ffffff'); -const DEFAULT_CURSOR_ACCENT = css.toColor('#000000'); -const DEFAULT_SELECTION = { - css: 'rgba(255, 255, 255, 0.3)', - rgba: 0xFFFFFF4D -}; - -// An IIFE to generate DEFAULT_ANSI_COLORS. -export const DEFAULT_ANSI_COLORS = Object.freeze((() => { - const colors = [ - // dark: - css.toColor('#2e3436'), - css.toColor('#cc0000'), - css.toColor('#4e9a06'), - css.toColor('#c4a000'), - css.toColor('#3465a4'), - css.toColor('#75507b'), - css.toColor('#06989a'), - css.toColor('#d3d7cf'), - // bright: - css.toColor('#555753'), - css.toColor('#ef2929'), - css.toColor('#8ae234'), - css.toColor('#fce94f'), - css.toColor('#729fcf'), - css.toColor('#ad7fa8'), - css.toColor('#34e2e2'), - css.toColor('#eeeeec') - ]; - - // Fill in the remaining 240 ANSI colors. - // Generate colors (16-231) - const v = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff]; - for (let i = 0; i < 216; i++) { - const r = v[(i / 36) % 6 | 0]; - const g = v[(i / 6) % 6 | 0]; - const b = v[i % 6]; - colors.push({ - css: channels.toCss(r, g, b), - rgba: channels.toRgba(r, g, b) - }); - } - - // Generate greys (232-255) - for (let i = 0; i < 24; i++) { - const c = 8 + i * 10; - colors.push({ - css: channels.toCss(c, c, c), - rgba: channels.toRgba(c, c, c) - }); - } - - return colors; -})()); - -/** - * Manages the source of truth for a terminal's colors. - */ -export class ColorManager implements IColorManager { - public colors: IColorSet; - - private _contrastCache: IColorContrastCache; - private _restoreColors!: IRestoreColorSet; - - constructor() { - this._contrastCache = new ColorContrastCache(); - this.colors = { - foreground: DEFAULT_FOREGROUND, - background: DEFAULT_BACKGROUND, - cursor: DEFAULT_CURSOR, - cursorAccent: DEFAULT_CURSOR_ACCENT, - selectionForeground: undefined, - selectionBackgroundTransparent: DEFAULT_SELECTION, - selectionBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION), - selectionInactiveBackgroundTransparent: DEFAULT_SELECTION, - selectionInactiveBackgroundOpaque: color.blend(DEFAULT_BACKGROUND, DEFAULT_SELECTION), - ansi: DEFAULT_ANSI_COLORS.slice(), - contrastCache: this._contrastCache - }; - this._updateRestoreColors(); - } - - public handleOptionsChange(key: string, value: any): void { - switch (key) { - case 'minimumContrastRatio': - this._contrastCache.clear(); - break; - } - } - - /** - * Sets the terminal's theme. - * @param theme The theme to use. If a partial theme is provided then default - * colors will be used where colors are not defined. - */ - public setTheme(theme: ITheme = {}): void { - this.colors.foreground = this._parseColor(theme.foreground, DEFAULT_FOREGROUND); - this.colors.background = this._parseColor(theme.background, DEFAULT_BACKGROUND); - this.colors.cursor = this._parseColor(theme.cursor, DEFAULT_CURSOR); - this.colors.cursorAccent = this._parseColor(theme.cursorAccent, DEFAULT_CURSOR_ACCENT); - this.colors.selectionBackgroundTransparent = this._parseColor(theme.selectionBackground, DEFAULT_SELECTION); - this.colors.selectionBackgroundOpaque = color.blend(this.colors.background, this.colors.selectionBackgroundTransparent); - this.colors.selectionInactiveBackgroundTransparent = this._parseColor(theme.selectionInactiveBackground, this.colors.selectionBackgroundTransparent); - this.colors.selectionInactiveBackgroundOpaque = color.blend(this.colors.background, this.colors.selectionInactiveBackgroundTransparent); - this.colors.selectionForeground = theme.selectionForeground ? this._parseColor(theme.selectionForeground, NULL_COLOR) : undefined; - if (this.colors.selectionForeground === NULL_COLOR) { - this.colors.selectionForeground = undefined; - } - - /** - * If selection color is opaque, blend it with background with 0.3 opacity - * Issue #2737 - */ - if (color.isOpaque(this.colors.selectionBackgroundTransparent)) { - const opacity = 0.3; - this.colors.selectionBackgroundTransparent = color.opacity(this.colors.selectionBackgroundTransparent, opacity); - } - if (color.isOpaque(this.colors.selectionInactiveBackgroundTransparent)) { - const opacity = 0.3; - this.colors.selectionInactiveBackgroundTransparent = color.opacity(this.colors.selectionInactiveBackgroundTransparent, opacity); - } - this.colors.ansi = DEFAULT_ANSI_COLORS.slice(); - this.colors.ansi[0] = this._parseColor(theme.black, DEFAULT_ANSI_COLORS[0]); - this.colors.ansi[1] = this._parseColor(theme.red, DEFAULT_ANSI_COLORS[1]); - this.colors.ansi[2] = this._parseColor(theme.green, DEFAULT_ANSI_COLORS[2]); - this.colors.ansi[3] = this._parseColor(theme.yellow, DEFAULT_ANSI_COLORS[3]); - this.colors.ansi[4] = this._parseColor(theme.blue, DEFAULT_ANSI_COLORS[4]); - this.colors.ansi[5] = this._parseColor(theme.magenta, DEFAULT_ANSI_COLORS[5]); - this.colors.ansi[6] = this._parseColor(theme.cyan, DEFAULT_ANSI_COLORS[6]); - this.colors.ansi[7] = this._parseColor(theme.white, DEFAULT_ANSI_COLORS[7]); - this.colors.ansi[8] = this._parseColor(theme.brightBlack, DEFAULT_ANSI_COLORS[8]); - this.colors.ansi[9] = this._parseColor(theme.brightRed, DEFAULT_ANSI_COLORS[9]); - this.colors.ansi[10] = this._parseColor(theme.brightGreen, DEFAULT_ANSI_COLORS[10]); - this.colors.ansi[11] = this._parseColor(theme.brightYellow, DEFAULT_ANSI_COLORS[11]); - this.colors.ansi[12] = this._parseColor(theme.brightBlue, DEFAULT_ANSI_COLORS[12]); - this.colors.ansi[13] = this._parseColor(theme.brightMagenta, DEFAULT_ANSI_COLORS[13]); - this.colors.ansi[14] = this._parseColor(theme.brightCyan, DEFAULT_ANSI_COLORS[14]); - this.colors.ansi[15] = this._parseColor(theme.brightWhite, DEFAULT_ANSI_COLORS[15]); - if (theme.extendedAnsi) { - const colorCount = Math.min(this.colors.ansi.length - 16, theme.extendedAnsi.length); - for (let i = 0; i < colorCount; i++) { - this.colors.ansi[i + 16] = this._parseColor(theme.extendedAnsi[i], DEFAULT_ANSI_COLORS[i + 16]); - } - } - // Clear our the cache - this._contrastCache.clear(); - this._updateRestoreColors(); - } - - public restoreColor(slot?: ColorIndex): void { - // unset slot restores all ansi colors - if (slot === undefined) { - for (let i = 0; i < this._restoreColors.ansi.length; ++i) { - this.colors.ansi[i] = this._restoreColors.ansi[i]; - } - return; - } - switch (slot) { - case ColorIndex.FOREGROUND: - this.colors.foreground = this._restoreColors.foreground; - break; - case ColorIndex.BACKGROUND: - this.colors.background = this._restoreColors.background; - break; - case ColorIndex.CURSOR: - this.colors.cursor = this._restoreColors.cursor; - break; - default: - this.colors.ansi[slot] = this._restoreColors.ansi[slot]; - } - } - - private _updateRestoreColors(): void { - this._restoreColors = { - foreground: this.colors.foreground, - background: this.colors.background, - cursor: this.colors.cursor, - ansi: this.colors.ansi.slice() - }; - } - - private _parseColor( - cssString: string | undefined, - fallback: IColor - ): IColor { - if (cssString !== undefined) { - try { - return css.toColor(cssString); - } catch { - // no-op - } - } - return fallback; - } -} diff --git a/src/browser/TestUtils.test.ts b/src/browser/TestUtils.test.ts index a0837895..97ad90d8 100644 --- a/src/browser/TestUtils.test.ts +++ b/src/browser/TestUtils.test.ts @@ -7,7 +7,7 @@ import { IDisposable, IMarker, ILinkProvider, IDecorationOptions, IDecoration } import { IEvent, EventEmitter } from 'common/EventEmitter'; import { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IMouseService, IRenderService, ISelectionService, IThemeService } from 'browser/services/Services'; import { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types'; -import { IColorSet, ITerminal, ILinkifier2, IBrowser, IViewport, IColorManager, ICompositionHelper, CharacterJoinerHandler, IBufferRange, ReadonlyColorSet } from 'browser/Types'; +import { IColorSet, ITerminal, ILinkifier2, IBrowser, IViewport, ICompositionHelper, CharacterJoinerHandler, IBufferRange, ReadonlyColorSet } from 'browser/Types'; import { IBuffer, IBufferStringIterator, IBufferSet } from 'common/buffer/Types'; import { IBufferLine, ICellData, IAttributeData, ICircularList, XtermListener, ICharset, ITerminalOptions, ColorIndex } from 'common/Types'; import { Buffer } from 'common/buffer/Buffer'; @@ -266,7 +266,6 @@ export class MockRenderer implements IRenderer { public dispose(): void { throw new Error('Method not implemented.'); } - public colorManager!: IColorManager; public on(type: string, listener: XtermListener): void { throw new Error('Method not implemented.'); } diff --git a/src/browser/Types.d.ts b/src/browser/Types.d.ts index da1f358f..cfd7156f 100644 --- a/src/browser/Types.d.ts +++ b/src/browser/Types.d.ts @@ -106,11 +106,6 @@ export interface IBrowser { isWindows: boolean; } -export interface IColorManager { - colors: IColorSet; - handleOptionsChange(key: string, value: any): void; -} - export interface IColorSet { foreground: IColor; background: IColor; diff --git a/src/browser/services/ThemeService.test.ts b/src/browser/services/ThemeService.test.ts index bebd0f56..f2b2def3 100644 --- a/src/browser/services/ThemeService.test.ts +++ b/src/browser/services/ThemeService.test.ts @@ -6,10 +6,9 @@ import jsdom = require('jsdom'); import { assert } from 'chai'; import { ThemeService, DEFAULT_ANSI_COLORS } from 'browser/services/ThemeService'; -import { MockOptionsService } from 'common/TestUtils.test'; import { OptionsService } from 'common/services/OptionsService'; -describe.only('ThemeService', () => { +describe('ThemeService', () => { let themeService: ThemeService; let dom: jsdom.JSDOM; let window: jsdom.DOMWindow;