mirror of
https://github.com/nuintun/command-manager.git
synced 2025-10-20 09:51:31 +08:00
update files
This commit is contained in:
243
bin/terminal/lib/csi/charAttributes.js
Normal file
243
bin/terminal/lib/csi/charAttributes.js
Normal file
@@ -0,0 +1,243 @@
|
||||
/**
|
||||
* Created by nuintun on 2015/11/24.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function (Terminal){
|
||||
/**
|
||||
* matchColor
|
||||
* @param r1
|
||||
* @param g1
|
||||
* @param b1
|
||||
* @returns {*}
|
||||
*/
|
||||
function matchColor(r1, g1, b1){
|
||||
var hash = (r1 << 16) | (g1 << 8) | b1;
|
||||
|
||||
if (matchColor._cache.hasOwnProperty(hash + '')) {
|
||||
return matchColor._cache[hash];
|
||||
}
|
||||
|
||||
var i = 0;
|
||||
var li = -1;
|
||||
var ldiff = Infinity;
|
||||
var c, r2, g2, b2, diff;
|
||||
|
||||
for (; i < Terminal.vcolors.length; i++) {
|
||||
c = Terminal.vcolors[i];
|
||||
r2 = c[0];
|
||||
g2 = c[1];
|
||||
b2 = c[2];
|
||||
|
||||
diff = matchColor.distance(r1, g1, b1, r2, g2, b2);
|
||||
|
||||
if (diff === 0) {
|
||||
li = i;
|
||||
break;
|
||||
}
|
||||
|
||||
if (diff < ldiff) {
|
||||
ldiff = diff;
|
||||
li = i;
|
||||
}
|
||||
}
|
||||
|
||||
return matchColor._cache[hash] = li;
|
||||
}
|
||||
|
||||
matchColor._cache = {};
|
||||
|
||||
// http://stackoverflow.com/questions/1633828
|
||||
matchColor.distance = function (r1, g1, b1, r2, g2, b2){
|
||||
return Math.pow(30 * (r1 - r2), 2)
|
||||
+ Math.pow(59 * (g1 - g2), 2)
|
||||
+ Math.pow(11 * (b1 - b2), 2);
|
||||
};
|
||||
|
||||
// CSI Pm m Character Attributes (SGR).
|
||||
// Ps = 0 -> Normal (default).
|
||||
// Ps = 1 -> Bold.
|
||||
// Ps = 4 -> Underlined.
|
||||
// Ps = 5 -> Blink (appears as Bold).
|
||||
// Ps = 7 -> Inverse.
|
||||
// Ps = 8 -> Invisible, i.e., hidden (VT300).
|
||||
// Ps = 2 2 -> Normal (neither bold nor faint).
|
||||
// Ps = 2 4 -> Not underlined.
|
||||
// Ps = 2 5 -> Steady (not blinking).
|
||||
// Ps = 2 7 -> Positive (not inverse).
|
||||
// Ps = 2 8 -> Visible, i.e., not hidden (VT300).
|
||||
// Ps = 3 0 -> Set foreground color to Black.
|
||||
// Ps = 3 1 -> Set foreground color to Red.
|
||||
// Ps = 3 2 -> Set foreground color to Green.
|
||||
// Ps = 3 3 -> Set foreground color to Yellow.
|
||||
// Ps = 3 4 -> Set foreground color to Blue.
|
||||
// Ps = 3 5 -> Set foreground color to Magenta.
|
||||
// Ps = 3 6 -> Set foreground color to Cyan.
|
||||
// Ps = 3 7 -> Set foreground color to White.
|
||||
// Ps = 3 9 -> Set foreground color to default (original).
|
||||
// Ps = 4 0 -> Set background color to Black.
|
||||
// Ps = 4 1 -> Set background color to Red.
|
||||
// Ps = 4 2 -> Set background color to Green.
|
||||
// Ps = 4 3 -> Set background color to Yellow.
|
||||
// Ps = 4 4 -> Set background color to Blue.
|
||||
// Ps = 4 5 -> Set background color to Magenta.
|
||||
// Ps = 4 6 -> Set background color to Cyan.
|
||||
// Ps = 4 7 -> Set background color to White.
|
||||
// Ps = 4 9 -> Set background color to default (original).
|
||||
|
||||
// If 16-color support is compiled, the following apply. Assume
|
||||
// that xterm's resources are set so that the ISO color codes are
|
||||
// the first 8 of a set of 16. Then the aixterm colors are the
|
||||
// bright versions of the ISO colors:
|
||||
// Ps = 9 0 -> Set foreground color to Black.
|
||||
// Ps = 9 1 -> Set foreground color to Red.
|
||||
// Ps = 9 2 -> Set foreground color to Green.
|
||||
// Ps = 9 3 -> Set foreground color to Yellow.
|
||||
// Ps = 9 4 -> Set foreground color to Blue.
|
||||
// Ps = 9 5 -> Set foreground color to Magenta.
|
||||
// Ps = 9 6 -> Set foreground color to Cyan.
|
||||
// Ps = 9 7 -> Set foreground color to White.
|
||||
// Ps = 1 0 0 -> Set background color to Black.
|
||||
// Ps = 1 0 1 -> Set background color to Red.
|
||||
// Ps = 1 0 2 -> Set background color to Green.
|
||||
// Ps = 1 0 3 -> Set background color to Yellow.
|
||||
// Ps = 1 0 4 -> Set background color to Blue.
|
||||
// Ps = 1 0 5 -> Set background color to Magenta.
|
||||
// Ps = 1 0 6 -> Set background color to Cyan.
|
||||
// Ps = 1 0 7 -> Set background color to White.
|
||||
|
||||
// If xterm is compiled with the 16-color support disabled, it
|
||||
// supports the following, from rxvt:
|
||||
// Ps = 1 0 0 -> Set foreground and background color to
|
||||
// default.
|
||||
|
||||
// If 88- or 256-color support is compiled, the following apply.
|
||||
// Ps = 3 8 ; 5 ; Ps -> Set foreground color to the second
|
||||
// Ps.
|
||||
// Ps = 4 8 ; 5 ; Ps -> Set background color to the second
|
||||
// Ps.
|
||||
Terminal.prototype.charAttributes = function (params){
|
||||
// Optimize a single SGR0.
|
||||
if (params.length === 1 && params[0] === 0) {
|
||||
this.curAttr = this.defAttr;
|
||||
return;
|
||||
}
|
||||
|
||||
var p;
|
||||
var i = 0;
|
||||
var l = params.length;
|
||||
var flags = this.curAttr >> 18;
|
||||
var fg = (this.curAttr >> 9) & 0x1ff;
|
||||
var bg = this.curAttr & 0x1ff;
|
||||
|
||||
for (; i < l; i++) {
|
||||
p = params[i];
|
||||
|
||||
if (p >= 30 && p <= 37) {
|
||||
// fg color 8
|
||||
fg = p - 30;
|
||||
} else if (p >= 40 && p <= 47) {
|
||||
// bg color 8
|
||||
bg = p - 40;
|
||||
} else if (p >= 90 && p <= 97) {
|
||||
// fg color 16
|
||||
p += 8;
|
||||
fg = p - 90;
|
||||
} else if (p >= 100 && p <= 107) {
|
||||
// bg color 16
|
||||
p += 8;
|
||||
bg = p - 100;
|
||||
} else if (p === 0) {
|
||||
// default
|
||||
flags = this.defAttr >> 18;
|
||||
fg = (this.defAttr >> 9) & 0x1ff;
|
||||
bg = this.defAttr & 0x1ff;
|
||||
// flags = 0;
|
||||
// fg = 0x1ff;
|
||||
// bg = 0x1ff;
|
||||
} else if (p === 1) {
|
||||
// bold text
|
||||
flags |= 1;
|
||||
} else if (p === 4) {
|
||||
// underlined text
|
||||
flags |= 2;
|
||||
} else if (p === 5) {
|
||||
// blink
|
||||
flags |= 4;
|
||||
} else if (p === 7) {
|
||||
// inverse and positive
|
||||
// test with: echo -e '\e[31m\e[42mhello\e[7mworld\e[27mhi\e[m'
|
||||
flags |= 8;
|
||||
} else if (p === 8) {
|
||||
// invisible
|
||||
flags |= 16;
|
||||
} else if (p === 22) {
|
||||
// not bold
|
||||
flags &= ~1;
|
||||
} else if (p === 24) {
|
||||
// not underlined
|
||||
flags &= ~2;
|
||||
} else if (p === 25) {
|
||||
// not blink
|
||||
flags &= ~4;
|
||||
} else if (p === 27) {
|
||||
// not inverse
|
||||
flags &= ~8;
|
||||
} else if (p === 28) {
|
||||
// not invisible
|
||||
flags &= ~16;
|
||||
} else if (p === 39) {
|
||||
// reset fg
|
||||
fg = (this.defAttr >> 9) & 0x1ff;
|
||||
} else if (p === 49) {
|
||||
// reset bg
|
||||
bg = this.defAttr & 0x1ff;
|
||||
} else if (p === 38) {
|
||||
// fg color 256
|
||||
if (params[i + 1] === 2) {
|
||||
i += 2;
|
||||
|
||||
fg = matchColor(
|
||||
params[i] & 0xff,
|
||||
params[i + 1] & 0xff,
|
||||
params[i + 2] & 0xff);
|
||||
|
||||
if (fg === -1) fg = 0x1ff;
|
||||
|
||||
i += 2;
|
||||
} else if (params[i + 1] === 5) {
|
||||
i += 2;
|
||||
p = params[i] & 0xff;
|
||||
fg = p;
|
||||
}
|
||||
} else if (p === 48) {
|
||||
// bg color 256
|
||||
if (params[i + 1] === 2) {
|
||||
i += 2;
|
||||
|
||||
bg = matchColor(
|
||||
params[i] & 0xff,
|
||||
params[i + 1] & 0xff,
|
||||
params[i + 2] & 0xff);
|
||||
|
||||
if (bg === -1) bg = 0x1ff;
|
||||
|
||||
i += 2;
|
||||
} else if (params[i + 1] === 5) {
|
||||
i += 2;
|
||||
p = params[i] & 0xff;
|
||||
bg = p;
|
||||
}
|
||||
} else if (p === 100) {
|
||||
// reset fg/bg
|
||||
fg = (this.defAttr >> 9) & 0x1ff;
|
||||
bg = this.defAttr & 0x1ff;
|
||||
} else {
|
||||
this.error('Unknown SGR attribute: %d.', p);
|
||||
}
|
||||
}
|
||||
|
||||
this.curAttr = (flags << 18) | (fg << 9) | bg;
|
||||
};
|
||||
};
|
163
bin/terminal/lib/csi/cursor.js
Normal file
163
bin/terminal/lib/csi/cursor.js
Normal file
@@ -0,0 +1,163 @@
|
||||
/**
|
||||
* Created by nuintun on 2015/11/24.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function (Terminal){
|
||||
// CSI s
|
||||
// Save cursor (ANSI.SYS).
|
||||
Terminal.prototype.saveCursor = function (){
|
||||
this.savedX = this.x;
|
||||
this.savedY = this.y;
|
||||
};
|
||||
|
||||
// CSI u
|
||||
// Restore cursor (ANSI.SYS).
|
||||
Terminal.prototype.restoreCursor = function (){
|
||||
this.x = this.savedX || 0;
|
||||
this.y = this.savedY || 0;
|
||||
};
|
||||
|
||||
// CSI Ps A
|
||||
// Cursor Up Ps Times (default = 1) (CUU).
|
||||
Terminal.prototype.cursorUp = function (params){
|
||||
var param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
this.y -= param;
|
||||
|
||||
if (this.y < 0) this.y = 0;
|
||||
};
|
||||
|
||||
// CSI Ps B
|
||||
// Cursor Down Ps Times (default = 1) (CUD).
|
||||
Terminal.prototype.cursorDown = function (params){
|
||||
var param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
this.y += param;
|
||||
|
||||
if (this.y >= this.rows) {
|
||||
this.y = this.rows - 1;
|
||||
}
|
||||
};
|
||||
|
||||
// CSI Ps C
|
||||
// Cursor Forward Ps Times (default = 1) (CUF).
|
||||
Terminal.prototype.cursorForward = function (params){
|
||||
var param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
this.x += param;
|
||||
|
||||
if (this.x >= this.cols) {
|
||||
this.x = this.cols - 1;
|
||||
}
|
||||
};
|
||||
|
||||
// CSI Ps D
|
||||
// Cursor Backward Ps Times (default = 1) (CUB).
|
||||
Terminal.prototype.cursorBackward = function (params){
|
||||
var param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
this.x -= param;
|
||||
|
||||
if (this.x < 0) this.x = 0;
|
||||
};
|
||||
|
||||
// CSI Ps ; Ps H
|
||||
// Cursor Position [row;column] (default = [1,1]) (CUP).
|
||||
Terminal.prototype.cursorPos = function (params){
|
||||
var row, col;
|
||||
|
||||
row = params[0] - 1;
|
||||
|
||||
if (params.length >= 2) {
|
||||
col = params[1] - 1;
|
||||
} else {
|
||||
col = 0;
|
||||
}
|
||||
|
||||
if (row < 0) {
|
||||
row = 0;
|
||||
} else if (row >= this.rows) {
|
||||
row = this.rows - 1;
|
||||
}
|
||||
|
||||
if (col < 0) {
|
||||
col = 0;
|
||||
} else if (col >= this.cols) {
|
||||
col = this.cols - 1;
|
||||
}
|
||||
|
||||
this.x = col;
|
||||
this.y = row;
|
||||
};
|
||||
|
||||
// CSI Ps E
|
||||
// Cursor Next Line Ps Times (default = 1) (CNL).
|
||||
// same as CSI Ps B ?
|
||||
Terminal.prototype.cursorNextLine = function (params){
|
||||
var param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
this.y += param;
|
||||
|
||||
if (this.y >= this.rows) {
|
||||
this.y = this.rows - 1;
|
||||
}
|
||||
|
||||
this.x = 0;
|
||||
};
|
||||
|
||||
// CSI Ps F
|
||||
// Cursor Preceding Line Ps Times (default = 1) (CNL).
|
||||
// reuse CSI Ps A ?
|
||||
Terminal.prototype.cursorPrecedingLine = function (params){
|
||||
var param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
this.y -= param;
|
||||
|
||||
if (this.y < 0) this.y = 0;
|
||||
|
||||
this.x = 0;
|
||||
};
|
||||
|
||||
// CSI Ps G
|
||||
// Cursor Character Absolute [column] (default = [row,1]) (CHA).
|
||||
Terminal.prototype.cursorCharAbsolute = function (params){
|
||||
var param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
this.x = param - 1;
|
||||
};
|
||||
|
||||
// CSI Ps I
|
||||
// Cursor Forward Tabulation Ps tab stops (default = 1) (CHT).
|
||||
Terminal.prototype.cursorForwardTab = function (params){
|
||||
var param = params[0] || 1;
|
||||
|
||||
while (param--) {
|
||||
this.x = this.nextStop();
|
||||
}
|
||||
};
|
||||
|
||||
// CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT).
|
||||
Terminal.prototype.cursorBackwardTab = function (params){
|
||||
var param = params[0] || 1;
|
||||
|
||||
while (param--) {
|
||||
this.x = this.prevStop();
|
||||
}
|
||||
};
|
||||
};
|
141
bin/terminal/lib/csi/device.js
Normal file
141
bin/terminal/lib/csi/device.js
Normal file
@@ -0,0 +1,141 @@
|
||||
/**
|
||||
* Created by nuintun on 2015/11/25.
|
||||
*/
|
||||
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function (Terminal){
|
||||
// CSI Ps n Device Status Report (DSR).
|
||||
// Ps = 5 -> Status Report. Result (``OK'') is
|
||||
// CSI 0 n
|
||||
// Ps = 6 -> Report Cursor Position (CPR) [row;column].
|
||||
// Result is
|
||||
// CSI r ; c R
|
||||
// CSI ? Ps n
|
||||
// Device Status Report (DSR, DEC-specific).
|
||||
// Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI
|
||||
// ? r ; c R (assumes page is zero).
|
||||
// Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready).
|
||||
// or CSI ? 1 1 n (not ready).
|
||||
// Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked)
|
||||
// or CSI ? 2 1 n (locked).
|
||||
// Ps = 2 6 -> Report Keyboard status as
|
||||
// CSI ? 2 7 ; 1 ; 0 ; 0 n (North American).
|
||||
// The last two parameters apply to VT400 & up, and denote key-
|
||||
// board ready and LK01 respectively.
|
||||
// Ps = 5 3 -> Report Locator status as
|
||||
// CSI ? 5 3 n Locator available, if compiled-in, or
|
||||
// CSI ? 5 0 n No Locator, if not.
|
||||
Terminal.prototype.deviceStatus = function (params){
|
||||
if (!this.prefix) {
|
||||
switch (params[0]) {
|
||||
case 5:
|
||||
// status report
|
||||
this.send('\x1b[0n');
|
||||
break;
|
||||
case 6:
|
||||
// cursor position
|
||||
this.send('\x1b['
|
||||
+ (this.y + 1)
|
||||
+ ';'
|
||||
+ (this.x + 1)
|
||||
+ 'R');
|
||||
break;
|
||||
}
|
||||
} else if (this.prefix === '?') {
|
||||
// modern xterm doesnt seem to
|
||||
// respond to any of these except ?6, 6, and 5
|
||||
switch (params[0]) {
|
||||
case 6:
|
||||
// cursor position
|
||||
this.send('\x1b[?'
|
||||
+ (this.y + 1)
|
||||
+ ';'
|
||||
+ (this.x + 1)
|
||||
+ 'R');
|
||||
break;
|
||||
case 15:
|
||||
// no printer
|
||||
// -this.send('\x1b[?11n');
|
||||
break;
|
||||
case 25:
|
||||
// dont support user defined keys
|
||||
// -this.send('\x1b[?21n');
|
||||
break;
|
||||
case 26:
|
||||
// north american keyboard
|
||||
// -this.send('\x1b[?27;1;0;0n');
|
||||
break;
|
||||
case 53:
|
||||
// no dec locator/mouse
|
||||
// -this.send('\x1b[?50n');
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// CSI Ps c Send Device Attributes (Primary DA).
|
||||
// Ps = 0 or omitted -> request attributes from terminal. The
|
||||
// response depends on the decTerminalID resource setting.
|
||||
// -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'')
|
||||
// -> CSI ? 1 ; 0 c (``VT101 with No Options'')
|
||||
// -> CSI ? 6 c (``VT102'')
|
||||
// -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'')
|
||||
// The VT100-style response parameters do not mean anything by
|
||||
// themselves. VT220 parameters do, telling the host what fea-
|
||||
// tures the terminal supports:
|
||||
// Ps = 1 -> 132-columns.
|
||||
// Ps = 2 -> Printer.
|
||||
// Ps = 6 -> Selective erase.
|
||||
// Ps = 8 -> User-defined keys.
|
||||
// Ps = 9 -> National replacement character sets.
|
||||
// Ps = 1 5 -> Technical characters.
|
||||
// Ps = 2 2 -> ANSI color, e.g., VT525.
|
||||
// Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode).
|
||||
// CSI > Ps c
|
||||
// Send Device Attributes (Secondary DA).
|
||||
// Ps = 0 or omitted -> request the terminal's identification
|
||||
// code. The response depends on the decTerminalID resource set-
|
||||
// ting. It should apply only to VT220 and up, but xterm extends
|
||||
// this to VT100.
|
||||
// -> CSI > Pp ; Pv ; Pc c
|
||||
// where Pp denotes the terminal type
|
||||
// Pp = 0 -> ``VT100''.
|
||||
// Pp = 1 -> ``VT220''.
|
||||
// and Pv is the firmware version (for xterm, this was originally
|
||||
// the XFree86 patch number, starting with 95). In a DEC termi-
|
||||
// nal, Pc indicates the ROM cartridge registration number and is
|
||||
// always zero.
|
||||
// More information:
|
||||
// xterm/charproc.c - line 2012, for more information.
|
||||
// vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)
|
||||
Terminal.prototype.sendDeviceAttributes = function (params){
|
||||
if (params[0] > 0) return;
|
||||
|
||||
if (!this.prefix) {
|
||||
if (this.is('xterm')
|
||||
|| this.is('rxvt-unicode')
|
||||
|| this.is('screen')) {
|
||||
this.send('\x1b[?1;2c');
|
||||
} else if (this.is('linux')) {
|
||||
this.send('\x1b[?6c');
|
||||
}
|
||||
} else if (this.prefix === '>') {
|
||||
// xterm and urxvt
|
||||
// seem to spit this
|
||||
// out around ~370 times (?).
|
||||
if (this.is('xterm')) {
|
||||
this.send('\x1b[>0;276;0c');
|
||||
} else if (this.is('rxvt-unicode')) {
|
||||
this.send('\x1b[>85;95;0c');
|
||||
} else if (this.is('linux')) {
|
||||
// not supported by linux console.
|
||||
// linux console echoes parameters.
|
||||
this.send(params[0] + 'c');
|
||||
} else if (this.is('screen')) {
|
||||
this.send('\x1b[>83;40003;0c');
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
73
bin/terminal/lib/csi/erase.js
Normal file
73
bin/terminal/lib/csi/erase.js
Normal file
@@ -0,0 +1,73 @@
|
||||
/**
|
||||
* Created by nuintun on 2015/11/24.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function (Terminal){
|
||||
// CSI Ps J Erase in Display (ED).
|
||||
// Ps = 0 -> Erase Below (default).
|
||||
// Ps = 1 -> Erase Above.
|
||||
// Ps = 2 -> Erase All.
|
||||
// Ps = 3 -> Erase Saved Lines (xterm).
|
||||
// CSI ? Ps J
|
||||
// Erase in Display (DECSED).
|
||||
// Ps = 0 -> Selective Erase Below (default).
|
||||
// Ps = 1 -> Selective Erase Above.
|
||||
// Ps = 2 -> Selective Erase All.
|
||||
Terminal.prototype.eraseInDisplay = function (params){
|
||||
var j;
|
||||
|
||||
switch (params[0]) {
|
||||
case 0:
|
||||
this.eraseRight(this.x, this.y);
|
||||
|
||||
j = this.y + 1;
|
||||
|
||||
for (; j < this.rows; j++) {
|
||||
this.eraseLine(j);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
this.eraseLeft(this.x, this.y);
|
||||
|
||||
j = this.y;
|
||||
|
||||
while (j--) {
|
||||
this.eraseLine(j);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
j = this.rows;
|
||||
|
||||
while (j--) this.eraseLine(j);
|
||||
break;
|
||||
case 3:
|
||||
// no saved lines
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
// CSI Ps K Erase in Line (EL).
|
||||
// Ps = 0 -> Erase to Right (default).
|
||||
// Ps = 1 -> Erase to Left.
|
||||
// Ps = 2 -> Erase All.
|
||||
// CSI ? Ps K
|
||||
// Erase in Line (DECSEL).
|
||||
// Ps = 0 -> Selective Erase to Right (default).
|
||||
// Ps = 1 -> Selective Erase to Left.
|
||||
// Ps = 2 -> Selective Erase All.
|
||||
Terminal.prototype.eraseInLine = function (params){
|
||||
switch (params[0]) {
|
||||
case 0:
|
||||
this.eraseRight(this.x, this.y);
|
||||
break;
|
||||
case 1:
|
||||
this.eraseLeft(this.x, this.y);
|
||||
break;
|
||||
case 2:
|
||||
this.eraseLine(this.y);
|
||||
break;
|
||||
}
|
||||
};
|
||||
};
|
150
bin/terminal/lib/csi/insert-delete.js
Normal file
150
bin/terminal/lib/csi/insert-delete.js
Normal file
@@ -0,0 +1,150 @@
|
||||
/**
|
||||
* Created by nuintun on 2015/11/24.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function (Terminal){
|
||||
// CSI Ps @
|
||||
// Insert Ps (Blank) Character(s) (default = 1) (ICH).
|
||||
Terminal.prototype.insertChars = function (params){
|
||||
var param, row, j, ch;
|
||||
|
||||
param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
row = this.y + this.ybase;
|
||||
j = this.x;
|
||||
ch = [this.curAttr, ' ']; // xterm
|
||||
|
||||
while (param-- && j < this.cols) {
|
||||
this.lines[row].splice(j++, 0, ch);
|
||||
this.lines[row].pop();
|
||||
}
|
||||
};
|
||||
|
||||
// CSI Ps L
|
||||
// Insert Ps Line(s) (default = 1) (IL).
|
||||
Terminal.prototype.insertLines = function (params){
|
||||
var param, row, j;
|
||||
|
||||
param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
row = this.y + this.ybase;
|
||||
j = this.rows - 1 - this.scrollBottom;
|
||||
j = this.rows - 1 + this.ybase - j + 1;
|
||||
|
||||
while (param--) {
|
||||
// test: echo -e '\e[44m\e[1L\e[0m'
|
||||
// blankLine(true) - xterm/linux behavior
|
||||
this.lines.splice(row, 0, this.blankLine(true));
|
||||
this.lines.splice(j, 1);
|
||||
}
|
||||
|
||||
// this.maxRange();
|
||||
this.updateRange(this.y);
|
||||
this.updateRange(this.scrollBottom);
|
||||
};
|
||||
|
||||
// CSI Ps M
|
||||
// Delete Ps Line(s) (default = 1) (DL).
|
||||
Terminal.prototype.deleteLines = function (params){
|
||||
var param, row, j;
|
||||
|
||||
param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
row = this.y + this.ybase;
|
||||
j = this.rows - 1 - this.scrollBottom;
|
||||
j = this.rows - 1 + this.ybase - j;
|
||||
|
||||
while (param--) {
|
||||
// test: echo -e '\e[44m\e[1M\e[0m'
|
||||
// blankLine(true) - xterm/linux behavior
|
||||
this.lines.splice(j + 1, 0, this.blankLine(true));
|
||||
this.lines.splice(row, 1);
|
||||
}
|
||||
|
||||
// this.maxRange();
|
||||
this.updateRange(this.y);
|
||||
this.updateRange(this.scrollBottom);
|
||||
};
|
||||
|
||||
// CSI P m SP }
|
||||
// Insert P s Column(s) (default = 1) (DECIC), VT420 and up.
|
||||
// NOTE: xterm doesn't enable this code by default.
|
||||
Terminal.prototype.insertColumns = function (params){
|
||||
var i;
|
||||
var param = params[0];
|
||||
var l = this.ybase + this.rows;
|
||||
var ch = [this.eraseAttr(), ' ']; // xterm
|
||||
|
||||
while (param--) {
|
||||
for (i = this.ybase; i < l; i++) {
|
||||
this.lines[i].splice(this.x + 1, 0, ch);
|
||||
this.lines[i].pop();
|
||||
}
|
||||
}
|
||||
|
||||
this.maxRange();
|
||||
};
|
||||
|
||||
// CSI P m SP ~
|
||||
// Delete P s Column(s) (default = 1) (DECDC), VT420 and up
|
||||
// NOTE: xterm doesn't enable this code by default.
|
||||
Terminal.prototype.deleteColumns = function (params){
|
||||
var i;
|
||||
var param = params[0];
|
||||
var l = this.ybase + this.rows;
|
||||
var ch = [this.eraseAttr(), ' ']; // xterm
|
||||
|
||||
while (param--) {
|
||||
for (i = this.ybase; i < l; i++) {
|
||||
this.lines[i].splice(this.x, 1);
|
||||
this.lines[i].push(ch);
|
||||
}
|
||||
}
|
||||
|
||||
this.maxRange();
|
||||
};
|
||||
|
||||
// CSI Ps P
|
||||
// Delete Ps Character(s) (default = 1) (DCH).
|
||||
Terminal.prototype.deleteChars = function (params){
|
||||
var param, row, ch;
|
||||
|
||||
param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
row = this.y + this.ybase;
|
||||
ch = [this.curAttr, ' ']; // xterm
|
||||
|
||||
while (param--) {
|
||||
this.lines[row].splice(this.x, 1);
|
||||
this.lines[row].push(ch);
|
||||
}
|
||||
};
|
||||
|
||||
// CSI Ps X
|
||||
// Erase Ps Character(s) (default = 1) (ECH).
|
||||
Terminal.prototype.eraseChars = function (params){
|
||||
var param, row, j, ch;
|
||||
|
||||
param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
row = this.y + this.ybase;
|
||||
j = this.x;
|
||||
ch = [this.curAttr, ' ']; // xterm
|
||||
|
||||
while (param-- && j < this.cols) {
|
||||
this.lines[row][j++] = ch;
|
||||
}
|
||||
};
|
||||
};
|
416
bin/terminal/lib/csi/mode.js
Normal file
416
bin/terminal/lib/csi/mode.js
Normal file
@@ -0,0 +1,416 @@
|
||||
/**
|
||||
* Created by nuintun on 2015/11/25.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function (Terminal){
|
||||
// CSI Pm h Set Mode (SM).
|
||||
// Ps = 2 -> Keyboard Action Mode (AM).
|
||||
// Ps = 4 -> Insert Mode (IRM).
|
||||
// Ps = 1 2 -> Send/receive (SRM).
|
||||
// Ps = 2 0 -> Automatic Newline (LNM).
|
||||
// CSI ? Pm h
|
||||
// DEC Private Mode Set (DECSET).
|
||||
// Ps = 1 -> Application Cursor Keys (DECCKM).
|
||||
// Ps = 2 -> Designate USASCII for character sets G0-G3
|
||||
// (DECANM), and set VT100 mode.
|
||||
// Ps = 3 -> 132 Column Mode (DECCOLM).
|
||||
// Ps = 4 -> Smooth (Slow) Scroll (DECSCLM).
|
||||
// Ps = 5 -> Reverse Video (DECSCNM).
|
||||
// Ps = 6 -> Origin Mode (DECOM).
|
||||
// Ps = 7 -> Wraparound Mode (DECAWM).
|
||||
// Ps = 8 -> Auto-repeat Keys (DECARM).
|
||||
// Ps = 9 -> Send Mouse X & Y on button press. See the sec-
|
||||
// tion Mouse Tracking.
|
||||
// Ps = 1 0 -> Show toolbar (rxvt).
|
||||
// Ps = 1 2 -> Start Blinking Cursor (att610).
|
||||
// Ps = 1 8 -> Print form feed (DECPFF).
|
||||
// Ps = 1 9 -> Set print extent to full screen (DECPEX).
|
||||
// Ps = 2 5 -> Show Cursor (DECTCEM).
|
||||
// Ps = 3 0 -> Show scrollbar (rxvt).
|
||||
// Ps = 3 5 -> Enable font-shifting functions (rxvt).
|
||||
// Ps = 3 8 -> Enter Tektronix Mode (DECTEK).
|
||||
// Ps = 4 0 -> Allow 80 -> 132 Mode.
|
||||
// Ps = 4 1 -> more(1) fix (see curses resource).
|
||||
// Ps = 4 2 -> Enable Nation Replacement Character sets (DECN-
|
||||
// RCM).
|
||||
// Ps = 4 4 -> Turn On Margin Bell.
|
||||
// Ps = 4 5 -> Reverse-wraparound Mode.
|
||||
// Ps = 4 6 -> Start Logging. This is normally disabled by a
|
||||
// compile-time option.
|
||||
// Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis-
|
||||
// abled by the titeInhibit resource).
|
||||
// Ps = 6 6 -> Application keypad (DECNKM).
|
||||
// Ps = 6 7 -> Backarrow key sends backspace (DECBKM).
|
||||
// Ps = 1 0 0 0 -> Send Mouse X & Y on button press and
|
||||
// release. See the section Mouse Tracking.
|
||||
// Ps = 1 0 0 1 -> Use Hilite Mouse Tracking.
|
||||
// Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking.
|
||||
// Ps = 1 0 0 3 -> Use All Motion Mouse Tracking.
|
||||
// Ps = 1 0 0 4 -> Send FocusIn/FocusOut events.
|
||||
// Ps = 1 0 0 5 -> Enable Extended Mouse Mode.
|
||||
// Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt).
|
||||
// Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt).
|
||||
// Ps = 1 0 3 4 -> Interpret "meta" key, sets eighth bit.
|
||||
// (enables the eightBitInput resource).
|
||||
// Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num-
|
||||
// Lock keys. (This enables the numLock resource).
|
||||
// Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This
|
||||
// enables the metaSendsEscape resource).
|
||||
// Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete
|
||||
// key.
|
||||
// Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This
|
||||
// enables the altSendsEscape resource).
|
||||
// Ps = 1 0 4 0 -> Keep selection even if not highlighted.
|
||||
// (This enables the keepSelection resource).
|
||||
// Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables
|
||||
// the selectToClipboard resource).
|
||||
// Ps = 1 0 4 2 -> Enable Urgency window manager hint when
|
||||
// Control-G is received. (This enables the bellIsUrgent
|
||||
// resource).
|
||||
// Ps = 1 0 4 3 -> Enable raising of the window when Control-G
|
||||
// is received. (enables the popOnBell resource).
|
||||
// Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be
|
||||
// disabled by the titeInhibit resource).
|
||||
// Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis-
|
||||
// abled by the titeInhibit resource).
|
||||
// Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate
|
||||
// Screen Buffer, clearing it first. (This may be disabled by
|
||||
// the titeInhibit resource). This combines the effects of the 1
|
||||
// 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based
|
||||
// applications rather than the 4 7 mode.
|
||||
// Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode.
|
||||
// Ps = 1 0 5 1 -> Set Sun function-key mode.
|
||||
// Ps = 1 0 5 2 -> Set HP function-key mode.
|
||||
// Ps = 1 0 5 3 -> Set SCO function-key mode.
|
||||
// Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6).
|
||||
// Ps = 1 0 6 1 -> Set VT220 keyboard emulation.
|
||||
// Ps = 2 0 0 4 -> Set bracketed paste mode.
|
||||
// Modes:
|
||||
// http://vt100.net/docs/vt220-rm/chapter4.html
|
||||
Terminal.prototype.setMode = function (params){
|
||||
if (Array.isArray(params)) {
|
||||
var i = 0;
|
||||
var l = params.length;
|
||||
|
||||
for (; i < l; i++) {
|
||||
this.setMode(params[i]);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.prefix) {
|
||||
switch (params) {
|
||||
case 4:
|
||||
this.insertMode = true;
|
||||
break;
|
||||
case 20:
|
||||
this.convertEol = true;
|
||||
break;
|
||||
}
|
||||
} else if (this.prefix === '?') {
|
||||
switch (params) {
|
||||
case 1:
|
||||
// -this.applicationCursor = true;
|
||||
break;
|
||||
case 2:
|
||||
// -this.setgCharset(0, Terminal.charsets.US);
|
||||
// -this.setgCharset(1, Terminal.charsets.US);
|
||||
// -this.setgCharset(2, Terminal.charsets.US);
|
||||
// -this.setgCharset(3, Terminal.charsets.US);
|
||||
// set VT100 mode here
|
||||
break;
|
||||
// 132 col mode
|
||||
case 3:
|
||||
// -this.savedCols = this.cols;
|
||||
|
||||
// -this.resize(132, this.rows);
|
||||
break;
|
||||
case 6:
|
||||
this.originMode = true;
|
||||
break;
|
||||
case 7:
|
||||
this.wraparoundMode = true;
|
||||
break;
|
||||
case 12:
|
||||
this.cursorBlink = true;
|
||||
break;
|
||||
case 66:
|
||||
this.applicationKeypad = true;
|
||||
break;
|
||||
// X10 Mouse
|
||||
case 9:
|
||||
// vt200 mouse
|
||||
// no release, no motion, no wheel, no modifiers.
|
||||
case 1000:
|
||||
// no motion.
|
||||
// no modifiers, except control on the wheel.
|
||||
// button event mouse
|
||||
case 1002:
|
||||
// any event mouse
|
||||
case 1003:
|
||||
// any event - sends motion events,
|
||||
// even if there is no button held down.
|
||||
// -this.x10Mouse = params === 9;
|
||||
// -this.vt200Mouse = params === 1000;
|
||||
// -this.normalMouse = params > 1000;
|
||||
// -this.mouseEvents = true;
|
||||
// -this.element.style.cursor = 'default';
|
||||
break;
|
||||
// send focusin/focusout events
|
||||
case 1004:
|
||||
// focusin: ^[[I
|
||||
// focusout: ^[[O
|
||||
// -this.sendFocus = true;
|
||||
break;
|
||||
// utf8 ext mode mouse
|
||||
case 1005:
|
||||
// -this.utfMouse = true;
|
||||
// for wide terminals
|
||||
// simply encodes large values as utf8 characters
|
||||
break;
|
||||
// sgr ext mode mouse
|
||||
case 1006:
|
||||
// -this.sgrMouse = true;
|
||||
// for wide terminals
|
||||
// does not add 32 to fields
|
||||
// press: ^[[<b;x;yM
|
||||
// release: ^[[<b;x;ym
|
||||
break;
|
||||
// urxvt ext mode mouse
|
||||
case 1015:
|
||||
// -this.urxvtMouse = true;
|
||||
// for wide terminals
|
||||
// numbers for fields
|
||||
// press: ^[[b;x;yM
|
||||
// motion: ^[[b;x;yT
|
||||
break;
|
||||
// show cursor
|
||||
case 25:
|
||||
this.cursor = true;
|
||||
|
||||
this.showCursor();
|
||||
break;
|
||||
// alt screen buffer cursor
|
||||
case 1049:
|
||||
// -this.saveCursor();
|
||||
// FALL-THROUGH
|
||||
// alt screen buffer
|
||||
case 47:
|
||||
// alt screen buffer
|
||||
case 1047:
|
||||
if (!this.normal) {
|
||||
var normal = {
|
||||
lines: this.lines,
|
||||
ybase: this.ybase,
|
||||
ydisp: this.ydisp,
|
||||
x: this.x,
|
||||
y: this.y,
|
||||
scrollTop: this.scrollTop,
|
||||
scrollBottom: this.scrollBottom,
|
||||
tabs: this.tabs
|
||||
};
|
||||
|
||||
this.reset();
|
||||
|
||||
this.normal = normal;
|
||||
|
||||
this.showCursor();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// CSI Pm l Reset Mode (RM).
|
||||
// Ps = 2 -> Keyboard Action Mode (AM).
|
||||
// Ps = 4 -> Replace Mode (IRM).
|
||||
// Ps = 1 2 -> Send/receive (SRM).
|
||||
// Ps = 2 0 -> Normal Linefeed (LNM).
|
||||
// CSI ? Pm l
|
||||
// DEC Private Mode Reset (DECRST).
|
||||
// Ps = 1 -> Normal Cursor Keys (DECCKM).
|
||||
// Ps = 2 -> Designate VT52 mode (DECANM).
|
||||
// Ps = 3 -> 80 Column Mode (DECCOLM).
|
||||
// Ps = 4 -> Jump (Fast) Scroll (DECSCLM).
|
||||
// Ps = 5 -> Normal Video (DECSCNM).
|
||||
// Ps = 6 -> Normal Cursor Mode (DECOM).
|
||||
// Ps = 7 -> No Wraparound Mode (DECAWM).
|
||||
// Ps = 8 -> No Auto-repeat Keys (DECARM).
|
||||
// Ps = 9 -> Don't send Mouse X & Y on button press.
|
||||
// Ps = 1 0 -> Hide toolbar (rxvt).
|
||||
// Ps = 1 2 -> Stop Blinking Cursor (att610).
|
||||
// Ps = 1 8 -> Don't print form feed (DECPFF).
|
||||
// Ps = 1 9 -> Limit print to scrolling region (DECPEX).
|
||||
// Ps = 2 5 -> Hide Cursor (DECTCEM).
|
||||
// Ps = 3 0 -> Don't show scrollbar (rxvt).
|
||||
// Ps = 3 5 -> Disable font-shifting functions (rxvt).
|
||||
// Ps = 4 0 -> Disallow 80 -> 132 Mode.
|
||||
// Ps = 4 1 -> No more(1) fix (see curses resource).
|
||||
// Ps = 4 2 -> Disable Nation Replacement Character sets (DEC-
|
||||
// NRCM).
|
||||
// Ps = 4 4 -> Turn Off Margin Bell.
|
||||
// Ps = 4 5 -> No Reverse-wraparound Mode.
|
||||
// Ps = 4 6 -> Stop Logging. (This is normally disabled by a
|
||||
// compile-time option).
|
||||
// Ps = 4 7 -> Use Normal Screen Buffer.
|
||||
// Ps = 6 6 -> Numeric keypad (DECNKM).
|
||||
// Ps = 6 7 -> Backarrow key sends delete (DECBKM).
|
||||
// Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and
|
||||
// release. See the section Mouse Tracking.
|
||||
// Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking.
|
||||
// Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking.
|
||||
// Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking.
|
||||
// Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events.
|
||||
// Ps = 1 0 0 5 -> Disable Extended Mouse Mode.
|
||||
// Ps = 1 0 1 0 -> Don't scroll to bottom on tty output
|
||||
// (rxvt).
|
||||
// Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt).
|
||||
// Ps = 1 0 3 4 -> Don't interpret "meta" key. (This disables
|
||||
// the eightBitInput resource).
|
||||
// Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num-
|
||||
// Lock keys. (This disables the numLock resource).
|
||||
// Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key.
|
||||
// (This disables the metaSendsEscape resource).
|
||||
// Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad
|
||||
// Delete key.
|
||||
// Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key.
|
||||
// (This disables the altSendsEscape resource).
|
||||
// Ps = 1 0 4 0 -> Do not keep selection when not highlighted.
|
||||
// (This disables the keepSelection resource).
|
||||
// Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables
|
||||
// the selectToClipboard resource).
|
||||
// Ps = 1 0 4 2 -> Disable Urgency window manager hint when
|
||||
// Control-G is received. (This disables the bellIsUrgent
|
||||
// resource).
|
||||
// Ps = 1 0 4 3 -> Disable raising of the window when Control-
|
||||
// G is received. (This disables the popOnBell resource).
|
||||
// Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen
|
||||
// first if in the Alternate Screen. (This may be disabled by
|
||||
// the titeInhibit resource).
|
||||
// Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be
|
||||
// disabled by the titeInhibit resource).
|
||||
// Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor
|
||||
// as in DECRC. (This may be disabled by the titeInhibit
|
||||
// resource). This combines the effects of the 1 0 4 7 and 1 0
|
||||
// 4 8 modes. Use this with terminfo-based applications rather
|
||||
// than the 4 7 mode.
|
||||
// Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode.
|
||||
// Ps = 1 0 5 1 -> Reset Sun function-key mode.
|
||||
// Ps = 1 0 5 2 -> Reset HP function-key mode.
|
||||
// Ps = 1 0 5 3 -> Reset SCO function-key mode.
|
||||
// Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6).
|
||||
// Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style.
|
||||
// Ps = 2 0 0 4 -> Reset bracketed paste mode.
|
||||
Terminal.prototype.resetMode = function (params){
|
||||
if (Array.isArray(params)) {
|
||||
var i = 0;
|
||||
var l = params.length;
|
||||
|
||||
for (; i < l; i++) {
|
||||
this.resetMode(params[i]);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.prefix) {
|
||||
switch (params) {
|
||||
case 4:
|
||||
this.insertMode = false;
|
||||
break;
|
||||
case 20:
|
||||
this.convertEol = false;
|
||||
break;
|
||||
}
|
||||
} else if (this.prefix === '?') {
|
||||
switch (params) {
|
||||
case 1:
|
||||
// -this.applicationCursor = false;
|
||||
break;
|
||||
case 2:
|
||||
// reset charset mode here
|
||||
break;
|
||||
case 3:
|
||||
// -if (this.cols === 132 && this.savedCols) {
|
||||
// - this.resize(this.savedCols, this.rows);
|
||||
// -}
|
||||
|
||||
// -this.savedCols = null;
|
||||
break;
|
||||
case 6:
|
||||
this.originMode = false;
|
||||
break;
|
||||
case 7:
|
||||
this.wraparoundMode = false;
|
||||
break;
|
||||
case 12:
|
||||
this.cursorBlink = false;
|
||||
break;
|
||||
case 66:
|
||||
this.applicationKeypad = false;
|
||||
break;
|
||||
// X10 Mouse
|
||||
case 9:
|
||||
// vt200 mouse
|
||||
case 1000:
|
||||
// button event mouse
|
||||
case 1002:
|
||||
// any event mouse
|
||||
case 1003:
|
||||
// -this.x10Mouse = false;
|
||||
// -this.vt200Mouse = false;
|
||||
// -this.normalMouse = false;
|
||||
// -this.mouseEvents = false;
|
||||
// -this.element.style.cursor = '';
|
||||
break;
|
||||
// send focusin/focusout events
|
||||
case 1004:
|
||||
// -this.sendFocus = false;
|
||||
break;
|
||||
// utf8 ext mode mouse
|
||||
case 1005:
|
||||
// -this.utfMouse = false;
|
||||
break;
|
||||
// sgr ext mode mouse
|
||||
case 1006:
|
||||
// -this.sgrMouse = false;
|
||||
break;
|
||||
// urxvt ext mode mouse
|
||||
case 1015:
|
||||
// -this.urxvtMouse = false;
|
||||
break;
|
||||
// hide cursor
|
||||
case 25:
|
||||
this.cursor = false;
|
||||
|
||||
this.hideCursor();
|
||||
break;
|
||||
// alt screen buffer cursor
|
||||
case 1049:
|
||||
// FALL-THROUGH
|
||||
// normal screen buffer - clearing it first
|
||||
case 47:
|
||||
// normal screen buffer - clearing it first
|
||||
case 1047:
|
||||
if (this.normal) {
|
||||
this.lines = this.normal.lines;
|
||||
this.ybase = this.normal.ybase;
|
||||
this.ydisp = this.normal.ydisp;
|
||||
this.x = this.normal.x;
|
||||
this.y = this.normal.y;
|
||||
this.scrollTop = this.normal.scrollTop;
|
||||
this.scrollBottom = this.normal.scrollBottom;
|
||||
this.tabs = this.normal.tabs;
|
||||
this.normal = null;
|
||||
|
||||
this.refresh(0, this.rows - 1);
|
||||
this.showCursor();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
85
bin/terminal/lib/csi/position.js
Normal file
85
bin/terminal/lib/csi/position.js
Normal file
@@ -0,0 +1,85 @@
|
||||
/**
|
||||
* Created by nuintun on 2015/11/24.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function (Terminal){
|
||||
// CSI Pm ` Character Position Absolute
|
||||
// [column] (default = [row,1]) (HPA).
|
||||
Terminal.prototype.charPosAbsolute = function (params){
|
||||
var param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
this.x = param - 1;
|
||||
|
||||
if (this.x >= this.cols) {
|
||||
this.x = this.cols - 1;
|
||||
}
|
||||
};
|
||||
|
||||
// 141 61 a * HPR -
|
||||
// Horizontal Position Relative
|
||||
// reuse CSI Ps C ?
|
||||
Terminal.prototype.HPositionRelative = function (params){
|
||||
var param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
this.x += param;
|
||||
|
||||
if (this.x >= this.cols) {
|
||||
this.x = this.cols - 1;
|
||||
}
|
||||
};
|
||||
|
||||
// CSI Pm d
|
||||
// Line Position Absolute [row] (default = [1,column]) (VPA).
|
||||
Terminal.prototype.linePosAbsolute = function (params){
|
||||
var param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
this.y = param - 1;
|
||||
|
||||
if (this.y >= this.rows) {
|
||||
this.y = this.rows - 1;
|
||||
}
|
||||
};
|
||||
|
||||
// 145 65 e * VPR - Vertical Position Relative
|
||||
// reuse CSI Ps B ?
|
||||
Terminal.prototype.VPositionRelative = function (params){
|
||||
var param = params[0];
|
||||
|
||||
if (param < 1) param = 1;
|
||||
|
||||
this.y += param;
|
||||
|
||||
if (this.y >= this.rows) {
|
||||
this.y = this.rows - 1;
|
||||
}
|
||||
};
|
||||
|
||||
// CSI Ps ; Ps f
|
||||
// Horizontal and Vertical Position [row;column] (default =
|
||||
// [1,1]) (HVP).
|
||||
Terminal.prototype.HVPosition = function (params){
|
||||
if (params[0] < 1) params[0] = 1;
|
||||
|
||||
if (params[1] < 1) params[1] = 1;
|
||||
|
||||
this.y = params[0] - 1;
|
||||
|
||||
if (this.y >= this.rows) {
|
||||
this.y = this.rows - 1;
|
||||
}
|
||||
|
||||
this.x = params[1] - 1;
|
||||
|
||||
if (this.x >= this.cols) {
|
||||
this.x = this.cols - 1;
|
||||
}
|
||||
};
|
||||
};
|
16
bin/terminal/lib/csi/repeatPrecedingCharacter.js
Normal file
16
bin/terminal/lib/csi/repeatPrecedingCharacter.js
Normal file
@@ -0,0 +1,16 @@
|
||||
/**
|
||||
* Created by nuintun on 2015/11/24.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function (Terminal){
|
||||
// CSI Ps b Repeat the preceding graphic character Ps times (REP).
|
||||
Terminal.prototype.repeatPrecedingCharacter = function (params){
|
||||
var param = params[0] || 1;
|
||||
var line = this.lines[this.ybase + this.y];
|
||||
var ch = line[this.x - 1] || [this.defAttr, ' '];
|
||||
|
||||
while (param--) line[this.x++] = ch;
|
||||
};
|
||||
};
|
46
bin/terminal/lib/csi/scroll.js
Normal file
46
bin/terminal/lib/csi/scroll.js
Normal file
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
* Created by nuintun on 2015/11/25.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function (Terminal){
|
||||
// CSI Ps S Scroll up Ps lines (default = 1) (SU).
|
||||
Terminal.prototype.scrollUp = function (params){
|
||||
var param = params[0] || 1;
|
||||
|
||||
while (param--) {
|
||||
this.lines.splice(this.ybase + this.scrollTop, 1);
|
||||
this.lines.splice(this.ybase + this.scrollBottom, 0, this.blankLine());
|
||||
}
|
||||
|
||||
this.updateRange(this.scrollTop);
|
||||
this.updateRange(this.scrollBottom);
|
||||
};
|
||||
|
||||
// CSI Ps T Scroll down Ps lines (default = 1) (SD).
|
||||
Terminal.prototype.scrollDown = function (params){
|
||||
var param = params[0] || 1;
|
||||
|
||||
while (param--) {
|
||||
this.lines.splice(this.ybase + this.scrollBottom, 1);
|
||||
this.lines.splice(this.ybase + this.scrollTop, 0, this.blankLine());
|
||||
}
|
||||
|
||||
this.updateRange(this.scrollTop);
|
||||
this.updateRange(this.scrollBottom);
|
||||
};
|
||||
|
||||
// CSI Ps ; Ps r
|
||||
// Set Scrolling Region [top;bottom] (default = full size of win-
|
||||
// dow) (DECSTBM).
|
||||
// CSI ? Pm r
|
||||
Terminal.prototype.setScrollRegion = function (params){
|
||||
if (this.prefix) return;
|
||||
|
||||
this.x = 0;
|
||||
this.y = 0;
|
||||
this.scrollTop = (params[0] || 1) - 1;
|
||||
this.scrollBottom = (params[1] || this.rows) - 1;
|
||||
};
|
||||
};
|
24
bin/terminal/lib/csi/softReset.js
Normal file
24
bin/terminal/lib/csi/softReset.js
Normal file
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* Created by nuintun on 2015/11/24.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function (Terminal){
|
||||
// CSI ! p Soft terminal reset (DECSTR).
|
||||
// http://vt100.net/docs/vt220-rm/table4-10.html
|
||||
Terminal.prototype.softReset = function (){
|
||||
this.insertMode = false;
|
||||
this.originMode = false;
|
||||
// autowrap
|
||||
this.wraparoundMode = false;
|
||||
this.applicationKeypad = false;
|
||||
this.scrollTop = 0;
|
||||
this.scrollBottom = this.rows - 1;
|
||||
this.curAttr = this.defAttr;
|
||||
this.x = this.y = 0;
|
||||
this.charset = null;
|
||||
this.glevel = 0;
|
||||
this.charsets = [null];
|
||||
};
|
||||
};
|
23
bin/terminal/lib/csi/tabClear.js
Normal file
23
bin/terminal/lib/csi/tabClear.js
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* Created by nuintun on 2015/11/24.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
module.exports = function (Terminal){
|
||||
// CSI Ps g Tab Clear (TBC).
|
||||
// Ps = 0 -> Clear Current Column (default).
|
||||
// Ps = 3 -> Clear All.
|
||||
// Potentially:
|
||||
// Ps = 2 -> Clear Stops on Line.
|
||||
// http://vt100.net/annarbor/aaa-ug/section6.html
|
||||
Terminal.prototype.tabClear = function (params){
|
||||
var param = params[0];
|
||||
|
||||
if (param <= 0) {
|
||||
delete this.tabs[this.x];
|
||||
} else if (param === 3) {
|
||||
this.tabs = {};
|
||||
}
|
||||
};
|
||||
};
|
Reference in New Issue
Block a user