diff --git a/src/InputHandler.test.ts b/src/InputHandler.test.ts index f2e8d93e92..b9a494f9ee 100644 --- a/src/InputHandler.test.ts +++ b/src/InputHandler.test.ts @@ -495,6 +495,46 @@ describe('InputHandler', () => { assert.equal(term.curAttrData.getBgColorMode(), 0); assert.equal(term.curAttrData.getBgColor(), -1); }); + it('colormode transition RGB to 256', () => { + // enter RGB for FG and BG + term.writeSync(`\x1b[38;2;1;2;3;48;2;4;5;6m`); + // enter 256 for FG and BG + term.writeSync(`\x1b[38;5;255;48;5;255m`); + assert.equal(term.curAttrData.getFgColorMode(), Attributes.CM_P256); + assert.equal(term.curAttrData.getFgColor(), 255); + assert.equal(term.curAttrData.getBgColorMode(), Attributes.CM_P256); + assert.equal(term.curAttrData.getBgColor(), 255); + }); + it('colormode transition RGB to 16', () => { + // enter RGB for FG and BG + term.writeSync(`\x1b[38;2;1;2;3;48;2;4;5;6m`); + // enter 16 for FG and BG + term.writeSync(`\x1b[37;47m`); + assert.equal(term.curAttrData.getFgColorMode(), Attributes.CM_P16); + assert.equal(term.curAttrData.getFgColor(), 7); + assert.equal(term.curAttrData.getBgColorMode(), Attributes.CM_P16); + assert.equal(term.curAttrData.getBgColor(), 7); + }); + it('colormode transition 16 to 256', () => { + // enter 16 for FG and BG + term.writeSync(`\x1b[37;47m`); + // enter 256 for FG and BG + term.writeSync(`\x1b[38;5;255;48;5;255m`); + assert.equal(term.curAttrData.getFgColorMode(), Attributes.CM_P256); + assert.equal(term.curAttrData.getFgColor(), 255); + assert.equal(term.curAttrData.getBgColorMode(), Attributes.CM_P256); + assert.equal(term.curAttrData.getBgColor(), 255); + }); + it('colormode transition 256 to 16', () => { + // enter 256 for FG and BG + term.writeSync(`\x1b[38;5;255;48;5;255m`); + // enter 16 for FG and BG + term.writeSync(`\x1b[37;47m`); + assert.equal(term.curAttrData.getFgColorMode(), Attributes.CM_P16); + assert.equal(term.curAttrData.getFgColor(), 7); + assert.equal(term.curAttrData.getBgColorMode(), Attributes.CM_P16); + assert.equal(term.curAttrData.getBgColor(), 7); + }); it('should zero missing RGB values', () => { term.writeSync(`\x1b[38;2;1;2;3m`); term.writeSync(`\x1b[38;2;5m`); diff --git a/src/InputHandler.ts b/src/InputHandler.ts index ac4bee9363..94c7e96b2b 100644 --- a/src/InputHandler.ts +++ b/src/InputHandler.ts @@ -1693,7 +1693,7 @@ export class InputHandler extends Disposable implements IInputHandler { attr.bg &= ~(Attributes.CM_MASK | Attributes.RGB_MASK); attr.bg |= DEFAULT_ATTR_DATA.bg & (Attributes.PCOLOR_MASK | Attributes.RGB_MASK); } else if (p === 38) { - // fg color 256 + // fg color 256 and RGB if (params[i + 1] === 2) { i += 2; attr.fg |= Attributes.CM_RGB; @@ -1703,11 +1703,11 @@ export class InputHandler extends Disposable implements IInputHandler { } else if (params[i + 1] === 5) { i += 2; p = params[i] & 0xff; - attr.fg &= ~Attributes.PCOLOR_MASK; + attr.fg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK); attr.fg |= Attributes.CM_P256 | p; } } else if (p === 48) { - // bg color 256 + // bg color 256 and RGB if (params[i + 1] === 2) { i += 2; attr.bg |= Attributes.CM_RGB; @@ -1717,7 +1717,7 @@ export class InputHandler extends Disposable implements IInputHandler { } else if (params[i + 1] === 5) { i += 2; p = params[i] & 0xff; - attr.bg &= ~Attributes.PCOLOR_MASK; + attr.bg &= ~(Attributes.CM_MASK | Attributes.PCOLOR_MASK); attr.bg |= Attributes.CM_P256 | p; } } else if (p === 100) {