1

在我的 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 协议)。像这些:

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

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

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

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

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

4

2 回答 2

1

这是几个问题:

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

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

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 在此处输入图像描述

于 2017-10-10T10:19:53.297 回答