来自Xterm 控制序列文档:
正常跟踪模式在按下和释放按钮时都会发送转义序列。修饰键(shift、ctrl、meta)信息也会被发送。通过将参数 1000 指定为 DECSET 来启用它。按下或释放按钮时,xterm发送 CSI MC b C x C y。
的低两位Cb编码按钮信息:0=MB1 按下,1=MB2 按下,2=MB3 按下,3=释放。
接下来的三位对按下按钮时按下的修饰符进行编码并添加在一起:4=Shift、8=Meta、16=Control。但请注意,移位和控制位通常不可用,因为xterm对弹出菜单使用带有鼠标的控制修饰符,并且在按钮事件的默认翻译中使用 Shift 修饰符。这元xterm 识别的修饰符是模1mask,并且不一定是“Meta”键(参见xmodmap(1))。
Cx和CY是鼠标事件的 x 和 y 坐标,以 X10 模式编码。
例如,当在 (1, 1) 处按下 Shift 左键单击,在 (2, 2) 处按下 Control 右键单击,在 (3, 3) 处释放左键单击,在 (() 处释放右键单击时会发生什么情况4, 4)?
难道你不会得到
ESC [ M 0000100 ! !
ESC [ M 0010001 " "
ESC [ M 0000011 # #
ESC [ M 0000011 $ $
在你的标准输入中?在客户端程序中应该如何处理?怎么可能呢?
控制序列文档非常难以阅读,这使得这变得不必要的困难。
答案1
该文档在这里回答了这个问题:
Cb编码的低两位按钮信息:0=MB1 按下,1=MB2 按下,2=MB3 按下,3=释放。
也就是说,您无法使用正常跟踪模式协议。这是模棱两可的。
关于不明确的按钮释放的问题已在扩展坐标通过 SGR (1006) 代码:
- 不同的最终字符用于按钮释放,以解决 X10 关于释放哪个按钮的歧义。
为了获得最佳的可读性,PDF有效(纯文本排在最后)。
然而,问题询问的是很少使用的情况,因为Shift修饰符通常用于“始终”选择/粘贴,而Control修饰符通常用于激活菜单。这些功能是可选的(请参阅手册页描述omitTranslation
也allowMouseOps
)。当然,如果您实际上并不是在询问 xterm,则无法猜测终端可能会做什么,因为没有一个xterm-相似者记录所有这些。
答案2
此外,这种格式完全忽略了具有更多按钮的鼠标。
好吧,你引用的那一段之后的下一段说:
滚轮鼠标可能会返回按钮 4 和 5。这些按钮分别由与按钮 1 和 2 相同的事件代码表示,只不过事件代码中添加了 64。不报告滚轮按钮的释放事件