扩展能力协议¶
在 0.50.0 版本加入.
一组终端扩展共用同一种封装:OSC 777 后接指明扩展的选择器、协议版本和 key=value 字段。数位板指针、滚动、手势及画面呈现协议都采用这种方式。每项扩展都能用自己的 query 探测,但慢速连接另一端的程序每次探测都要付出一次往返延迟;经中继重连后恢复的程序,也需要知道之前启用的模式是否仍然有效。本协议通过一次交换回答这两个问题。它与其他协议一样,是小巧、低干扰、易于实现的开放终端扩展,不改变 TTY 的本质。
消息封装¶
消息使用带有 caps 选择器的 OSC 777::
<OSC> 777 ; caps ; v=1 : op=query : id=42 <ST>
消息遵循 OSC 777 扩展封装 中规定的共用规则,包括字段语法、拒绝哪些帧、单位、时钟,以及高负载时哪些报告可以合并。协议版本 v 为 1;op 为 query、cap 或 reset。终端仅发送回复,且回复绝不合并或丢弃。
列出扩展¶
程序询问终端支持哪些选择器::
<OSC> 777 ; caps ; v=1 : op=query : id=42 <ST>
id 是程序自行选择的非负 31 位整数,回复会原样返回,以便匹配查询。终端回答::
<OSC> 777 ; caps ; v=1 : op=cap : id=42 : caps=3 : ext=caps.1,frame.1,gesture.1 : media=d,f,t,s : format=24,32,100 <ST>
caps 是该选择器支持能力的位集合:1 表示列举功能,2 表示下述重置请求。ext 以逗号分隔、顺序不定,列出终端接受的全部选择器,每项后接句点和该选择器支持的最高协议版本。其中始终包含 caps.1。列表只表示终端认识该选择器;当前显示器和输入设备实际能做什么,仍需通过该选择器自己的 query 查询。程序现在只需查询自己打算使用的选择器;由于回复按顺序到达,这些查询可与本查询在同一次写入中发送。
同一终端的全部窗口得到相同答案,且终端运行期间不会变化,因此程序只需查询一次。不支持本协议的终端会忽略查询;程序必须设置超时,随后可回退为逐个探测所需选择器。
图形传输介质与格式¶
同一回复还说明终端接受 图形协议 的哪些传输介质和像素格式。media 列出 t 键的值:d 直接传输、f 文件、t 临时文件、s 共享内存,以及扩展新增的介质,例如 GPU 表面的 g。format 列出 f 键的值:24 RGB、32 RGBA、100 PNG,以及扩展新增的格式,例如 HDR 图像的 64 和矢量图像的 200。两者描述终端接受什么,而非某条连接上应选什么;具体图像仍可用图形协议自身的查询操作(a=q)检查。中继应按自己能传送至后端终端的能力回答:文件、共享内存和 GPU 表面不能跨机器传输,因此网络中继只提供 d。
读取模式¶
多数选择器有一个按窗口设置的模式,程序通过 op=mode : mode=1 启用,通过 mode=0 关闭。不带 mode 字段的 mode 请求表示读取,回复当前状态::
<OSC> 777 ; frame ; v=1 : op=mode <ST>
<OSC> 777 ; frame ; v=1 : op=mode : mode=1 <ST>
每个具有模式的选择器,其 cap 回复也包含同值的 mode 字段,因此一次 query 即可得知选择器提供什么,以及模式是否开启。终端可允许用户针对全部或部分程序拒绝某个模式或部分位。被拒绝的位读回为关闭,且不会产生本应由该位启用的报告。因此程序设置模式后应读回,而不是假定请求已获准。回复使用请求中的版本号。不支持的选择器不会回答这两类请求,这正是前述列举功能的用途。
关闭全部模式¶
各选择器均要求程序在退出、挂起或失败之前关闭自己启用的模式。被强制终止的程序无法做到这一点,遗留状态带来的问题不只是配色残留:滚动模式会阻止滚轮滚动回滚缓冲区,工具报告会让笔无法再执行点击。一条请求即可关闭窗口的全部模式::
<OSC> 777 ; caps ; v=1 : op=reset <ST>
其效果等同于向每个具有模式的选择器发送 op=mode : mode=0,并执行关闭模式所需的其他动作,例如为进行中的接触和手势发送 cancel 报告。无模式的选择器不受影响,非扩展模式的状态不受影响,也不产生回复。shell、包装脚本或监督进程可代替已经退出的程序发送该请求;程序启动时也可发送,以从已知状态开始。支持请求的终端在能力列表的 caps 中设置位 2;不支持的终端将其忽略。
每当 shell 像 kitty 的 shell 集成那样,用 OSC 133 ; A 标记提示符开始时,kitty 也会自动执行这一重置。提示符意味着 shell 正在读取输入,之前设置模式的程序已不再控制窗口;否则绘图程序崩溃后,用户可能面对无法滚动的提示符。通常没有模式开启,此时提示符标记不增加开销,也不发送内容。由此可知:
shell 启动的程序不受影响,因为标记发生在命令开始前。通过作业控制挂起的程序恢复时,其模式已关闭;这也符合每个选择器要求程序作出的假设。
自行标记提示符并使用模式的程序,例如带绘图控件的 shell,每次都应在标记提示符之后启用模式。
中继与多路复用器¶
对于重建屏幕、而非字节透传的多路复用器或中继,它应自行回答能力列表,内容是自身能传送的选择器与后端终端公布的选择器的交集,确保程序不会看到无法抵达显示器的能力。模式应与其他终端状态一起保存。重连后的程序应读回所依赖的模式,而不是假定它们仍然存在,因为另一端的终端可能已被 RIS 重置;必要时重新开启。
多路复用器将重置请求应用于发出请求的窗格,再重新计算自己对后端终端的需求;其他窗格仍启用某模式时,不应继续转发重置请求。提示符标记同理:如果将各窗格的标记转发给遇标记即重置的终端,任何窗格出现提示符都会关闭终端模式,因此多路复用器应拦截标记或重新开启所需模式。字节透传中继则原样转发请求。