【问题标题】:What is the correct XTERM/ANSI sequence for (mouse) wheel and or scroll, preferably that doesnt require X,Y coordinates?(鼠标)滚轮和/或滚动的正确 XTERM/ANSI 序列是什么,最好不需要 X,Y 坐标?
【发布时间】:2017-10-08 05:56:58
【问题描述】:

在我的 xterm.js 终端上,我有 touchmove 事件来通过滑动发送光标键,并通过滑动左右边缘来滚动/滚轮(对于终端“应用程序模式”)。光标键滑动效果很好,但我似乎找不到鼠标滚轮或滚动的有效代码。现在我使用两个或四个相反方向的光标键代码来模拟边缘上的滚轮/滚动,这没关系,但不是我想要的行为。它应该逐行滚动,仅垂直移动文本,而不是光标。

我正在寻找的行为示例是适用于 Android 的 Termux 终端应用程序,它在“应用程序模式”中向上或向下滑动时会发送鼠标滚轮 xterm/ansi 代码。详情...

测试设置是 Bash 中的 Midnight Commander,使用 xterm.js 和 Termux、'cat -A' 或 'sed -n l' 来获取非打印文件的视觉效果。

在 Termux 中,通过 ssh 连接到安装了 MC 的服务器。运行“mc”。通过关闭wifi或其他方法突然断开连接。运行“cat -A”或“sed -n l”。上下滑动。您应该获得鼠标滚轮“ANSI”代码的符号(实际上显然是 xterm 协议)。像这些:

^[[

我的理解是这应该分别表示“\x1b[

我浏览了大量关于滚轮或滚动的 ANSI 和 Xterm 代码的文档,但似乎找不到任何有效的方法。

我在这里缺少什么?鳄鱼括号是文字吗?它是否象征着别的东西?照原样,我没有从 xterm.js 得到明显的反应。把它拿出来,每次事件触发时我都会打印出剩余的代码。

我还尝试了从多种终端类型进行滚动、前进/负行索引/LF 的各种序列,但到目前为止,在 Midnight Commander 或其他使用“应用程序模式”或“备用屏幕缓冲区”的实用程序中,没有一个能产生滚动.

【问题讨论】:

    标签: ansi xtermjs


    【解决方案1】:

    这是几个问题:

    • “鳄鱼括号”不是文字。那是两个字符 Escape[,因为 ASCII escape 通常打印为^[
    • 在备用屏幕中,您的终端可能只发送向上/向下光标转义而不是 xterm 的 SGR 模式(以 M 结尾的序列)。
    • 更改 TERM 不应影响鼠标的工作方式,尽管已知某些应用程序具有基于该变量的硬编码行为。

    【讨论】:

    • 是的,实际上 ("\x1b" + '[
    • 我明白了:< 是协议的一部分,将序列表示为 private 控制序列。 XTerm Control Sequences 中的“使用 CSI ”不是错字。
    • 是的,完全正确。 Xterm 通过他们自己的小 ansi 风格的控制序列迷你协议传输鼠标事件。基本上,表示按钮编号、单击或释放以及单元格坐标。在这种情况下,鼠标滚轮被视为按钮 4 和 5,已释放。 "\x1b[
    • 关于你提到的模式,我用过的大多数 xterm 都在 Midnight Commander 中为真实的鼠标滚轮事件发送上述两个序列,但在常规命令提示符下发送光标箭头键的序列.我相信终端通常会检测它是否处于“应用程序模式”,以确定在任一上下文中发送哪些代码。现在它在 MC 中工作,但在常规命令提示符下打印序列。我应该检查“应用程序模式”以确定何时发送箭头键吗?或者别的什么,比如告诉它使用 SGR??
    • xterm模仿者(不要混淆两者)。
    【解决方案2】:

    最后,我发现我必须为 Button 4 和 5 释放事件提供鼠标滚动的 xterm 序列以及活动单元格坐标(按行和列)。即:

    sock.send("\x1b[<65;"+xcol+';'+yrow+'M');  // SCROLL UP '[<65'
    

    sock.send("\x1b[<64;"+xcol+';'+yrow+'M');  // SCROLL DN '[<64'
    

    我发现了其他滚动行为的工作代码,但它们主要在应用程序模式之外工作。 "\x1b"、"\u001b" 和 "\033" 都 match() 与 Escape 相同。 xcol 和 yrow 是终端上单元格中的实时“指针”坐标,而不是像素。发送静态坐标似乎不起作用。基准测试包括检查 Midnight Commander、mcedit、less 和 bash 中的鼠标滚轮响应。

    在 xterm.js 源代码中,有为真正的鼠标执行此操作的代码。我得到了 touchmove 事件坐标并使用它的变体将它们转换为字符单元坐标,然后根据沿滑动手势的位置,通过这两个代码之一定期通过 websocket 发送它们。这有效地模拟了服务器上的鼠标滚轮事件,允许在 xterm 的“应用程序模式”中滚动以进行触摸。

    进一步的增强是检测应用程序模式,并在不使用时发送向上和向下箭头。

    实际工作代码的屏幕截图,突出显示 px 到单元格坐标的转换,以及 xterm 鼠标滚轮序列:

    附录:pageX/pageY 转换为 col/row 以发送 xterm sgr 鼠标事件的屏幕截图和 URL。

    http://docs.xtermjs.org/src_xterm.js.html

    【讨论】:

    • 嘿,你有没有发现左右滚轮按钮的控制序列?
    • 好问题。我认为他们可能不在协议中。如果它们是,它们可能是 ESC+66 和 ESC+67,加上列/行中的鼠标坐标。向上/向下滚动的滚轮移动是按钮 4 和 5 到 xterm,因此如果它支持左/右,它们将被视为按钮 6 和 7。就像这种向上滚动“按钮”的模式: ("\x1b[
    • 道歉顺便说一句,如果我是多余的,只是想确保你有所有的细节可以使用。也感谢您的赞许。
    • 感谢您的详细回复!这几乎就是我的想法,尽管使用八进制 \033 代替十六进制 \x1b,但它不起作用 - 除了 66 和 67 之外的其他几个值也没有。我猜这是一个模式问题 - 你的答案提到application mode,查看终端仿真器源代码,有一堆 标准和协议。在 vim 插入模式下,您可以按 control-v,然后用鼠标滚轮滚动,查看 vim 收到的字符序列。
    • 正确。回到 Midnight Commander,如果你在编辑器中有一堆文本,它会移动光标。如果您在文件查看器中,如果您设置为不换行并且您的行长于终端的列宽,它将移动视图。
    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 2011-09-29
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多