diff --git a/lib/gpmclient.js b/lib/gpmclient.js index 22802cb..2443e72 100644 --- a/lib/gpmclient.js +++ b/lib/gpmclient.js @@ -100,14 +100,20 @@ function GpmClient(options) { var pid = process.pid; // check tty for /dev/tty[n] - var tty = /tty[0-9]+$/.exec(fs.readlinkSync('/proc/' + pid + '/fd/0')); + var path; + try { + path = fs.readlinkSync('/proc/' + pid + '/fd/0'); + } catch (e) { + ; + } + var tty = /tty[0-9]+$/.exec(path); if (tty === null) { // TODO: should also check for /dev/input/.. } var vc; if (tty) { - var tty = tty[0]; + tty = tty[0]; vc = +/[0-9]+$/.exec(tty)[0]; } @@ -176,8 +182,8 @@ function GpmClient(options) { break; } }); + gpm.on('error', function(err) { - // console.log('GPM ERROR', err); self.stop(); }); }); diff --git a/lib/program.js b/lib/program.js index 12b4427..512feaf 100644 --- a/lib/program.js +++ b/lib/program.js @@ -469,11 +469,11 @@ Program.prototype._bindMouse = function(s, buf) { key.x = x - 32; key.y = y - 32; - if (key.x === -32) key.x = 255; - if (key.y === -32) key.y = 255; - if (this.zero) key.x--, key.y--; + if (x === 0) key.x = 255; + if (y === 0) key.y = 255; + mod = b >> 2; key.shift = !!(mod & 1); key.meta = !!((mod >> 1) & 1); @@ -570,6 +570,8 @@ Program.prototype._bindMouse = function(s, buf) { : button === 1 ? 'middle' : button === 2 ? 'right' : 'unknown'; + // NOTE: 0/32 = mousemove, 32/64 = mousemove with left down + // if ((b >> 1) === 32) this._lastButton = key.button; } @@ -1412,7 +1414,7 @@ Program.prototype.response = function(name, text, callback) { return callback(new Error('Timeout.')); }, 2000); - return this._write(text); + return this._twrite(text); }; Program.prototype._buffer = function(text) { @@ -1446,6 +1448,15 @@ Program.prototype._write = function(text) { return this.output.write(text); }; +// Example: `DCS tmux; ESC Pt ST` +// Real: `DCS tmux; ESC Pt ESC \` +Program.prototype._twrite = function(data) { + if (process.env.TMUX) data = '\x1bPtmux;\x1b' + data + '\x1b\\'; + // Should work but tmux doesn't implement ST correctly: + // if (process.env.TMUX) data = '\x1bPtmux;\x1b' + data + '\x07'; + return this._write(data); +}; + Program.prototype.echo = Program.prototype.write = function(text, attr) { return attr @@ -1870,10 +1881,10 @@ Program.prototype.setTitle = function(title) { // if (process.env.TMUX) { // return this._write('\x1b]2;' + title + '\x1b\\'); // } - return this._write('\x1bk' + title + '\x1b\\'); + return this._twrite('\x1bk' + title + '\x1b\\'); } - return this._write('\x1b]0;' + title + '\x07'); + return this._twrite('\x1b]0;' + title + '\x07'); }; // OSC Ps ; Pt ST @@ -1883,8 +1894,8 @@ Program.prototype.resetColors = function(param) { if (this.has('Cr')) { return this.put.Cr(param); } - return this._write('\x1b]112\x07'); - //return this._write('\x1b]112;' + param + '\x07'); + return this._twrite('\x1b]112\x07'); + //return this._twrite('\x1b]112;' + param + '\x07'); }; // OSC Ps ; Pt ST @@ -1894,7 +1905,7 @@ Program.prototype.dynamicColors = function(param) { if (this.has('Cs')) { return this.put.Cs(param); } - return this._write('\x1b]12;' + param + '\x07'); + return this._twrite('\x1b]12;' + param + '\x07'); }; // OSC Ps ; Pt ST @@ -1904,7 +1915,7 @@ Program.prototype.selData = function(a, b) { if (this.has('Ms')) { return this.put.Ms(a, b); } - return this._write('\x1b]52;' + a + ';' + b + '\x07'); + return this._twrite('\x1b]52;' + a + ';' + b + '\x07'); }; /** diff --git a/lib/tput.js b/lib/tput.js index df90749..e0fa247 100644 --- a/lib/tput.js +++ b/lib/tput.js @@ -732,7 +732,7 @@ Tput.prototype._compile = function(info, key, str) { try { str = fs.readFileSync(str, 'utf8'); if (this.debug) { - v = ('return "' + str + '";') + v = ('return ' + JSON.stringify(str) + ';') .replace(/\x1b/g, '\\x1b') .replace(/\r/g, '\\r') .replace(/\n/g, '\\n'); @@ -2058,7 +2058,8 @@ Tput.prototype.detectBrokenACS = function(info) { } // screen termcap is bugged? - if (info.name.indexOf('screen') == 0 + if (this.termcap + && info.name.indexOf('screen') == 0 && process.env.TERMCAP && ~process.env.TERMCAP.indexOf('screen') && ~process.env.TERMCAP.indexOf('hhII00')) { @@ -2180,7 +2181,7 @@ function sprintf(src) { var flags = (flag || '').split('') , param = params[i] != null ? params[i] : '' , initial = param - , width = +width + // , width = +width , opt = {} , pre = ''; @@ -2231,6 +2232,17 @@ function sprintf(src) { } }); + width = +width.split('.')[0]; + + // Should this be for opt.left too? + // Example: %2.2X - turns 0 into 00 + if (width && !opt.left) { + param = param + ''; + while (param.length < width) { + param = '0' + param; + } + } + if (opt.signs) { if (+initial >= 0) { pre += '+'; diff --git a/lib/widget.js b/lib/widget.js index 45dc987..6de3a96 100644 --- a/lib/widget.js +++ b/lib/widget.js @@ -4649,6 +4649,7 @@ List.prototype.select = function(index) { this.selected = index; this.value = this.ritems[this.selected]; + if (!this.parent) return; this.scrollTo(this.selected); }; @@ -4951,6 +4952,9 @@ Form.prototype.reset = function() { case 'terminal': el.write(''); return; + case 'image': + //el.clearImage(); + return; } el.children.forEach(fn); }); @@ -6732,25 +6736,20 @@ Terminal.prototype.bootstrap = function() { , s; if (self.term.urxvtMouse) { - s = '\x1b[' - + String.fromCharCode(b) - + ';' - + String.fromCharCode(x) - + ';' - + String.fromCharCode(y); - + 'M'; + if (self.screen.program.sgrMouse) { + b += 32; + } + s = '\x1b[' + b + ';' + (x + 32) + ';' + (y + 32) + 'M'; } else if (self.term.sgrMouse) { if (!self.screen.program.sgrMouse) { b -= 32; } - s = '\x1b[<' - + String.fromCharCode(b) - + ';' - + String.fromCharCode(x) - + ';' - + String.fromCharCode(y) + s = '\x1b[<' + b + ';' + x + ';' + y + (data.action === 'mousedown' ? 'M' : 'm'); } else { + if (self.screen.program.sgrMouse) { + b += 32; + } s = '\x1b[M' + String.fromCharCode(b) + String.fromCharCode(x + 32) @@ -6807,6 +6806,10 @@ Terminal.prototype.bootstrap = function() { self.screen.render(); }); + this.pty.on('exit', function(code) { + self.emit('exit', code || null); + }); + this.screen.on('keypress', function() { self.screen.render(); }); diff --git a/test/program-mouse.js b/test/program-mouse.js index 03e4df1..785d0aa 100755 --- a/test/program-mouse.js +++ b/test/program-mouse.js @@ -42,3 +42,7 @@ program.on('keypress', function(ch, data) { // program.getCursor(function(err, data) { // program.write(util.inspect(data)); // }); + +// program.manipulateWindow(18, function(err, data) { +// program.write(util.inspect(data)); +// });