From 3b35d12e603842361fd08a77dcac2646a24af34c Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 22 Dec 2016 02:02:03 -0800 Subject: [PATCH] Fix issue with the git log The old code was assuming that the buffer was not going to change, this is not true with the current impl though where the list is shifted and ybase and ydisp need to be compensated for that. --- src/utils/CircularList.ts | 11 ++++++++++ src/xterm.js | 46 ++++++++++++++++++++++++++++++--------- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/utils/CircularList.ts b/src/utils/CircularList.ts index a131bcb..699de65 100644 --- a/src/utils/CircularList.ts +++ b/src/utils/CircularList.ts @@ -84,12 +84,16 @@ export class CircularList { this._array[this._getCyclicIndex(this._length)] = value; if (this._length === this.maxLength) { this._startIndex++; + if (this._startIndex === this.maxLength) { + this._startIndex = 0; + } } else { this._length++; } } public pop(): T { + // TODO: This isn't popping from the array, only returning return this._array[this._getCyclicIndex(this._length-- - 1)]; } @@ -118,6 +122,13 @@ export class CircularList { } } + public trimStart(count: number): void { + // TODO: Error handling + // TODO: Testing (if we need this) + this._startIndex += count; + this._length--; + } + private _getCyclicIndex(index: number): number { return (this._startIndex + index) % this.maxLength; } diff --git a/src/xterm.js b/src/xterm.js index f07fb4e..dbf03ea 100644 --- a/src/xterm.js +++ b/src/xterm.js @@ -1238,6 +1238,7 @@ Terminal.prototype.scroll = function() { this.ybase++; } + // TODO: Why is this done twice? if (!this.userScrolling) { this.ydisp = this.ybase; } @@ -3164,21 +3165,30 @@ Terminal.prototype.index = function() { /** * ESC M Reverse Index (RI is 0x8d). + * + * Move the cursor up one row, inserting a new blank line if necessary. */ Terminal.prototype.reverseIndex = function() { var j; - this.y--; - if (this.y < this.scrollTop) { - this.y++; + if (this.y === this.scrollTop) { // possibly move the code below to term.reverseScroll(); // test: echo -ne '\e[1;1H\e[44m\eM\e[0m' // blankLine(true) is xterm/linux behavior + if (this.lines.length === this.lines.maxLength) { + // Trim the start of lines to make room for the new temporary row + // TODO: This section could be optimized by introducing a CircularList function that inserts, + // deletes and shifts elements to accomplish this task. + this.lines.trimStart(1); + this.ybase -= 1; + this.ydisp -= 1; + } this.lines.splice(this.y + this.ybase, 0, this.blankLine(true)); j = this.rows - 1 - this.scrollBottom; this.lines.splice(this.rows - 1 + this.ybase - j + 1, 1); - // this.maxRange(); this.updateRange(this.scrollTop); this.updateRange(this.scrollBottom); + } else { + this.y--; } this.state = normal; }; @@ -3695,6 +3705,14 @@ Terminal.prototype.insertLines = function(params) { j = this.rows - 1 + this.ybase - j + 1; while (param--) { + if (this.lines.length === this.lines.maxLength) { + // Trim the start of lines to make room for the new temporary row + // TODO: This section could be optimized by introducing a CircularList function that inserts, + // deletes and shifts elements to accomplish this task. + this.lines.trimStart(1); + this.ybase -= 1; + this.ydisp -= 1; + } // test: echo -e '\e[44m\e[1L\e[0m' // blankLine(true) - xterm/linux behavior this.lines.splice(row, 0, this.blankLine(true)); @@ -3722,6 +3740,14 @@ Terminal.prototype.deleteLines = function(params) { j = this.rows - 1 + this.ybase - j; while (param--) { + if (this.lines.length === this.lines.maxLength) { + // Trim the start of lines to make room for the new temporary row + // TODO: This section could be optimized by introducing a CircularList function that inserts, + // deletes and shifts elements to accomplish this task. + this.lines.trimStart(1); + this.ybase -= 1; + this.ydisp -= 1; + } // test: echo -e '\e[44m\e[1M\e[0m' // blankLine(true) - xterm/linux behavior this.lines.splice(j + 1, 0, this.blankLine(true)); @@ -3748,8 +3774,8 @@ Terminal.prototype.deleteChars = function(params) { ch = [this.eraseAttr(), ' ', 1]; // xterm while (param--) { - this.lines[row].splice(this.x, 1); - this.lines[row].push(ch); + this.lines.get(row).splice(this.x, 1); + this.lines.get(row).push(ch); } }; @@ -4774,8 +4800,8 @@ Terminal.prototype.insertColumns = function() { while (param--) { for (i = this.ybase; i < l; i++) { - this.lines[i].splice(this.x + 1, 0, ch); - this.lines[i].pop(); + this.lines.get(i).splice(this.x + 1, 0, ch); + this.lines.get(i).pop(); } } @@ -4796,8 +4822,8 @@ Terminal.prototype.deleteColumns = function() { while (param--) { for (i = this.ybase; i < l; i++) { - this.lines[i].splice(this.x, 1); - this.lines[i].push(ch); + this.lines.get(i).splice(this.x, 1); + this.lines.get(i).push(ch); } }