diff --git a/src/public/Terminal.ts b/src/public/Terminal.ts index a4d841b4..216bc147 100644 --- a/src/public/Terminal.ts +++ b/src/public/Terminal.ts @@ -195,6 +195,12 @@ export class Terminal implements ITerminalApi { class BufferApiView implements IBufferApi { constructor(private _buffer: IBuffer, private _buffers: IBufferSet) { } + init(buffer: IBuffer, buffers: IBufferSet): BufferApiView { + this._buffer = buffer; + this._buffers = buffers; + return this; + } + public get type(): 'normal' | 'alternate' { if (this._buffers.normal === this._buffer) { return 'normal'; } else if (this._buffers.alt === this._buffer) { return 'alternate'; } @@ -216,17 +222,25 @@ class BufferApiView implements IBufferApi { } class BufferNamespaceApi implements IBufferNamespaceApi { - constructor(private _buffers: IBufferSet) { } + private _normal: BufferApiView; + private _alternate: BufferApiView; - public get alternate(): IBufferApi { return new BufferApiView(this._buffers.alt, this._buffers); } - public get active(): IBufferApi { return new BufferApiView(this._buffers.active, this._buffers); } - public get normal(): IBufferApi { return new BufferApiView(this._buffers.normal, this._buffers); } + constructor(private _buffers: IBufferSet) { + this._normal = new BufferApiView(this._buffers.normal, this._buffers); + this._alternate = new BufferApiView(this._buffers.alt, this._buffers); + } + + public get active(): IBufferApi { + if (this._buffers.active === this._buffers.normal) { return this.normal; } + else if (this._buffers.active === this._buffers.alt) { return this.alternate; } + throw new Error('Active Buffer is neither normal nor alternate'); + } + public get normal(): IBufferApi { return this._normal.init(this._buffers.normal, this._buffers); } + public get alternate(): IBufferApi { return this._alternate.init(this._buffers.alt, this._buffers); } public get onBufferChange(): IEvent { return (listener: (buffer: IBufferApi, unused: void) => any): IDisposable => { - return this._buffers.onBufferActivate((arg1: { activeBuffer: IBuffer, inactiveBuffer: IBuffer }) => { - listener(new BufferApiView(arg1.activeBuffer, this._buffers)); - }); + return this._buffers.onBufferActivate(() => listener(this.active)); }; } } diff --git a/test/api/Terminal.api.ts b/test/api/Terminal.api.ts index 2798f653..9f16bfcd 100644 --- a/test/api/Terminal.api.ts +++ b/test/api/Terminal.api.ts @@ -509,6 +509,38 @@ describe('API Integration Tests', function(): void { assert.equal(await page.evaluate(`window.term.buffer.active.getLine(0).getCell(2).getWidth()`), 0); }); }); + + it('active, normal, alternate', async () => { + await openTerminal(page, { cols: 5 }); + assert.equal(await page.evaluate(`window.term.buffer.active.type`), 'normal'); + assert.equal(await page.evaluate(`window.term.buffer.normal.type`), 'normal'); + assert.equal(await page.evaluate(`window.term.buffer.alternate.type`), 'alternate'); + + await writeSync(page, 'norm '); + assert.equal(await page.evaluate(`window.term.buffer.active.getLine(0).translateToString()`), 'norm '); + assert.equal(await page.evaluate(`window.term.buffer.normal.getLine(0).translateToString()`), 'norm '); + assert.equal(await page.evaluate(`window.term.buffer.alternate.getLine(0)`), undefined); + + await writeSync(page, '\\x1b[?47h\\r'); // use alternate screen buffer + assert.equal(await page.evaluate(`window.term.buffer.active.type`), 'alternate'); + assert.equal(await page.evaluate(`window.term.buffer.normal.type`), 'normal'); + assert.equal(await page.evaluate(`window.term.buffer.alternate.type`), 'alternate'); + + assert.equal(await page.evaluate(`window.term.buffer.active.getLine(0).translateToString()`), ' '); + await writeSync(page, 'alt '); + assert.equal(await page.evaluate(`window.term.buffer.active.getLine(0).translateToString()`), 'alt '); + assert.equal(await page.evaluate(`window.term.buffer.normal.getLine(0).translateToString()`), 'norm '); + assert.equal(await page.evaluate(`window.term.buffer.alternate.getLine(0).translateToString()`), 'alt '); + + await writeSync(page, '\\x1b[?47l\\r'); // use normal screen buffer + assert.equal(await page.evaluate(`window.term.buffer.active.type`), 'normal'); + assert.equal(await page.evaluate(`window.term.buffer.normal.type`), 'normal'); + assert.equal(await page.evaluate(`window.term.buffer.alternate.type`), 'alternate'); + + assert.equal(await page.evaluate(`window.term.buffer.active.getLine(0).translateToString()`), 'norm '); + assert.equal(await page.evaluate(`window.term.buffer.normal.getLine(0).translateToString()`), 'norm '); + assert.equal(await page.evaluate(`window.term.buffer.alternate.getLine(0)`), undefined); + }) }); it('dispose', async () => {