diff --git a/src/xterm.js b/src/xterm.js index 51357afb..497f0a77 100644 --- a/src/xterm.js +++ b/src/xterm.js @@ -252,7 +252,7 @@ this.applicationCursor = false; this.originMode = false; this.insertMode = false; - this.wraparoundMode = false; + this.wraparoundMode = true; // defaults: xterm - true, vt100 - false this.normal = null; // charset @@ -1464,7 +1464,7 @@ * @public */ Terminal.prototype.write = function(data) { - var l = data.length, i = 0, j, cs, ch, code, low, ch_width; + var l = data.length, i = 0, j, cs, ch, code, low, ch_width, row; this.refreshStart = this.y; this.refreshEnd = this.y; @@ -1566,20 +1566,22 @@ ch = this.charset[ch]; } + row = this.y + this.ybase; + // insert combining char in last cell // FIXME: needs handling after cursor jumps if (!ch_width && this.x) { // dont overflow left - if (this.lines[this.y + this.ybase][this.x-1]) { - if (!this.lines[this.y + this.ybase][this.x-1][2]) { + if (this.lines[row][this.x-1]) { + if (!this.lines[row][this.x-1][2]) { // found empty cell after fullwidth, need to go 2 cells back - if (this.lines[this.y + this.ybase][this.x-2]) - this.lines[this.y + this.ybase][this.x-2][1] += ch; + if (this.lines[row][this.x-2]) + this.lines[row][this.x-2][1] += ch; } else { - this.lines[this.y + this.ybase][this.x-1][1] += ch; + this.lines[row][this.x-1][1] += ch; } this.updateRange(this.y); } @@ -1589,21 +1591,46 @@ // goto next line if ch would overflow // TODO: needs a global min terminal width of 2 if (this.x+ch_width-1 >= this.cols) { - this.x = 0; - this.y++; - if (this.y > this.scrollBottom) { - this.y--; - this.scroll(); + // autowrap - DECAWM + if (this.wraparoundMode) { + this.x = 0; + this.y++; + if (this.y > this.scrollBottom) { + this.y--; + this.scroll(); + } + } else { + this.x = this.cols-1; + if(ch_width===2) // FIXME: check for xterm behavior + continue; + } + } + row = this.y + this.ybase; + + // insert mode: move characters to right + if (this.insertMode) { + // do this twice for a fullwidth char + for (var moves=0; moves