mirror of
https://github.com/embarklabs/neo-blessed.git
synced 2025-01-23 01:09:32 +00:00
refactor responses.
This commit is contained in:
parent
7b7330ec5a
commit
b46d1161c5
515
lib/program.js
515
lib/program.js
@ -264,18 +264,17 @@ Program.prototype.bindMouse = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Program.prototype._bindMouse = function(s) {
|
Program.prototype._bindMouse = function(s) {
|
||||||
var self = this;
|
var self = this
|
||||||
|
, key
|
||||||
// FROM: node/lib/readline.js
|
|
||||||
var ch
|
|
||||||
, key = {
|
|
||||||
name: undefined,
|
|
||||||
ctrl: false,
|
|
||||||
meta: false,
|
|
||||||
shift: false
|
|
||||||
}
|
|
||||||
, parts;
|
, parts;
|
||||||
|
|
||||||
|
key = {
|
||||||
|
name: undefined,
|
||||||
|
ctrl: false,
|
||||||
|
meta: false,
|
||||||
|
shift: false
|
||||||
|
};
|
||||||
|
|
||||||
if (Buffer.isBuffer(s)) {
|
if (Buffer.isBuffer(s)) {
|
||||||
if (s[0] > 127 && s[1] === undefined) {
|
if (s[0] > 127 && s[1] === undefined) {
|
||||||
s[0] -= 128;
|
s[0] -= 128;
|
||||||
@ -447,6 +446,8 @@ Program.prototype._bindMouse = function(s) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// DEC
|
// DEC
|
||||||
|
// The xterm mouse documentation says there is a
|
||||||
|
// `<` prefix, the DECRQLP says there is no prefix.
|
||||||
if (parts = /^\x1b\[<(\d+;\d+;\d+;\d+)&w/.exec(s)) {
|
if (parts = /^\x1b\[<(\d+;\d+;\d+;\d+)&w/.exec(s)) {
|
||||||
var parts = parts[1].split(';')
|
var parts = parts[1].split(';')
|
||||||
, b = +parts[0]
|
, b = +parts[0]
|
||||||
@ -525,16 +526,8 @@ Program.prototype.bindResponse = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Program.prototype._bindResponse = function(s) {
|
Program.prototype._bindResponse = function(s) {
|
||||||
var self = this;
|
var self = this
|
||||||
|
, out = {}
|
||||||
// FROM: node/lib/readline.js
|
|
||||||
var ch
|
|
||||||
, key = {
|
|
||||||
name: undefined,
|
|
||||||
ctrl: false,
|
|
||||||
meta: false,
|
|
||||||
shift: false
|
|
||||||
}
|
|
||||||
, parts;
|
, parts;
|
||||||
|
|
||||||
if (Buffer.isBuffer(s)) {
|
if (Buffer.isBuffer(s)) {
|
||||||
@ -551,11 +544,14 @@ Program.prototype._bindResponse = function(s) {
|
|||||||
// CSI > P s c
|
// CSI > P s c
|
||||||
// Send Device Attributes (Secondary DA).
|
// Send Device Attributes (Secondary DA).
|
||||||
if (parts = /^\x1b\[(\?|>)(\d*(?:;\d*)*)c/.exec(s)) {
|
if (parts = /^\x1b\[(\?|>)(\d*(?:;\d*)*)c/.exec(s)) {
|
||||||
var primary = parts[1] === '?'
|
parts = parts[2].split(';').map(function(ch) {
|
||||||
, parts = parts[2].split(';').map(function(ch) { return +ch || 0; })
|
return +ch || 0;
|
||||||
, out = {};
|
});
|
||||||
|
|
||||||
if (primary) {
|
out.event = 'device-attributes';
|
||||||
|
out.code = 'DA';
|
||||||
|
|
||||||
|
if (parts[1] === '?') {
|
||||||
out.type = 'primary-attribute';
|
out.type = 'primary-attribute';
|
||||||
// VT100-style params:
|
// VT100-style params:
|
||||||
if (parts[0] === 1 && parts[2] === 2) {
|
if (parts[0] === 1 && parts[2] === 2) {
|
||||||
@ -645,9 +641,13 @@ Program.prototype._bindResponse = function(s) {
|
|||||||
out.romCartridgeRegistrationNumber = parts[2];
|
out.romCartridgeRegistrationNumber = parts[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.emit('response', {
|
// LEGACY
|
||||||
deviceAttributes: out
|
out.deviceAttributes = out;
|
||||||
});
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// CSI Ps n Device Status Report (DSR).
|
// CSI Ps n Device Status Report (DSR).
|
||||||
@ -667,26 +667,50 @@ Program.prototype._bindResponse = function(s) {
|
|||||||
// CSI ? 5 3 n Locator available, if compiled-in, or
|
// CSI ? 5 3 n Locator available, if compiled-in, or
|
||||||
// CSI ? 5 0 n No Locator, if not.
|
// CSI ? 5 0 n No Locator, if not.
|
||||||
if (parts = /^\x1b\[(\?)?(\d+)(?:;(\d+);(\d+);(\d+))?n/.exec(s)) {
|
if (parts = /^\x1b\[(\?)?(\d+)(?:;(\d+);(\d+);(\d+))?n/.exec(s)) {
|
||||||
|
out.event = 'device-status';
|
||||||
|
out.code = 'DSR';
|
||||||
|
|
||||||
if (!parts[1] && parts[2] === '0' && !parts[3]) {
|
if (!parts[1] && parts[2] === '0' && !parts[3]) {
|
||||||
return this.emit('response', {
|
out.type = 'device-status';
|
||||||
deviceStatus: 'OK'
|
out.status = 'OK';
|
||||||
});
|
|
||||||
|
// LEGACY
|
||||||
|
out.deviceStatus = out.status;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parts[1] && (parts[2] === '10' || parts[2] === '11') && !parts[3]) {
|
if (parts[1] && (parts[2] === '10' || parts[2] === '11') && !parts[3]) {
|
||||||
return this.emit('response', {
|
out.type = 'printer-status';
|
||||||
printerStatus: parts[2] === '10'
|
out.status = parts[2] === '10'
|
||||||
? 'ready'
|
? 'ready'
|
||||||
: 'not ready'
|
: 'not ready';
|
||||||
});
|
|
||||||
|
// LEGACY
|
||||||
|
out.printerStatus = out.status;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parts[1] && (parts[2] === '20' || parts[2] === '21') && !parts[3]) {
|
if (parts[1] && (parts[2] === '20' || parts[2] === '21') && !parts[3]) {
|
||||||
return this.emit('response', {
|
out.type = 'udk-status';
|
||||||
UDKStatus: parts[2] === '20'
|
out.status = parts[2] === '20'
|
||||||
? 'unlocked'
|
? 'unlocked'
|
||||||
: 'locked'
|
: 'locked';
|
||||||
});
|
|
||||||
|
// LEGACY
|
||||||
|
out.UDKStatus = out.status;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parts[1]
|
if (parts[1]
|
||||||
@ -694,22 +718,43 @@ Program.prototype._bindResponse = function(s) {
|
|||||||
&& parts[3] === '1'
|
&& parts[3] === '1'
|
||||||
&& parts[4] === '0'
|
&& parts[4] === '0'
|
||||||
&& parts[5] === '0') {
|
&& parts[5] === '0') {
|
||||||
return this.emit('response', {
|
out.type = 'keyboard-status';
|
||||||
keyboardStatus: 'OK'
|
out.status = 'OK';
|
||||||
});
|
|
||||||
|
// LEGACY
|
||||||
|
out.keyboardStatus = out.status;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parts[1] && (parts[2] === '53' || parts[2] === '50') && !parts[3]) {
|
if (parts[1] && (parts[2] === '53' || parts[2] === '50') && !parts[3]) {
|
||||||
return this.emit('response', {
|
out.type = 'locator-status';
|
||||||
locator: parts[2] === '53'
|
out.status = parts[2] === '53'
|
||||||
? 'available'
|
? 'available'
|
||||||
: 'unavailable'
|
: 'unavailable';
|
||||||
});
|
|
||||||
|
// LEGACY
|
||||||
|
out.locator = out.status;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.emit('response', {
|
out.type = 'error';
|
||||||
error: 'Unhandled: ' + JSON.stringify(parts)
|
out.text = 'Unhandled: ' + JSON.stringify(parts);
|
||||||
});
|
|
||||||
|
// LEGACY
|
||||||
|
out.error = out.text;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// CSI Ps n Device Status Report (DSR).
|
// CSI Ps n Device Status Report (DSR).
|
||||||
@ -721,13 +766,27 @@ Program.prototype._bindResponse = function(s) {
|
|||||||
// Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI
|
// Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI
|
||||||
// ? r ; c R (assumes page is zero).
|
// ? r ; c R (assumes page is zero).
|
||||||
if (parts = /^\x1b\[(\?)?(\d+);(\d+)R/.exec(s)) {
|
if (parts = /^\x1b\[(\?)?(\d+);(\d+)R/.exec(s)) {
|
||||||
return this.emit('response', {
|
out.event = 'device-status-report';
|
||||||
cursor: {
|
out.code = 'DSR';
|
||||||
x: +parts[3],
|
out.type = 'cursor-status';
|
||||||
y: +parts[2],
|
|
||||||
page: !parts[1] ? undefined : 0
|
out.status = {
|
||||||
}
|
x: +parts[3],
|
||||||
});
|
y: +parts[2],
|
||||||
|
page: !parts[1] ? undefined : 0
|
||||||
|
};
|
||||||
|
|
||||||
|
out.x = out.status.x;
|
||||||
|
out.y = out.status.y;
|
||||||
|
out.page = out.status.page;
|
||||||
|
|
||||||
|
// LEGACY
|
||||||
|
out.cursor = out.status;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// CSI Ps ; Ps ; Ps t
|
// CSI Ps ; Ps ; Ps t
|
||||||
@ -747,53 +806,99 @@ Program.prototype._bindResponse = function(s) {
|
|||||||
// Ps = 1 9 -> Report the size of the screen in characters.
|
// Ps = 1 9 -> Report the size of the screen in characters.
|
||||||
// Result is CSI 9 ; height ; width t
|
// Result is CSI 9 ; height ; width t
|
||||||
if (parts = /^\x1b\[(\d+)(?:;(\d+);(\d+))?t/.exec(s)) {
|
if (parts = /^\x1b\[(\d+)(?:;(\d+);(\d+))?t/.exec(s)) {
|
||||||
|
out.event = 'window-manipulation';
|
||||||
|
out.code = '';
|
||||||
|
|
||||||
if ((parts[1] === '1' || parts[1] === '2') && !parts[2]) {
|
if ((parts[1] === '1' || parts[1] === '2') && !parts[2]) {
|
||||||
return this.emit('response', {
|
out.type = 'window-state';
|
||||||
windowState: parts[1] === '1'
|
out.state = parts[1] === '1'
|
||||||
? 'non-iconified'
|
? 'non-iconified'
|
||||||
: 'iconified'
|
: 'iconified'
|
||||||
});
|
|
||||||
|
// LEGACY
|
||||||
|
out.windowState = out.state;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parts[1] === '3' && parts[2]) {
|
if (parts[1] === '3' && parts[2]) {
|
||||||
return this.emit('response', {
|
out.type = 'window-position';
|
||||||
windowPosition: {
|
|
||||||
x: +parts[2],
|
out.position = {
|
||||||
y: +parts[3]
|
x: +parts[2],
|
||||||
}
|
y: +parts[3]
|
||||||
});
|
};
|
||||||
|
|
||||||
|
// LEGACY
|
||||||
|
out.windowPosition = out.position;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parts[1] === '4' && parts[2]) {
|
if (parts[1] === '4' && parts[2]) {
|
||||||
return this.emit('response', {
|
out.type = 'window-size-pixels';
|
||||||
windowSizePixels: {
|
out.size = {
|
||||||
height: +parts[2],
|
height: +parts[2],
|
||||||
width: +parts[3]
|
width: +parts[3]
|
||||||
}
|
};
|
||||||
});
|
|
||||||
|
// LEGACY
|
||||||
|
out.windowSizePixels = out.size;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parts[1] === '8' && parts[2]) {
|
if (parts[1] === '8' && parts[2]) {
|
||||||
return this.emit('response', {
|
out.type = 'textarea-size';
|
||||||
textAreaSizeCharacters: {
|
out.size = {
|
||||||
height: +parts[2],
|
height: +parts[2],
|
||||||
width: +parts[3]
|
width: +parts[3]
|
||||||
}
|
};
|
||||||
});
|
|
||||||
|
// LEGACY
|
||||||
|
out.textAreaSizeCharacters = out.size;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parts[1] === '9' && parts[2]) {
|
if (parts[1] === '9' && parts[2]) {
|
||||||
return this.emit('response', {
|
out.type = 'screen-size';
|
||||||
screenSizeCharacters: {
|
out.size = {
|
||||||
height: +parts[2],
|
height: +parts[2],
|
||||||
width: +parts[3]
|
width: +parts[3]
|
||||||
}
|
};
|
||||||
});
|
|
||||||
|
// LEGACY
|
||||||
|
out.screenSizeCharacters = out.size;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.emit('response', {
|
out.type = 'error';
|
||||||
error: 'Unhandled: ' + JSON.stringify(parts)
|
out.text = 'Unhandled: ' + JSON.stringify(parts);
|
||||||
});
|
|
||||||
|
// LEGACY
|
||||||
|
out.error = out.text;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// CSI Ps ; Ps ; Ps t
|
// CSI Ps ; Ps ; Ps t
|
||||||
@ -806,21 +911,136 @@ Program.prototype._bindResponse = function(s) {
|
|||||||
// Ps = 2 1 -> Report xterm window's title. Result is OSC l
|
// Ps = 2 1 -> Report xterm window's title. Result is OSC l
|
||||||
// label ST
|
// label ST
|
||||||
if (parts = /^\x1b\](l|L)([^\x07\x1b]*)(?:\x07|\x1b\\)/.exec(s)) {
|
if (parts = /^\x1b\](l|L)([^\x07\x1b]*)(?:\x07|\x1b\\)/.exec(s)) {
|
||||||
|
out.type = 'window-manipulation';
|
||||||
|
out.code = '';
|
||||||
|
|
||||||
if (parts[1] === 'L') {
|
if (parts[1] === 'L') {
|
||||||
return this.emit('response', {
|
out.type = 'window-icon-label';
|
||||||
windowIconLabel: parts[2]
|
out.text = parts[2];
|
||||||
});
|
|
||||||
|
// LEGACY
|
||||||
|
out.windowIconLabel = out.text;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parts[1] === 'l') {
|
if (parts[1] === 'l') {
|
||||||
return this.emit('response', {
|
out.type = 'window-title';
|
||||||
windowTitle: parts[2]
|
out.text = parts[2];
|
||||||
});
|
|
||||||
|
// LEGACY
|
||||||
|
out.windowTitle = out.text;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.emit('response', {
|
out.type = 'error';
|
||||||
error: 'Unhandled: ' + JSON.stringify(parts)
|
out.text = 'Unhandled: ' + JSON.stringify(parts);
|
||||||
|
|
||||||
|
// LEGACY
|
||||||
|
out.error = out.text;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// CSI Ps ' |
|
||||||
|
// Request Locator Position (DECRQLP).
|
||||||
|
// -> CSI Pe ; Pb ; Pr ; Pc ; Pp & w
|
||||||
|
// Parameters are [event;button;row;column;page].
|
||||||
|
// Valid values for the event:
|
||||||
|
// Pe = 0 -> locator unavailable - no other parameters sent.
|
||||||
|
// Pe = 1 -> request - xterm received a DECRQLP.
|
||||||
|
// Pe = 2 -> left button down.
|
||||||
|
// Pe = 3 -> left button up.
|
||||||
|
// Pe = 4 -> middle button down.
|
||||||
|
// Pe = 5 -> middle button up.
|
||||||
|
// Pe = 6 -> right button down.
|
||||||
|
// Pe = 7 -> right button up.
|
||||||
|
// Pe = 8 -> M4 button down.
|
||||||
|
// Pe = 9 -> M4 button up.
|
||||||
|
// Pe = 1 0 -> locator outside filter rectangle.
|
||||||
|
// ``button'' parameter is a bitmask indicating which buttons are
|
||||||
|
// pressed:
|
||||||
|
// Pb = 0 <- no buttons down.
|
||||||
|
// Pb & 1 <- right button down.
|
||||||
|
// Pb & 2 <- middle button down.
|
||||||
|
// Pb & 4 <- left button down.
|
||||||
|
// Pb & 8 <- M4 button down.
|
||||||
|
// ``row'' and ``column'' parameters are the coordinates of the
|
||||||
|
// locator position in the xterm window, encoded as ASCII deci-
|
||||||
|
// mal.
|
||||||
|
// The ``page'' parameter is not used by xterm, and will be omit-
|
||||||
|
// ted.
|
||||||
|
// NOTE:
|
||||||
|
// This is already implemented in the _bindMouse
|
||||||
|
// method, but it might make more sense here.
|
||||||
|
// The xterm mouse documentation says there is a
|
||||||
|
// `<` prefix, the DECRQLP says there is no prefix.
|
||||||
|
if (parts = /^\x1b\[(\d+(?:;\d+){4})&w/.exec(s)) {
|
||||||
|
parts = parts[1].split(';').map(function(ch) {
|
||||||
|
return +ch;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
out.event = 'locator-position';
|
||||||
|
out.code = 'DECRQLP';
|
||||||
|
|
||||||
|
switch (parts[0]) {
|
||||||
|
case 0:
|
||||||
|
out.status = 'locator-unavailable';
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
out.status = 'request';
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
out.status = 'left-button-down';
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
out.status = 'left-button-up';
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
out.status = 'middle-button-down';
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
out.status = 'middle-button-up';
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
out.status = 'right-button-down';
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
out.status = 'right-button-up';
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
out.status = 'm4-button-down';
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
out.status = 'm4-button-up';
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
out.status = 'locator-outside';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
out.mask = parts[1];
|
||||||
|
out.row = parts[2];
|
||||||
|
out.col = parts[3];
|
||||||
|
out.page = parts[4];
|
||||||
|
|
||||||
|
// LEGACY
|
||||||
|
out.locatorPosition = out;
|
||||||
|
|
||||||
|
this.emit('response', out);
|
||||||
|
this.emit('response ' + out.event, out);
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -853,7 +1073,17 @@ Program.prototype.receive = function(text, callback) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
Program.prototype.receive_ = function(text, callback) {
|
Program.prototype.response_ = function(name, text, callback) {
|
||||||
|
if (arguments.length === 2) {
|
||||||
|
callback = text;
|
||||||
|
text = name;
|
||||||
|
name = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!callback) {
|
||||||
|
callback = function() {};
|
||||||
|
}
|
||||||
|
|
||||||
var listeners = (this._events && this._events['keypress']) || []
|
var listeners = (this._events && this._events['keypress']) || []
|
||||||
, bak = listeners.slice()
|
, bak = listeners.slice()
|
||||||
, self = this;
|
, self = this;
|
||||||
@ -864,16 +1094,14 @@ Program.prototype.receive_ = function(text, callback) {
|
|||||||
|
|
||||||
listeners.length = 0;
|
listeners.length = 0;
|
||||||
|
|
||||||
if (!callback) {
|
|
||||||
callback = text;
|
|
||||||
text = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return process.nextTick(function() {
|
return process.nextTick(function() {
|
||||||
self.input.once('data', function(data) {
|
self.input.once('data', function(data) {
|
||||||
listeners.push.apply(listeners, bak);
|
listeners.push.apply(listeners, bak);
|
||||||
self.once('response', function(event) {
|
self.once('response' + (name ? ' ' + name : ''), function(event) {
|
||||||
return callback(null, event[Object.keys(event)[0]]);
|
if (event.type === 'error') {
|
||||||
|
return callback(new Error(event.event + ': ' + event.text));
|
||||||
|
}
|
||||||
|
return callback(null, event);
|
||||||
});
|
});
|
||||||
self._bindResponse(data);
|
self._bindResponse(data);
|
||||||
});
|
});
|
||||||
@ -882,6 +1110,29 @@ Program.prototype.receive_ = function(text, callback) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Program.prototype.response = function(name, text, callback) {
|
||||||
|
if (arguments.length === 2) {
|
||||||
|
callback = text;
|
||||||
|
text = name;
|
||||||
|
name = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!callback) {
|
||||||
|
callback = function() {};
|
||||||
|
}
|
||||||
|
|
||||||
|
this.bindResponse();
|
||||||
|
|
||||||
|
this.once('response' + (name ? ' ' + name : ''), function(event) {
|
||||||
|
if (event.type === 'error') {
|
||||||
|
return callback(new Error(event.event + ': ' + event.text));
|
||||||
|
}
|
||||||
|
return callback(null, event);
|
||||||
|
});
|
||||||
|
|
||||||
|
return this.write(text);
|
||||||
|
};
|
||||||
|
|
||||||
Program.prototype.write =
|
Program.prototype.write =
|
||||||
Program.prototype.echo = function(text, attr) {
|
Program.prototype.echo = function(text, attr) {
|
||||||
// if (this.output === process.stdout) {
|
// if (this.output === process.stdout) {
|
||||||
@ -1286,7 +1537,7 @@ Program.prototype.setTitle = function(title) {
|
|||||||
// OSC Ps ; Pt BEL
|
// OSC Ps ; Pt BEL
|
||||||
// Reset colors
|
// Reset colors
|
||||||
Program.prototype.resetColors = function(param) {
|
Program.prototype.resetColors = function(param) {
|
||||||
if (this.tput && this.tput.Cr) {
|
if (this.tput.has('Cr')) {
|
||||||
return this.put.Cr(param);
|
return this.put.Cr(param);
|
||||||
}
|
}
|
||||||
return this.osc('112;' + param + '\x07');
|
return this.osc('112;' + param + '\x07');
|
||||||
@ -1296,7 +1547,7 @@ Program.prototype.resetColors = function(param) {
|
|||||||
// OSC Ps ; Pt BEL
|
// OSC Ps ; Pt BEL
|
||||||
// Change dynamic colors
|
// Change dynamic colors
|
||||||
Program.prototype.dynamicColors = function(param) {
|
Program.prototype.dynamicColors = function(param) {
|
||||||
if (this.tput && this.tput.Cs) {
|
if (this.has('Cs')) {
|
||||||
return this.put.Cs(param);
|
return this.put.Cs(param);
|
||||||
}
|
}
|
||||||
return this.osc('12;' + param + '\x07');
|
return this.osc('12;' + param + '\x07');
|
||||||
@ -1306,7 +1557,7 @@ Program.prototype.dynamicColors = function(param) {
|
|||||||
// OSC Ps ; Pt BEL
|
// OSC Ps ; Pt BEL
|
||||||
// Sel data
|
// Sel data
|
||||||
Program.prototype.selData = function(a, b) {
|
Program.prototype.selData = function(a, b) {
|
||||||
if (this.tput && this.tput.Ms) {
|
if (this.has('Ms')) {
|
||||||
return this.put.Ms(a, b);
|
return this.put.Ms(a, b);
|
||||||
}
|
}
|
||||||
return this.osc('52;' + a + ';' + b + '\x07');
|
return this.osc('52;' + a + ';' + b + '\x07');
|
||||||
@ -1833,20 +2084,13 @@ Program.prototype.setBackground = function(color, val) {
|
|||||||
Program.prototype.dsr =
|
Program.prototype.dsr =
|
||||||
Program.prototype.deviceStatus = function(param, callback, dec) {
|
Program.prototype.deviceStatus = function(param, callback, dec) {
|
||||||
if (dec) {
|
if (dec) {
|
||||||
return this.receive('\x1b[?' + (param || '0') + 'n', callback);
|
return this.response('device-status', '\x1b[?' + (param || '0') + 'n', callback);
|
||||||
}
|
}
|
||||||
return this.receive('\x1b[' + (param || '0') + 'n', callback);
|
return this.response('device-status', '\x1b[' + (param || '0') + 'n', callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
Program.prototype.getCursor = function(callback) {
|
Program.prototype.getCursor = function(callback) {
|
||||||
return this.deviceStatus('6', function(err, data) {
|
return this.deviceStatus('6', callback);
|
||||||
if (err) return callback(err);
|
|
||||||
data = data.slice(2, -1).split(';');
|
|
||||||
return callback(null, {
|
|
||||||
x: +data[1],
|
|
||||||
y: +data[0]
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1994,13 +2238,7 @@ Program.prototype.HPositionRelative = function(param) {
|
|||||||
// vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)
|
// vim responds with ^[[?0c or ^[[?1c after the terminal's response (?)
|
||||||
Program.prototype.da =
|
Program.prototype.da =
|
||||||
Program.prototype.sendDeviceAttributes = function(param, callback) {
|
Program.prototype.sendDeviceAttributes = function(param, callback) {
|
||||||
return this.receive('\x1b[' + (param || '') + 'c', function(err, response) {
|
return this.response('device-attributes', '\x1b[' + (param || '') + 'c', callback);
|
||||||
if (err) return callback(err);
|
|
||||||
if (response === '\x1b[?1;2c') {
|
|
||||||
return callback(null, 'VT100 with Advanced Video Option');
|
|
||||||
}
|
|
||||||
return callback(null, 'Unknown');
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// CSI Pm d
|
// CSI Pm d
|
||||||
@ -2717,7 +2955,7 @@ Program.prototype.setCursorStyle = function(param) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// extended tput.Se for param=2
|
// extended tput.Se for param=2
|
||||||
if (this.tput && this.tput.Ss) {
|
if (this.has('Ss')) {
|
||||||
return this.put.Ss(param);
|
return this.put.Ss(param);
|
||||||
}
|
}
|
||||||
return this.write('\x1b[' + (param || 1) + ' q');
|
return this.write('\x1b[' + (param || 1) + ' q');
|
||||||
@ -2811,18 +3049,11 @@ Program.prototype.manipulateWindow = function() {
|
|||||||
? args.pop()
|
? args.pop()
|
||||||
: function() {};
|
: function() {};
|
||||||
|
|
||||||
return this.receive('\x1b[' + args.join(';') + 't', callback);
|
return this.response('window-manipulation', '\x1b[' + args.join(';') + 't', callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
Program.prototype.getWindowSize = function(callback) {
|
Program.prototype.getWindowSize = function(callback) {
|
||||||
return this.manipulateWindow('18', function(err, data) {
|
return this.manipulateWindow('18', callback);
|
||||||
if (err) return callback(err);
|
|
||||||
data = data.slice(2, -1).split(';');
|
|
||||||
return callback(null, {
|
|
||||||
height: +data[0],
|
|
||||||
width: +data[1]
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// CSI Pt; Pl; Pb; Pr; Ps$ t
|
// CSI Pt; Pl; Pb; Pr; Ps$ t
|
||||||
@ -3025,15 +3256,15 @@ Program.prototype.decrqlp =
|
|||||||
Program.prototype.req_mouse_pos =
|
Program.prototype.req_mouse_pos =
|
||||||
Program.prototype.reqmp =
|
Program.prototype.reqmp =
|
||||||
Program.prototype.requestLocatorPosition = function(params, callback) {
|
Program.prototype.requestLocatorPosition = function(params, callback) {
|
||||||
if (this.tput && this.tput.req_mouse_pos) {
|
// See also:
|
||||||
// See also:
|
// get_mouse / getm / Gm
|
||||||
// get_mouse / getm / Gm
|
// mouse_info / minfo / Mi
|
||||||
// mouse_info / minfo / Mi
|
// Correct for tput?
|
||||||
// Correct for tput?
|
if (this.has('req_mouse_pos')) {
|
||||||
var code = this.tput.req_mouse_pos.apply(this.tput, params);
|
var code = this.tput.req_mouse_pos.apply(this.tput, params);
|
||||||
return this.receive(code, callback);
|
return this.response('locator-position', code, callback);
|
||||||
}
|
}
|
||||||
return this.receive('\x1b[' + (param || '') + '\'|', callback);
|
return this.response('locator-position', '\x1b[' + (param || '') + '\'|', callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
// CSI P m SP }
|
// CSI P m SP }
|
||||||
|
@ -335,7 +335,7 @@ function Screen(options) {
|
|||||||
process.on('uncaughtException', function(err) {
|
process.on('uncaughtException', function(err) {
|
||||||
reset();
|
reset();
|
||||||
if (err) console.error(err.stack ? err.stack + '' : err + '');
|
if (err) console.error(err.stack ? err.stack + '' : err + '');
|
||||||
return process.exit(0);
|
return process.exit(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
process.on('exit', function() {
|
process.on('exit', function() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user