diff --git a/src/Buffer.ts b/src/Buffer.ts index 93af3c46..12b2137d 100644 --- a/src/Buffer.ts +++ b/src/Buffer.ts @@ -15,6 +15,9 @@ import { CircularList } from './utils/CircularList'; export class Buffer { public lines: CircularList<[number, string, number][]>; + public savedY: number; + public savedX: number; + /** * Create a new Buffer. * @param {Terminal} terminal - The terminal the Buffer will belong to diff --git a/src/InputHandler.test.ts b/src/InputHandler.test.ts index 9112c13a..158c07c9 100644 --- a/src/InputHandler.test.ts +++ b/src/InputHandler.test.ts @@ -3,6 +3,21 @@ import { InputHandler } from './InputHandler'; import { wcwidth } from './InputHandler'; describe('InputHandler', () => { + describe('save and restore cursor', () => { + let terminal = { buffer: { x: 1, y: 2 } }; + let inputHandler = new InputHandler(terminal); + // Save cursor position + inputHandler.saveCursor([]); + assert.equal(terminal.buffer.x, 1); + assert.equal(terminal.buffer.y, 2); + // Change cursor position + terminal.buffer.x = 10; + terminal.buffer.y = 20; + // Restore cursor position + inputHandler.restoreCursor([]); + assert.equal(terminal.buffer.x, 1); + assert.equal(terminal.buffer.y, 2); + }); describe('setCursorStyle', () => { it('should call Terminal.setOption with correct params', () => { let options = {}; diff --git a/src/InputHandler.ts b/src/InputHandler.ts index 449a9399..64da3b3f 100644 --- a/src/InputHandler.ts +++ b/src/InputHandler.ts @@ -948,7 +948,8 @@ export class InputHandler implements IInputHandler { this._terminal.cursorHidden = false; break; case 1049: // alt screen buffer cursor - this.saveCursor(params); + // TODO: Not sure if we need to save/restore after switching the buffer + // this.saveCursor(params); // FALL-THROUGH case 47: // alt screen buffer case 1047: // alt screen buffer @@ -1118,9 +1119,10 @@ export class InputHandler implements IInputHandler { case 1047: // normal screen buffer - clearing it first // Ensure the selection manager has the correct buffer this._terminal.buffers.activateNormalBuffer(); - if (params[0] === 1049) { - this.restoreCursor(params); - } + // TODO: Not sure if we need to save/restore after switching the buffer + // if (params[0] === 1049) { + // this.restoreCursor(params); + // } this._terminal.selectionManager.setBuffer(this._terminal.buffer.lines); this._terminal.refresh(0, this._terminal.rows - 1); this._terminal.viewport.syncScrollArea(); @@ -1453,8 +1455,8 @@ export class InputHandler implements IInputHandler { * Save cursor (ANSI.SYS). */ public saveCursor(params: number[]): void { - this._terminal.buffers.active.x = this._terminal.buffer.x; - this._terminal.buffers.active.y = this._terminal.buffer.y; + this._terminal.buffer.savedX = this._terminal.buffer.x; + this._terminal.buffer.savedY = this._terminal.buffer.y; } @@ -1463,8 +1465,8 @@ export class InputHandler implements IInputHandler { * Restore cursor (ANSI.SYS). */ public restoreCursor(params: number[]): void { - this._terminal.buffer.x = this._terminal.buffers.active.x || 0; - this._terminal.buffer.y = this._terminal.buffers.active.y || 0; + this._terminal.buffer.x = this._terminal.buffer.savedX || 0; + this._terminal.buffer.y = this._terminal.buffer.savedY || 0; } } diff --git a/src/Parser.ts b/src/Parser.ts index 6679e366..1c2fb6b0 100644 --- a/src/Parser.ts +++ b/src/Parser.ts @@ -184,6 +184,10 @@ export class Parser { public parse(data: string): ParserState { let l = data.length, j, cs, ch, code, low; + if (this._terminal.debug) { + this._terminal.log('data: ' + data); + } + this._position = 0; // apply leftover surrogate high from last write if (this._terminal.surrogate_high) { @@ -458,6 +462,9 @@ export class Parser { case ParserState.CSI: if (ch in csiStateHandler) { + if (this._terminal.debug) { + this._terminal.log(`CSI ${this._terminal.prefix ? this._terminal.prefix : ''} ${this._terminal.params ? this._terminal.params.join(';') : ''} ${this._terminal.postfix ? this._terminal.postfix : ''} ${ch}`); + } csiStateHandler[ch](this._inputHandler, this._terminal.params, this._terminal.prefix, this._terminal.postfix, this); } else { this._terminal.error('Unknown CSI code: %s.', ch);