diff options
-rw-r--r-- | util/Flushable.js | 12 | ||||
-rw-r--r-- | util/ansi.js | 19 |
2 files changed, 21 insertions, 10 deletions
diff --git a/util/Flushable.js b/util/Flushable.js index 78bf5c5..c852421 100644 --- a/util/Flushable.js +++ b/util/Flushable.js @@ -86,13 +86,13 @@ module.exports = class Flushable { compress(toWrite) { // TODO: customize screen size - let { newChars, lastChar, screen } = ansi.interpret( - toWrite, this.screenLines, this.screenCols, - this.lastFrameChars, this.lastFrameLastChar + const output = ansi.interpret( + toWrite, this.screenLines, this.screenCols, this.lastFrame ) - this.lastFrameChars = newChars - this.lastFrameLastChar = lastChar + let { screen } = output + + this.lastFrame = output if (this.shouldShowCompressionStatistics) { const pcSaved = Math.round(100 - (100 / toWrite.length * screen.length)) @@ -100,7 +100,7 @@ module.exports = class Flushable { '\x1b[H\x1b[0m(ANSI-interpret: ' + `${toWrite.length} -> ${screen.length} ${pcSaved}% saved) ` ) - this.lastFrameLastChar.attributes = [] + this.lastFrame.oldLastChar.attributes = [] } return screen diff --git a/util/ansi.js b/util/ansi.js index cfe7b1f..a303cd6 100644 --- a/util/ansi.js +++ b/util/ansi.js @@ -119,7 +119,10 @@ const ansi = { }, - interpret(text, scrRows, scrCols, oldChars = null, lastChar = null) { + interpret(text, scrRows, scrCols, { + oldChars = null, oldLastChar = null, + oldCursorRow = 0, oldCursorCol = 0 + } = {}) { // Interprets the given ansi code, more or less. const blank = { @@ -360,7 +363,7 @@ const ansi = { // Character concatenation ----------- - lastChar = lastChar || { + let lastChar = oldLastChar || { char: '', attributes: [] } @@ -397,9 +400,17 @@ const ansi = { } } + // If anything changed *or* the cursor moved, we need to put it back where + // it was before: + if (result.length || cursorCol !== oldCursorCol || cursorRow !== oldCursorRow) { + result.push(ansi.moveCursor(cursorRow, cursorCol)) + } + return { - newChars: newChars.slice(), - lastChar: Object.assign({}, lastChar), + oldChars: newChars.slice(), + oldCursorRow: cursorRow, + oldCursorCol: cursorCol, + oldLastChar: Object.assign({}, lastChar), screen: result.join('') } } |