【问题标题】:How to have a terminal emulator send click drag messages?如何让终端模拟器发送点击拖动消息?
【发布时间】:2012-04-20 12:28:05
【问题描述】:

我是一名业余程序员,有兴趣在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 上运行。似乎拥有它会是一件非常甜蜜的事情。

【问题讨论】:

    标签: java vim terminal emulation xterm


    【解决方案1】:

    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 位
    • 如果鼠标事件是拖动而不是按下,则设置第 5 位。
    • 第 6 位设置为将鼠标按钮范围扩展到按钮 4 和 5,用于滚轮。

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

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

    【讨论】:

    • 非常感谢!正是我要找的...我打算只发送鼠标信号看看它是否有效,不确定如何处理 DECSM 代码...
    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 2019-12-10
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2015-05-06
    • 1970-01-01
    相关资源
    最近更新 更多