From a54426ccb8acd17f84e83348f0adae83db720e29 Mon Sep 17 00:00:00 2001 From: Simon Lamon Date: Sat, 4 Jun 2022 12:39:43 +0000 Subject: [PATCH 1/2] extended colors --- src/browser/ColorManager.test.ts | 21 ++++++++++++++++++++- src/browser/ColorManager.ts | 5 +++++ src/common/services/Services.ts | 1 + typings/xterm-headless.d.ts | 2 ++ typings/xterm.d.ts | 4 +++- 5 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/browser/ColorManager.test.ts b/src/browser/ColorManager.test.ts index 96bc82e4..dfcc9ec8 100644 --- a/src/browser/ColorManager.test.ts +++ b/src/browser/ColorManager.test.ts @@ -5,7 +5,7 @@ import jsdom = require('jsdom'); import { assert } from 'chai'; -import { ColorManager } from 'browser/ColorManager'; +import { ColorManager, DEFAULT_ANSI_COLORS } from 'browser/ColorManager'; describe('ColorManager', () => { let cm: ColorManager; @@ -309,5 +309,24 @@ describe('ColorManager', () => { // FG reverts back to default assert.equal(cm.colors.foreground.css, '#ffffff'); }); + + it('should set all extended ansi colors in reverse order', () => { + cm.setTheme({ + extendedAnsi: DEFAULT_ANSI_COLORS.map(a => a.css).slice().reverse() + }); + + for (let ansiColor = 16; ansiColor <= 255; ansiColor++){ + assert.equal(cm.colors.ansi[ansiColor].css, DEFAULT_ANSI_COLORS[255 + 16 - ansiColor].css); + } + }); + + it('should set one extended ansi colors and keep the other default', () => { + cm.setTheme({ + extendedAnsi: [ '#ffffff' ] + }); + + assert.equal(cm.colors.ansi[16].css, '#ffffff'); + assert.equal(cm.colors.ansi[17].css, DEFAULT_ANSI_COLORS[17].css); + }); }); }); diff --git a/src/browser/ColorManager.ts b/src/browser/ColorManager.ts index f11ef8fd..bc0d0a4e 100644 --- a/src/browser/ColorManager.ts +++ b/src/browser/ColorManager.ts @@ -162,6 +162,11 @@ export class ColorManager implements IColorManager { 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) { + for (let ansiColor = 0; ansiColor < theme.extendedAnsi.length && ansiColor <= 255 - 16; ansiColor++) { + this.colors.ansi[ansiColor + 16] = this._parseColor(theme.extendedAnsi[ansiColor], DEFAULT_ANSI_COLORS[ansiColor + 16]); + } + } // Clear our the cache this._contrastCache.clear(); this._updateRestoreColors(); diff --git a/src/common/services/Services.ts b/src/common/services/Services.ts index 017eb386..feddcfa7 100644 --- a/src/common/services/Services.ts +++ b/src/common/services/Services.ts @@ -276,6 +276,7 @@ export interface ITheme { brightMagenta?: string; brightCyan?: string; brightWhite?: string; + extendedAnsi?: string[]; } export const IUnicodeService = createDecorator('UnicodeService'); diff --git a/typings/xterm-headless.d.ts b/typings/xterm-headless.d.ts index 0ab8bd96..26a01e4c 100644 --- a/typings/xterm-headless.d.ts +++ b/typings/xterm-headless.d.ts @@ -267,6 +267,8 @@ declare module 'xterm-headless' { brightCyan?: string; /** ANSI bright white (eg. `\x1b[1;37m`) */ brightWhite?: string; + /** ANSI extended colors (16-255) */ + extendedAnsi?: string[]; } /** diff --git a/typings/xterm.d.ts b/typings/xterm.d.ts index 39dcaee9..a3f47300 100644 --- a/typings/xterm.d.ts +++ b/typings/xterm.d.ts @@ -322,6 +322,8 @@ declare module 'xterm' { brightCyan?: string; /** ANSI bright white (eg. `\x1b[1;37m`) */ brightWhite?: string; + /** ANSI extended colors (16-255) */ + extendedAnsi?: string[]; } /** @@ -845,7 +847,7 @@ declare module 'xterm' { * Adds an event listener for when data has been parsed by the terminal, * after {@link write} is called. This event is useful to listen for any * changes in the buffer. - * + * * This fires at most once per frame, after data parsing completes. Note * that this can fire when there are still writes pending if there is a lot * of data. From c786c6a072721c8eda3cf66a1b0a792712978956 Mon Sep 17 00:00:00 2001 From: Simon Lamon Date: Mon, 18 Jul 2022 17:35:13 +0000 Subject: [PATCH 2/2] Apply review comments --- src/browser/ColorManager.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/browser/ColorManager.ts b/src/browser/ColorManager.ts index bc0d0a4e..c1797d76 100644 --- a/src/browser/ColorManager.ts +++ b/src/browser/ColorManager.ts @@ -163,8 +163,9 @@ export class ColorManager implements IColorManager { 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) { - for (let ansiColor = 0; ansiColor < theme.extendedAnsi.length && ansiColor <= 255 - 16; ansiColor++) { - this.colors.ansi[ansiColor + 16] = this._parseColor(theme.extendedAnsi[ansiColor], DEFAULT_ANSI_COLORS[ansiColor + 16]); + const colorCount = Math.max(theme.extendedAnsi.length + 16, 256); + for (let i = 16; i < colorCount; i++) { + this.colors.ansi[i] = this._parseColor(theme.extendedAnsi[i - 16], DEFAULT_ANSI_COLORS[i]); } } // Clear our the cache