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

标签 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 是字符位置,mousecode 与鼠标按钮有关。添加鼠标拖动消息似乎相当简单。谁能指出我字节应该是什么的方向?或者我错过了一个非常明显的障碍?我最感兴趣的是发送点击拖动到 vim,在 Connectbot for android 上运行。看起来这将是一件非常甜蜜的事情。

最佳答案

xterm 的 ctlseqs 可能是对终端鼠标模式最好的描述。文档。综上所述,当终端处于其中一种鼠标报告模式时,它会以以下形式发送事件

CSI M Ps Px Py

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

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

  • 位 0 到 1 对按钮编号进行编码; 02 用于按钮 1 到 3,或 3 用于释放(它不会对释放的按钮进行编码)
  • 如果按住 Shift 修饰符,则设置位 2(尽管大多数终端会在内部捕获鼠标,并且在这种情况下不会将其报告给应用程序)
  • 如果按住 Alt 修饰符,则设置位 3
  • 如果按住 Ctrl 修饰符,则设置位 4
  • 如果鼠标事件是拖动 Action 而不是按下,则设置位 5。
  • 位 6 设置为将鼠标按钮范围扩展到按钮 4 和 5,用于滚轮。

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

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

关于java - 如何让终端模拟器发送点击拖动消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10051074/

相关文章:

firebase - 如何在正确的目录中初始化firebase?

java - 如何获取任意按下的键值

java - 使用 mockito 的 Gradle testCompile 找不到包

Java - 背景重绘时的图形故障

vim - 如何在vim中自动添加版本号?

vim - 如何在 VIM 中折叠 YAML 项目?

Java检测连接错误

vim - 如何在 vim 中交换两行?

python - 如果使用颜色提示,如何修复 Python readline 中的列计算

python - 如何在 Python IDLE Shell 中获取终端高度(以行为单位)?