如何让终端模拟器发送点击拖动消息?

时间:2012-04-07 01:48:09

标签: java vim terminal emulation xterm

我是一名业余程序员,有兴趣在http://javassh.org/download/source/de/mud/terminal/vt320.html向vt320终端模拟器添加点击拖动方法。我正在查看鼠标按键功能的来源并发现了这个:

byte b[] = new byte[6];
b[0] = 27;
b[1] = (byte) '[';
b[2] = (byte) 'M';
b[3] = (byte) mousecode;
b[4] = (byte) (0x20 + x + 1);
b[5] = (byte) (0x20 + y + 1);

write(b); // FIXME: writeSpecial here

其中x和y是字符位置,鼠标代码与鼠标按钮有关。似乎相当直接添加鼠标拖动消息。任何人都可以指出我的字节应该是什么方向?或者我错过了一个非常明显的障碍?我最感兴趣的是发送click-drag到vim,在Connectbot for android上运行。这似乎是一件非常好的事情。

1 个答案:

答案 0 :(得分:2)

终端鼠标模式可能是xterm的ctlseqs文档最好描述的。总之,当终端处于鼠标报告模式之一时,它以

的形式发送事件

CSI M Ps Px Py

其中CSI是单个C1 CSI控制(0x9b)或双字节序列ESC(0x1b)[。

Ps,Px和Py将“status”,x和y坐标编码为单个字节,偏移0x20以确保它是GL可打印而不是C0控制字节。 Px和Py应该是显而易见的。 Ps是一个包含以下字段的位掩码:

  • 位0到1编码按钮编号;按钮1到3为02,或者发布版本为3(它不对已发布的按钮进行编码)
  • 如果保留Shift修饰符,则设置位2(尽管大多数终端将在内部捕获鼠标,而不是在此条件下向应用程序报告)
  • 如果保留Alt修饰符
  • ,则设置位3
  • 如果保持Ctrl修饰符
  • ,则设置位4
  • 如果鼠标事件是拖动动作而不是按下,则设置位5。
  • 位6设置为将鼠标按钮范围扩展到用于滚轮的按钮4和5。

有三种鼠标模式使用此报告,全部由DECSM设置;设置DEC私有模式(CSI?Pn h):

  • 模式1000仅报告鼠标按下和释放事件
  • 模式1002报告按住按钮(拖动)时的鼠标按下,释放和动作
  • 即使没有按钮,模式1003也会报告鼠标按下,释放和动作事件