终端新增私有模式,可向应用上报可见性状态
来源标题:Private Mode for Terminal Visibility Reports
一项新规范定义了 DEC 私有模式,让终端向应用上报自身是否可见。终端结合标签页、窗格和宿主平台的可见性信息,在状态变化时发送报告。应用可据此减少不可见时的高开销渲染,并通过 DECRQM 查询检测支持情况。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
终端应用即使在自己的输出不可见时,也可能执行开销很大的渲染工作。焦点报告解决不了这个问题:未获得焦点的终端可能仍然可见,而获得焦点的终端则可能被遮挡、被挂起,或显示在后台标签页中。 本规范定义了一个新的 DEC Private Mode,用于启用终端可见性报告: 可见性是一种建议性的、保守的状态。它综合了终端自身对其标签页、窗格和视图的了解,以及宿主平台提供的可见性信息。应用可以利用该报告,在终端视图不可见时减少开销大的视觉更新。 支持情况通过标准的 DECRQM 查询来检测: 终端以 DECRPM 响应: Ps 值为 0 或 4 表示不支持该模式。值为 1 表示报告已启用,值为 2 表示报告已禁用。 报告通过 DECSET 和 DECRST 启用和禁用: 每当终端收到 CSI ? 2033 h,它 MUST 立即报告当前的可见性状态,即使该模式此前已经启用。在该模式启用期间,每当实际可见性状态发生变化,终端 MUST 再发送一次报告。其他时候它 SHOULD NOT 发送重复报告。 可以在不启用变化报告的情况下请求当前可见性状态: 支持该功能的终端 MUST 回复一条可见性报告。此查询不会改变 private mode 2033。 查询响应和主动通知都使用同一种 private Device Status Report: 终端知道该终端视图通常不可被观察到。 应用 MUST 将未知值视为可能可见。 “可能可见”是刻意保守的。它并不保证任何终端单元格当前在屏幕上。只要可见性未知,或任何关联视图可能可被观察到,终端 MUST 报告 1。只有当终端确切知道该终端视图不可见时,它才 MUST 报告 2。 终端 MUST 针对与该终端会话关联的视图来确定可见性,而不仅仅是针对其顶层操作系统窗口。相关状态可能包括: 如果同一个终端会话显示在多个视图中,只要任一视图可能可被观察到,终端 MUST 报告“可能可见”。 在 macOS 上,实现可以把 NSWindow.occlusionState 作为一个输入。未设置的 NSWindowOcclusionStateVisible 位表示整个窗口被遮挡。已设置的位表示窗口边界框至少有一部分可见,因此必须按“可能可见”处理。 在 Wayland 上,实现可以把挂起的 xdg_toplevel 状态作为一个输入。挂起的 surface 可以被视为不可见;未挂起的 surface 必须被视为可能可见,除非终端有其他内部信息表明其视图被隐藏。 这些平台机制只是示例,不是要求。实现 SHOULD 使用所有可用的可靠平台状态和内部状态,并且 MUST 在存在不确定性时按“可能可见”处理。 “不可见”报告只是一个性能提示。当状态为 2 时,应用 MAY 暂停动画、合并视觉更新,或跳过其他开销大的呈现工作。它 SHOULD 继续处理输入,并更新生成下一帧所需的内部状态。 当状态恢复为 1 时,应用 SHOULD 渲染其最新的完整状态。应用 MUST NOT 假定终端会保持隐藏任何最短时长。 该模式与焦点报告相互独立。焦点表示哪个视图接收键盘输入;可见性表示输出是否可能被观察到。 应用首先检查是否支持可见性报告: A: \x1b[?2033$p T: \x1b[?2033;2$y 终端支持该模式,并报告它当前处于禁用状态。应用启用报告,终端立即报告该视图可能可见: A: \x1b[?2033h T: \x1b[?999;1n 终端视图变为完全隐藏,随后再次变为可见: T: \x1b[?999;2n T: \x1b[?999;1n 只需要当前状态的应用可以发出一次性查询:
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。