diff --git a/src/xterm.js b/src/xterm.js index b17437cc..f07dcc75 100644 --- a/src/xterm.js +++ b/src/xterm.js @@ -2607,7 +2607,8 @@ , el , i , j - , ch; + , ch + , addToY; if (x === this.cols && y === this.rows) { return; @@ -2639,11 +2640,23 @@ // resize rows j = this.rows; + addToY = 0; if (j < y) { el = this.element; while (j++ < y) { + // y is rows, not this.y if (this.lines.length < y + this.ybase) { - this.lines.push(this.blankLine()); + if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) { + // There is room above the buffer and there are no empty elements below the line, + // scroll up + this.ybase--; + this.ydisp--; + addToY++ + } else { + // Add a blank line if there is no buffer left at the top to scroll to, or if there + // are blank lines after the cursor + this.lines.push(this.blankLine()); + } } if (this.children.length < y) { this.insertRow(); @@ -2652,11 +2665,11 @@ } else { // (j > y) while (j-- > y) { if (this.lines.length > y + this.ybase) { - if (this.y + this.ybase < j) { - // The line is after the cursor, remove it + if (this.lines.length > this.ybase + this.y + 1) { + // The line is a blank line below the cursor, remove it this.lines.pop(); } else { - // The line is the cursor, push the viewport down + // The line is the cursor, scroll down this.ybase++; this.ydisp++; } @@ -2676,6 +2689,9 @@ if (this.y >= y) { this.y = y - 1; } + if (addToY) { + this.y += addToY; + } if (this.x >= x) { this.x = x - 1;