(鼠标)滚轮和/或滚动的正确 XTERM/ANSI 顺序是什么,最好不需要 X、Y 坐标?

What is the correct XTERM/ANSI sequence for (mouse) wheel and or scroll, preferably that doesnt require X,Y coordinates?

在我的 xterm.js 终端上,我有 touchmove 事件通过滑动发送光标键,scroll/wheel 通过滑动左边缘和底部边缘(对于终端 'application mode')。光标键滑动效果很好,但我似乎找不到鼠标滚轮或滚动的有效代码。现在我在相反的方向上使用两个或四个光标键代码来模仿边缘上的 wheel/scroll,这没问题,但不是我想要的行为。它应该逐行滚动,只垂直移动文本,而不是光标。

我正在寻找的一个行为示例是 Android 的 Termux 终端应用程序,它在 'application mode' 中向上或向下滑动时发送鼠标滚轮 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 协议)。喜欢这些:

^[[<65;82;14M ^[[<64;83;12M

我的理解是这应该分别是“\x1b[<65;82;14M”和“\x1b[<64;83;12M”,第二个和第三个数字是X,Y 'pointer' 坐标(在 'characters' 中)。但即使是剪切和粘贴,用文字 Escape 替换“^[”,似乎也不起作用。

我查看了大量关于 ANSI 和 Xterm 代码的文件,但似乎找不到任何有用的东西。

我在这里错过了什么?鳄鱼支架是字面意思吗?它象征着别的东西吗?照原样,我没有从 xterm.js 那里得到明显的反应。把它拿出来,每次事件触发时我都会打印出剩余的代码。

我还尝试了各种滚动序列,advance/negative 行 index/LF 来自多种终端类型,但到目前为止 none 在 Midnight Commander 或其他使用 'application mode' 或 'alternate screen buffer'.

这是几个问题:

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

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

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

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

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

中的鼠标滚轮响应

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

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

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

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

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