detect bugged vte mouse better. see #89.
This commit is contained in:
parent
c243415049
commit
a2afbe54bc
|
@ -407,15 +407,31 @@ Program.prototype._bindMouse = function(s, buf) {
|
|||
// under 0x20, but since VTE can have the bytes overflow, we can consider
|
||||
// bytes below 0x20 to be up to 0xff + 0x20. This gives a limit of 287. Since
|
||||
// characters ranging from 223 to 248 confuse javascript's utf parser, we
|
||||
// need to parse the raw binary.
|
||||
if (this.isVTE && buf[0] === 0x1b && buf[1] === 0x5b && buf[2] === 0x4d) {
|
||||
// need to parse the raw binary. We can detect whether the terminal is using
|
||||
// a bugged VTE version by examining the coordinates and seeing whether they
|
||||
// are a value they would never otherwise be with a properly implemented x10
|
||||
// protocol. This method of detecting VTE is only 99% reliable because we
|
||||
// can't check if the coords are 0x00 (255) since that is a valid x10 coord
|
||||
// technically.
|
||||
var bx = s.charCodeAt(4);
|
||||
var by = s.charCodeAt(5);
|
||||
if (buf[0] === 0x1b && buf[1] === 0x5b && buf[2] === 0x4d
|
||||
&& (this.isVTE
|
||||
|| bx >= 65533 || by >= 65533
|
||||
|| (bx > 0x00 && bx < 0x20)
|
||||
|| (by > 0x00 && by < 0x20)
|
||||
|| (buf[4] > 223 && buf[4] < 248 && buf.length === 6)
|
||||
|| (buf[5] > 223 && buf[5] < 248 && buf.length === 6))) {
|
||||
var b = buf[3]
|
||||
, x = buf[4]
|
||||
, y = buf[5];
|
||||
|
||||
if (x < 0x20) x += 255;
|
||||
if (y < 0x20) y += 255;
|
||||
// unsigned char overflow.
|
||||
if (x < 0x20) x += 0xff;
|
||||
if (y < 0x20) y += 0xff;
|
||||
|
||||
// Convert the coordinates into a
|
||||
// properly formatted x10 utf8 sequence.
|
||||
s = '\x1b[M'
|
||||
+ String.fromCharCode(b)
|
||||
+ String.fromCharCode(x)
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
var blessed = require('../')
|
||||
, util = require('util')
|
||||
, program;
|
||||
|
||||
program = blessed.program({
|
||||
|
@ -19,7 +20,7 @@ program.on('mouse', function(data) {
|
|||
program.cup(data.y, data.x);
|
||||
program.write(' ', 'blue bg');
|
||||
program.cup(0, 0);
|
||||
console.log(data);
|
||||
program.write(util.inspect(data));
|
||||
});
|
||||
|
||||
program.key(['q', 'escape', 'C-c'], function() {
|
||||
|
@ -33,15 +34,15 @@ program.on('keypress', function(ch, data) {
|
|||
if (data.name === 'mouse') return;
|
||||
program.clear();
|
||||
program.cup(0, 0);
|
||||
console.log(data);
|
||||
program.write(util.inspect(data));
|
||||
});
|
||||
|
||||
program.on('mouse-debug', function(data) {
|
||||
program.cup(20, 0);
|
||||
data = Array.prototype.slice.call(data);
|
||||
console.log(data);
|
||||
program.write(util.inspect(data));
|
||||
});
|
||||
|
||||
// program.getCursor(function(err, data) {
|
||||
// console.log(data);
|
||||
// program.write(util.inspect(data));
|
||||
// });
|
||||
|
|
Loading…
Reference in New Issue