River window management

帧完美窗口管理

此协议允许单个"窗口管理器"客户端决定合成器的窗口管理策略。状态是全局双缓冲的,允许涉及多个窗口的帧完美状态变更。

本文档中的关键词"必须"、"不得"、"要求"、"应当"、"不应"、 "建议"、"不宜"、"推荐"、"可以"和"可选"应按照 IETF RFC 2119 中的描述进行解释。

窗口管理器全局接口

此全局接口应仅向窗口管理器进程通告。同一时间只能有一个窗口管理客户端处于活动状态。如有必要,合成器应使用 unavailable 事件来强制执行此限制。

此协议管理的状态分为两个互不相交的类别:

窗口管理状态影响服务器与各个窗口客户端(例如 xdg_toplevel)之间的通信。窗口管理状态包括窗口尺寸、全屏状态、键盘焦点、键盘绑定等。

渲染状态仅影响合成器的渲染输出,不影响服务器与各个窗口客户端之间的通信。渲染状态包括窗口的位置和渲染顺序、shell surface、装饰表面、边框等。

窗口管理状态只能由窗口管理器作为 manage 序列的一部分进行修改。manage 序列以 manage_start 事件开始,以 manage_finish 请求结束。在 manage 序列之外修改窗口管理状态属于协议错误。

manage 序列之后总是跟随至少一个 render 序列。render 序列以 render_start 事件开始,以 render_finish 请求结束。

渲染状态可以在 manage 序列或 render 序列期间由窗口管理器修改。无论渲染状态何时被修改,它都会在下一个 render_finish 请求时被应用。在 manage 或 render 序列之外修改渲染状态属于协议错误。

服务器将在状态发生变化需要与窗口管理器通信时,尽快发送新状态和 manage_start 事件来启动 manage 序列。

如果窗口管理器客户端需要确保因合成器未感知的状态变更而启动 manage 序列,可以发送 manage_dirty 请求。

服务器将在渲染状态发生变化需要与窗口管理器通信时,尽快发送新状态和 render_start 事件来启动 render 序列。服务器可以选择在同一个 manage 序列之后发送多个 render 序列,但在实际应用中不太可能需要这样做。

此协议中概述的双序列设计是必要的,因为渲染状态和窗口管理状态是独立变化的。渲染状态的变化频率远高于窗口管理状态(大约每帧一次),而窗口管理状态仅在用户交互、客户端响应大小调整或类似事件时发生变化。

stop()
停止发送事件

此请求表示客户端不再希望接收此对象上的事件。

Wayland 协议是异步的,这意味着在 stop 请求被处理之前,服务器可能会继续发送事件。客户端必须等待 river_window_manager_v1.finished 事件后才能销毁此对象。

destroy()
销毁 river_window_manager_v1 对象

此请求应在收到 finished 事件后调用,以完成对象的销毁。

如果客户端希望销毁此对象,应发送 river_window_manager_v1.stop 请求并等待 river_window_manager_v1.finished 事件。收到 finished 事件后,即可安全销毁此对象以及通过此接口创建的任何其他对象。

manage_finish()
完成 manage 序列

此请求表示客户端已完成当前 manage 序列中所有希望包含的窗口管理状态变更,服务器应原子性地将这些状态变更发送到窗口并继续 manage 序列。

发送此请求后,在收到下一个 manage_start 事件之前,客户端再进行窗口管理状态的变更将属于协议错误。

有关 manage/render 序列循环的完整概述,请参见 river_window_manager_v1 接口的描述。

manage_dirty()
确保 manage 序列被启动

此请求确保启动 manage 序列并由服务器发送 manage_start 事件。如果在进行中的 manage 序列期间发出此请求,新的 manage 序列将在当前序列完成后立即启动。

客户端可能因合成器未感知的内部状态变更(例如 dbus 事件)而需要使用此请求,该变更可能影响窗口管理或渲染状态。

render_finish()
完成 render 序列

此请求表示客户端已完成当前序列中所有希望包含的渲染状态变更,服务器应原子性地应用并向用户显示这些状态变更。

发送此请求后,在收到下一个 manage_start 或 render_start 事件(以先到者为准)之前,客户端再进行渲染状态的变更将属于协议错误。

有关 manage/render 序列循环的完整概述,请参见 river_window_manager_v1 接口的描述。

get_shell_surface(id: new_id<river_shell_surface_v1>, surface: object<wl_surface>)
参数
类型
描述
idnew_id<river_shell_surface_v1>
surfaceobject<wl_surface>
分配 river_shell_surface_v1 surface 角色

为窗口管理器 UI 创建新的 shell surface,并为该 surface 分配 river_shell_surface_v1 角色。

提供已有角色或已附加/提交 buffer 的 wl_surface 属于协议错误。

unavailable()
窗口管理不可用

此事件表示窗口管理对客户端不可用,可能是因为另一个窗口管理客户端已在运行。导致发送此事件的具体情况由合成器策略决定。

如果发送此事件,它保证是服务器发送的第一个也是唯一的事件。

服务器将不会在此对象上发送更多事件。客户端应销毁此对象以及通过此接口创建的所有对象。

finished()
服务器已完成窗口管理器

此事件表示服务器将不会在此对象上发送更多事件。客户端应销毁该对象。详见 river_window_manager_v1.destroy。

manage_start()
开始 manage 序列

此事件表示服务器已发送自上一个 manage 序列以来所有状态变更的事件。

响应此事件,客户端应按需发出修改窗口管理状态的请求。然后,客户端必须发出 manage_finish 请求。

有关 manage/render 序列循环的完整概述,请参见 river_window_manager_v1 接口的描述。

render_start()
开始 render 序列

此事件表示服务器已发送所有必要的 river_node_v1.position 和 river_window_v1.dimensions 事件。

响应此事件,客户端应按需发出修改渲染状态的请求。然后,客户端必须发出 render_finish 请求。

有关 manage/render 序列循环的完整概述,请参见 river_window_manager_v1 接口的描述。

session_locked()
会话已被锁定

此事件表示会话已被锁定。

窗口管理器可能希望限制锁定期间可用的按键绑定或以其他方式使用此信息。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

session_unlocked()
会话已解锁

此事件表示会话已解锁。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

window(id: new_id<river_window_v1>)
参数
类型
描述
idnew_id<river_window_v1>
新窗口

新窗口已创建。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

output(id: new_id<river_output_v1>)
参数
类型
描述
idnew_id<river_output_v1>
新输出

新的逻辑输出已创建,可能是因为插入了新的物理显示器或配置发生了变更。

在服务器发送所有其他新状态后,此事件之后将跟随 river_output_v1.position 和 dimensions 事件以及一个 manage_start 事件。

seat(id: new_id<river_seat_v1>)
参数
类型
描述
idnew_id<river_seat_v1>
新 seat

新 seat 已创建。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

参数
描述
sequence_order0
请求违反了 manage/render 序列顺序
role1
给定的 wl_surface 已有角色
unresponsive2
窗口管理器无响应

逻辑窗口

表示一个逻辑窗口。例如,一个窗口可能对应一个 xdg_toplevel 或 Xwayland 窗口。

新创建的窗口不会被显示,直到窗口管理器在 manage 序列中通过 propose_dimensions 请求提议窗口尺寸,服务器在 render 序列中以 dimensions 事件回复,并且该 render 序列完成。

destroy
类型: destructor
destroy()
销毁窗口对象

此请求表示客户端将不再使用此窗口对象,可以安全销毁。

此请求应在收到 river_window_v1.closed 事件或 river_window_manager_v1.finished 事件后发出,以完成窗口的销毁。

close()
请求关闭窗口

请求关闭窗口。窗口可能会忽略此请求或仅在延迟一段时间后关闭,例如弹出对话框询问用户是否保存工作等。

如果/当窗口被关闭时,服务器将发送 river_window_v1.closed 事件。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

get_node(id: new_id<river_node_v1>)
参数
类型
描述
idnew_id<river_node_v1>
获取窗口的渲染列表节点

获取渲染列表中对应此窗口的节点。

对单个窗口多次发出此请求属于协议错误。

propose_dimensions(width: int, height: int)
参数
类型
描述
widthint
heightint
提议窗口尺寸

此请求在合成器的逻辑坐标空间中为窗口提议尺寸。

宽度和高度必须大于或等于零。如果宽度或高度为零,窗口将被允许自行决定尺寸。

窗口可能不会采用提议的确切尺寸。窗口实际采用的尺寸将在后续的 river_window_v1.dimensions 事件中发送。例如,终端模拟器可能只允许单元格大小倍数的尺寸。

当发出 propose_dimensions 请求时,服务器必须尽快发送 dimensions 事件作为响应。如果窗口响应第一次提议的尺寸时间过长,可能无法在下一个 render 序列中发送 dimensions 事件。在这种情况下,服务器将在未来的 render 序列中发送 dimensions 事件。在收到第一个 dimensions 事件且 render 序列完成之前,窗口不会被显示。

注意,river_window_v1 的尺寸指的是窗口内容的尺寸,不受边框或装饰表面的影响。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

hide()
请求隐藏窗口

请求隐藏窗口。如果窗口已隐藏则无效果。同时隐藏所有窗口边框和装饰。

新创建的窗口被视为已显示,除非通过 hide 请求明确隐藏。

此请求修改渲染状态,只能作为 render 序列的一部分发出,参见 river_window_manager_v1 描述。

show()
请求显示窗口

请求显示窗口。如果窗口未隐藏则无效果。不保证窗口可见,因为它可能被放置在其上方的其他窗口完全遮挡。

新创建的窗口被视为已显示,除非通过 hide 请求明确隐藏。

此请求修改渲染状态,只能作为 render 序列的一部分发出,参见 river_window_manager_v1 描述。

use_csd()
通知客户端使用 CSD

通知客户端使用客户端装饰(CSD),自行绘制标题栏、边框等。

如果从未发出此请求或 use_ssd 请求,这是默认行为。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

use_ssd()
通知客户端使用 SSD

通知客户端使用服务端装饰(SSD),不绘制任何客户端装饰。

如果客户端仅支持客户端装饰,此请求将无效,参见 decoration_hint 事件。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

set_borders(edges: uint<river_window_v1.edges>, width: int, r: uint, g: uint, b: uint, a: uint)
参数
类型
描述
edgesuint<river_window_v1.edges>
widthint
ruint
guint
buint
auint
设置窗口边框

此请求在窗口的指定边缘上由合成器绘制边框来装饰窗口。边框绘制在窗口内容之上。

角部仅在相邻边缘的边框之间绘制。例如,如果左边缘有边框而上边缘没有,左边缘绘制的边框不会在窗口上边缘之上垂直延伸。

窗口全屏时不绘制边框。

颜色由四个 32 位 RGBA 值定义。除非在另一个协议扩展中指定,否则 RGBA 值使用预乘 alpha。

将边缘设置为 none 或宽度设置为 0 将禁用边框。设置负宽度属于协议错误。

此请求完全覆盖所有先前的 set_borders 请求。只有最近的 set_borders 请求才有效。

注意,river_window_v1 的位置/尺寸指的是窗口内容的位置/尺寸,不受边框或装饰表面的影响。

此请求修改渲染状态,只能作为 render 序列的一部分发出,参见 river_window_manager_v1 描述。

set_tiled(edges: uint<river_window_v1.edges>)
参数
类型
描述
edgesuint<river_window_v1.edges>
设置窗口平铺状态

通知窗口它是平铺布局的一部分,并在指定边缘与平铺布局中的其他元素相邻。

窗口应使用此信息来更改其客户端装饰的样式,避免在平铺边缘的窗口尺寸之外绘制阴影等。

将 edges 参数设置为 none 通知窗口它不是平铺布局的一部分。如果从未发出此请求,窗口将被告知它不是平铺布局的一部分。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

get_decoration_above(id: new_id<river_decoration_v1>, surface: object<wl_surface>)
参数
类型
描述
idnew_id<river_decoration_v1>
surfaceobject<wl_surface>
在窗口之上创建装饰表面

创建装饰表面并为其分配 river_decoration_v1 角色。创建的装饰在渲染顺序中放置在窗口之上,参见 river_decoration_v1 的描述。

提供已有角色或已附加/提交 buffer 的 wl_surface 属于协议错误。

get_decoration_below(id: new_id<river_decoration_v1>, surface: object<wl_surface>)
参数
类型
描述
idnew_id<river_decoration_v1>
surfaceobject<wl_surface>
在窗口之下创建装饰表面

创建装饰表面并为其分配 river_decoration_v1 角色。创建的装饰在渲染顺序中放置在窗口之下,参见 river_decoration_v1 的描述。

提供已有角色或已附加/提交 buffer 的 wl_surface 属于协议错误。

inform_resize_start()
通知窗口正在被调整大小

通知窗口它正在被调整大小。窗口管理器应使用此请求通知交互式调整大小的目标窗口。

窗口管理器在窗口调整大小期间仍负责处理窗口的位置和尺寸。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

inform_resize_end()
通知窗口不再被调整大小

通知窗口它不再被调整大小。窗口管理器应使用此请求通知交互式调整大小的目标窗口,交互式调整大小已结束。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

set_capabilities(caps: uint<river_window_v1.capabilities>)
参数
类型
描述
capsuint<river_window_v1.capabilities>
通知窗口支持的功能

此请求通知窗口管理器支持的功能。如果窗口管理器例如忽略窗口的最大化请求,则不应告知窗口它支持最大化功能。

窗口可能会使用此信息来仅在窗口管理器支持最大化功能时显示最大化按钮。

窗口管理器客户端应使用此请求为所有新窗口设置功能。如果从未发出此请求,合成器将通知窗口支持所有功能。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

inform_maximized()
通知窗口已被最大化

通知窗口它已被最大化。窗口可能会使用此信息来调整其客户端窗口装饰的样式。

窗口管理器在窗口最大化期间仍负责处理窗口的位置和尺寸。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

inform_unmaximized()
通知窗口已被取消最大化

通知窗口它已被取消最大化。窗口可能会使用此信息来调整其客户端窗口装饰的样式。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

inform_fullscreen()
通知窗口已全屏

通知窗口它已全屏。窗口可能会使用此信息来调整其客户端窗口装饰的样式。

此请求不影响窗口的大小/位置或使其成为唯一渲染的窗口,参见 river_window_v1.fullscreen 和 exit_fullscreen 请求。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

inform_not_fullscreen()
通知窗口未全屏

通知窗口它未全屏。窗口可能会使用此信息来调整其客户端窗口装饰的样式。

此请求不影响窗口的大小/位置或使其成为唯一渲染的窗口,参见 river_window_v1.fullscreen 和 exit_fullscreen 请求。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

fullscreen(output: object<river_output_v1>)
参数
类型
描述
outputobject<river_output_v1>
使窗口全屏

使窗口在指定输出上全屏。如果多个窗口同时在同一输出上全屏,只有渲染顺序中"顶部"的窗口会被显示。

所有在顶部全屏窗口之上渲染顺序中的 river_shell_surface_v1 对象将继续被渲染。

窗口全屏时,合成器将处理窗口的位置和尺寸。set_position 和 propose_dimensions 请求不会影响全屏窗口的当前位置和尺寸。

窗口全屏时,合成器将窗口内容、装饰表面和边框裁剪到指定输出的尺寸。窗口全屏时,set_clip_box 和 set_content_clip_box 的效果被忽略。

如果窗口当前全屏的输出被移除,窗口状态将被修改,如同在与 river_output_v1.removed 事件相同的 manage 序列中发出了 exit_fullscreen 请求。

此请求不会通知窗口它已全屏,参见 river_window_v1.inform_fullscreen 和 inform_not_fullscreen 请求。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

exit_fullscreen()
使窗口退出全屏

使窗口退出全屏。

在此请求发出后,位置和尺寸是未定义的,直到窗口管理器在 manage 序列中发出 propose_dimensions 和 set_position 请求并完成。

窗口管理器应在与 exit_fullscreen 请求相同的 manage 序列中发出 propose_dimensions 和 set_position 请求以实现帧完美。

此请求不会通知窗口它已全屏,参见 river_window_v1.inform_fullscreen 和 inform_not_fullscreen 请求。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

set_clip_box(x: int, y: int, width: int, height: int)
参数
类型
描述
xint
yint
widthint
heightint
将窗口裁剪到指定区域

将窗口(包括边框和装饰表面)裁剪到由 x、y、width 和 height 参数指定的区域。区域的 x/y 位置相对于窗口的左上角。

width 和 height 参数必须大于或等于 0。

将裁剪区域的宽度或高度设置为 0 将禁用裁剪。

窗口全屏时裁剪区域被忽略。

set_clip_box 和 set_content_clip_box 可以同时启用。

此请求修改渲染状态,只能作为 render 序列的一部分发出,参见 river_window_manager_v1 描述。

set_content_clip_box(x: int, y: int, width: int, height: int)
参数
类型
描述
xint
yint
widthint
heightint
将窗口内容裁剪到指定区域

将窗口内容(不包括边框和装饰表面)裁剪到由 x、y、width 和 height 参数指定的区域。区域的 x/y 位置相对于窗口的左上角。

启用内容裁剪时,合成器绘制的边框(见 set_borders)放置在窗口内容(由 dimensions 事件定义)与内容裁剪区域的交集周围。

width 和 height 参数必须大于或等于 0。

将区域的宽度或高度设置为 0 将禁用内容裁剪。

窗口全屏时内容裁剪区域被忽略。

set_clip_box 和 set_content_clip_box 可以同时启用。

此请求修改渲染状态,只能作为 render 序列的一部分发出,参见 river_window_manager_v1 描述。

closed()
窗口已被关闭

窗口已被服务器关闭,可能是因为 xdg_toplevel.close 请求或类似原因。

服务器将不会在此对象上发送更多事件,并忽略此事件发送后除 river_window_v1.destroy 之外的任何请求。客户端应使用 river_window_v1.destroy 请求销毁此对象以释放资源。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

dimensions_hint(min_width: int, min_height: int, max_width: int, max_height: int)
参数
类型
描述
min_widthint
min_heightint
max_widthint
max_heightint
窗口首选的最小/最大尺寸

此事件通知窗口管理器窗口首选的最小/最大尺寸。这些偏好是提示性的,窗口管理器可以自由提议超出这些范围的尺寸。

所有最小/最大宽度/值必须严格大于或等于 0。值为 0 表示窗口对该值没有偏好。

min_width/min_height 必须严格小于或等于 max_width/max_height。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

dimensions(width: int, height: int)
参数
类型
描述
widthint
heightint
窗口尺寸

此事件表示窗口在合成器逻辑坐标空间中的尺寸。宽度和高度必须严格大于零。

注意,river_window_v1 的尺寸指的是窗口内容的尺寸,不受边框或装饰表面的影响。

此事件作为 render 序列的一部分在 render_start 事件之前发送。

它可能是由于之前 manage 序列中的 propose_dimensions 请求或窗口自行决定更改尺寸而发送的。

app_id(app_id: string)
参数
类型
描述
app_idstring允许为空
窗口设置了应用程序 ID

窗口设置了应用程序 ID。

如果窗口从未设置应用程序 ID 或清除了应用程序 ID,app_id 参数将为 null。(Xwayland 窗口可能会这样做,但 xdg-toplevel 不会。)

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

title(title: string)
参数
类型
描述
titlestring允许为空
窗口设置了标题

窗口设置了标题。

如果窗口从未设置标题或清除了标题,title 参数将为 null。(Xwayland 窗口可能会这样做,但 xdg-toplevel 不会。)

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

parent(parent: object<river_window_v1>)
参数
类型
描述
parentobject<river_window_v1>允许为空
窗口设置了父窗口

窗口设置了父窗口。如果从未收到此事件或 parent 参数为 null,则该窗口没有父窗口。

设置了父窗口的 surface 可能是父窗口的对话框、文件选择器等。

子窗口通常应直接渲染在其父窗口之上。

合成器必须保证窗口树中没有循环:父窗口不得是其子窗口的后代。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

decoration_hint(hint: uint<river_window_v1.decoration_hint>)
参数
类型
描述
hintuint<river_window_v1.decoration_hint>
支持/首选的装饰样式

来自窗口的关于支持和首选的客户端/服务端装饰选项的信息。

如果窗口更改其偏好,此事件可能在窗口生命周期内多次发送。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

pointer_move_requested(seat: object<river_seat_v1>)
参数
类型
描述
seatobject<river_seat_v1>
窗口请求交互式指针移动

此事件通知窗口管理器窗口已请求使用指针进行交互式移动。seat 参数指示用于移动的 seat。

例如,xdg-shell 协议允许窗口请求启动交互式移动,可能是在拖动客户端渲染的标题栏时。

窗口管理器可以使用 river_seat_v1.op_start_pointer 请求来交互式移动窗口,或完全忽略此事件。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

pointer_resize_requested(seat: object<river_seat_v1>, edges: uint<river_window_v1.edges>)
参数
类型
描述
seatobject<river_seat_v1>
edgesuint<river_window_v1.edges>
窗口请求交互式指针调整大小

此事件通知窗口管理器窗口已请求使用指针进行交互式调整大小。seat 参数指示用于调整大小的 seat。

edges 参数指示窗口请求从哪些边缘调整大小。edges 参数永远不会是 none,也永远不会同时设置上下或左右边缘。

例如,xdg-shell 协议允许窗口请求启动交互式调整大小,可能是在拖动客户端渲染的装饰角落时。

窗口管理器可以使用 river_seat_v1.op_start_pointer 请求来交互式调整窗口大小,或完全忽略此事件。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

show_window_menu_requested(x: int, y: int)
参数
类型
描述
xint
x offset from top left corner
yint
y offset from top left corner
窗口请求显示窗口菜单

例如,xdg-shell 协议允许窗口请求显示窗口菜单,例如当用户右键单击客户端窗口装饰时。

窗口菜单可能包含最大化或最小化窗口的选项。

窗口管理器可以自由忽略此请求,并在选择显示菜单时决定窗口菜单包含的内容。

x 和 y 参数指示窗口请求显示窗口菜单的位置。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

maximize_requested()
窗口请求被最大化

例如,xdg-shell 协议允许窗口请求被最大化。

窗口管理器可以使用 river_window_v1.inform_maximize 来满足此请求,或忽略它。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

unmaximize_requested()
窗口请求被取消最大化

例如,xdg-shell 协议允许窗口请求被取消最大化。

窗口管理器可以使用 river_window_v1.inform_unmaximized 来满足此请求,或忽略它。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

fullscreen_requested(output: object<river_output_v1>)
参数
类型
描述
outputobject<river_output_v1>允许为空
窗口请求全屏

例如,xdg-shell 协议允许窗口请求全屏,并允许它们提供输出偏好。

窗口管理器可以使用 river_window_v1.fullscreen 来满足此请求,或忽略它。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

exit_fullscreen_requested()
窗口请求退出全屏

例如,xdg-shell 协议允许窗口请求退出全屏。

窗口管理器可以使用 river_window_v1.exit_fullscreen 来满足此请求,或忽略它。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

minimize_requested()
窗口请求被最小化

例如,xdg-shell 协议允许窗口请求被最小化。

窗口管理器可以自由忽略此请求、隐藏窗口或执行任何其他选择的操作。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

unreliable_pid(unreliable_pid: int)
参数
类型
描述
unreliable_pidint
窗口创建者的不可靠 PID

此事件提供创建窗口的进程的不可靠 PID。由于 PID 重用,获取此信息本质上是有竞争条件的。因此,此 PID 不得用于任何安全敏感的用途。

另请注意,单个进程可能创建多个窗口,因此 PID 到窗口不一定是一对一映射。多个窗口可能具有相同的 PID。

此事件在 river_window_v1 创建时发送一次,之后不再发送。

参数
描述
node_exists0
窗口已有节点对象
invalid_dimensions1
提议的尺寸超出范围
invalid_border2
set_borders 的参数无效
invalid_clip_box3
set_clip_box 的参数无效
参数
描述
only_supports_csd0
仅支持客户端装饰
prefers_csd1
首选客户端装饰,同时支持 CSD 和 SSD
prefers_ssd2
首选服务端装饰,同时支持 CSD 和 SSD
no_preference3
无偏好,同时支持 CSD 和 SSD
edges { none, top, bottom, left, right } 
参数
描述
none0
top1
bottom2
left4
right8

窗口装饰

带有装饰的窗口的渲染顺序如下:

1. 使用 get_decoration_below 创建的装饰在最底部 2. 窗口内容 3. 使用 river_window_v1.set_borders 配置的边框 4. 使用 get_decoration_above 创建的装饰在最顶部

窗口上方/下方装饰表面的相对顺序由此协议未定义,由合成器决定。

destroy()
销毁装饰对象

此请求表示客户端将不再使用此装饰对象,可以安全销毁。

set_offset(x: int, y: int)
参数
类型
描述
xint
yint
设置相对于窗口左上角的偏移量

此请求设置装饰表面相对于窗口左上角的偏移量。

如果从未发送此请求,x 和 y 偏移量由此协议未定义,由合成器决定。

此请求修改渲染状态,只能作为 render 序列的一部分发出,参见 river_window_manager_v1 描述。

sync_next_commit()
将下一个提交与其他渲染状态同步

将装饰表面上下一个 wl_surface.commit 请求的应用与下一个 river_window_manager_v1.render_finish 请求原子性应用的其余状态同步。

客户端必须在此请求之后、render_finish 请求之前对装饰表面发出 wl_surface.commit 请求,否则属于协议错误。

此请求修改渲染状态,只能作为 render 序列的一部分发出,参见 river_window_manager_v1 描述。

error { no_commit } 
参数
描述
no_commit0
在窗口管理器提交之前未能提交 surface

窗口管理器 UI 的 surface

窗口管理器可以使用 shell surface 来显示状态栏、背景图像、桌面通知、启动器、桌面菜单或任何其他需要的内容。

destroy()
销毁 shell surface 对象

此请求表示客户端将不再使用此 shell surface 对象,可以安全销毁。

get_node(id: new_id<river_node_v1>)
参数
类型
描述
idnew_id<river_node_v1>
获取 shell surface 的渲染列表节点

获取渲染列表中对应此 shell surface 的节点。

对单个 shell surface 多次发出此请求属于协议错误。

sync_next_commit()
将下一个 surface 提交与窗口管理器提交同步

将 shell surface 上下一个 wl_surface.commit 请求的应用与下一个 river_window_manager_v1.render_finish 请求原子性应用的其余渲染状态同步。

客户端必须在此请求之后、render_finish 请求之前对 shell surface 发出 wl_surface.commit 请求,否则属于协议错误。

此请求修改渲染状态,只能作为 render 序列的一部分发出,参见 river_window_manager_v1 描述。

参数
描述
node_exists0
shell surface 已有节点对象
no_commit1
在窗口管理器提交之前未能提交 surface

渲染列表中的节点

渲染列表是一个节点列表,决定了合成器的渲染顺序。节点可以对应窗口或 shell surface。节点的相对顺序可以通过 place_above 和 place_below 请求来更改,从而改变渲染顺序。

节点在渲染列表中的初始位置是未定义的,窗口管理器客户端必须使用 place_above 或 place_below 请求来保证特定的渲染顺序。

destroy
类型: destructor
destroy()
销毁装饰对象

此请求表示客户端将不再使用此节点对象,可以安全销毁。

set_position(x: int, y: int)
参数
类型
描述
xint
yint
设置节点的绝对位置

在合成器的逻辑坐标空间中设置节点的绝对位置。x 和 y 坐标可以是正数或负数。

注意,river_window_v1 的位置指的是窗口内容的位置,不受边框或装饰表面的影响。

如果从未发送此请求,节点的位置由此协议未定义,由合成器决定。

此请求修改渲染状态,只能作为 render 序列的一部分发出,参见 river_window_manager_v1 描述。

place_top()
将节点放置在所有其他节点之上

此请求将节点放置在合成器渲染列表中所有其他节点之上。

此请求修改渲染状态,只能作为 render 序列的一部分发出,参见 river_window_manager_v1 描述。

place_bottom()
将节点放置在所有其他节点之下

此请求将节点放置在合成器渲染列表中所有其他节点之下。

此请求修改渲染状态,只能作为 render 序列的一部分发出,参见 river_window_manager_v1 描述。

place_above(other: object<river_node_v1>)
参数
类型
描述
otherobject<river_node_v1>
将节点放置在另一个节点之上

此请求将节点直接放置在合成器渲染列表中另一个节点之上。

尝试将节点放置在自身之上没有效果。

此请求修改渲染状态,只能作为 render 序列的一部分发出,参见 river_window_manager_v1 描述。

place_below(other: object<river_node_v1>)
参数
类型
描述
otherobject<river_node_v1>
将节点放置在另一个节点之下

此请求将节点直接放置在合成器渲染列表中另一个节点之下。

尝试将节点放置在自身之下没有效果。

此请求修改渲染状态,只能作为 render 序列的一部分发出,参见 river_window_manager_v1 描述。


逻辑输出

合成器逻辑坐标空间中的一个区域,应被视为单个输出用于窗口管理目的。此区域可能对应单个物理输出,或在镜像或平铺显示器的情况下对应多个物理输出,具体取决于硬件和合成器配置。

destroy
类型: destructor
destroy()
销毁输出对象

此请求表示客户端将不再使用此输出对象,可以安全销毁。

此请求应在收到 river_output_v1.removed 事件后发出,以完成输出的销毁。

removed()
输出已被移除

此事件表示逻辑输出在概念上不再是窗口管理空间的一部分。

服务器将不会在此对象上发送更多事件,并忽略此事件发送后除 river_output_v1.destroy 之外的任何请求。客户端应使用 river_output_v1.destroy 请求销毁此对象以释放资源。

此事件可能因为相应的物理输出被物理拔出或某些输出配置发生变化而发送。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

wl_output(name: uint)
参数
类型
描述
nameuint
name of the wl_output global
对应的 wl_output

对应 river_output_v1 的 wl_output 对象。参数是通过 wl_registry.global 通告的 wl_output 的全局名称。

保证在发送此事件之前,相应的 wl_output 已被通告。

此事件恰好发送一次。与 river_output_v1 关联的 wl_output 不能更改。保证 wl_output 和 river_output_v1 对象之间存在一对一映射。

相应 wl_output 的 global_remove 事件可能在 river_output_v1.remove 事件之前发送。这是因为 river_output_v1 状态变更与 river 窗口管理的 manage 序列同步,而全局变更则不是。

理由:窗口管理器可能需要 wl_output 接口提供的信息,例如 name/description。它也可能需要 wl_output 对象来启动屏幕截图等。

position(x: int, y: int)
参数
类型
描述
xint
yint
输出位置

此事件表示输出在合成器逻辑坐标空间中的位置。x 和 y 坐标可以是正数或负数。

此事件在 river_output_v1 创建时发送一次,并在位置变更时再次发送。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

服务器必须保证在收到相应的 manage_start 事件时,position 和 dimensions 事件不会导致多个逻辑输出的区域重叠。

dimensions(width: int, height: int)
参数
类型
描述
widthint
heightint
输出尺寸

此事件表示输出在合成器逻辑坐标空间中的尺寸。宽度和高度将始终严格大于零。

此事件在 river_output_v1 创建时发送一次,并在尺寸变更时再次发送。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

服务器必须保证在收到相应的 manage_start 事件时,position 和 dimensions 事件不会导致多个逻辑输出的区域重叠。


窗口管理 seat

此对象代表单个用户的输入设备集合。它允许窗口管理器将键盘输入路由到窗口、获取指针输入的高级信息、定义键盘和指针绑定等。

TODO:

destroy
类型: destructor
destroy()
销毁 seat 对象

此请求表示客户端将不再使用此 seat 对象,可以安全销毁。

此请求应在收到 river_seat_v1.removed 事件后发出,以完成 seat 的销毁。

focus_window(window: object<river_window_v1>)
参数
类型
描述
windowobject<river_window_v1>
将键盘焦点给予窗口

请求合成器将键盘输入发送到指定窗口。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

focus_shell_surface(shell_surface: object<river_shell_surface_v1>)
参数
类型
描述
shell_surfaceobject<river_shell_surface_v1>
将键盘焦点给予 shell_surface

请求合成器将键盘输入发送到指定 shell surface。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

clear_focus()
清除键盘焦点

请求合成器不向任何客户端发送键盘输入。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

op_start_pointer()
启动交互式指针操作

启动交互式指针操作。操作期间,将根据指针输入发送 op_delta 事件。

当所有指针按钮释放时,发送 op_release 事件。

指针操作持续到在 manage 序列期间发出 op_end 请求且该 manage 序列完成。

窗口管理器可以使用此操作来实现窗口的交互式移动/调整大小,通过设置窗口位置和根据 op_delta 事件提议尺寸。

如果已有操作正在进行,此请求将被忽略。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

op_end()
结束交互式操作

结束交互式操作。

如果没有操作正在进行,此请求将被忽略。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

get_pointer_binding(id: new_id<river_pointer_binding_v1>, button: uint, modifiers: uint<river_seat_v1.modifiers>)
参数
类型
描述
idnew_id<river_pointer_binding_v1>
buttonuint
a Linux input event code
modifiersuint<river_seat_v1.modifiers>
定义新的指针绑定

根据指针按钮、修饰键和其他可配置属性定义指针绑定。

button 参数是 linux/input-event-codes.h 头文件中定义的 Linux 输入事件代码(例如 BTN_RIGHT)。

新的指针绑定在初始配置完成且在 manage 序列期间发出 enable 请求之前不会启用。

set_xcursor_theme(name: string, size: uint)
参数
类型
描述
namestring
sizeuint
为 seat 设置 xcursor 主题

为 seat 设置 XCursor 主题。此主题用于合成器渲染的光标,但不一定用于客户端渲染的光标。

注意:窗口管理器可能还希望为其启动的程序设置 XCURSOR_THEME 和 XCURSOR_SIZE 环境变量。

pointer_warp(x: int, y: int)
参数
类型
描述
xint
yint
将指针传送到指定位置

将指针传送到合成器逻辑坐标空间中的指定位置。

如果指定位置超出所有输出的范围,指针将被传送到最近的输出内的点。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

removed()
seat 已被移除

此事件表示 seat 不再使用,应被销毁。

服务器将不会在此对象上发送更多事件,并忽略此事件发送后除 river_seat_v1.destroy 之外的任何请求。客户端应使用 river_seat_v1.destroy 请求销毁此对象以释放资源。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

wl_seat(name: uint)
参数
类型
描述
nameuint
name of the wl_seat global
对应的 wl_seat

对应 river_seat_v1 的 wl_seat 对象。参数是通过 wl_registry.global 通告的 wl_seat 的全局名称。

保证在发送此事件之前,相应的 wl_seat 已被通告。

此事件恰好发送一次。与 river_seat_v1 关联的 wl_seat 不能更改。保证 wl_seat 和 river_seat_v1 对象之间存在一对一映射。

相应 wl_seat 的 global_remove 事件可能在 river_seat_v1.remove 事件之前发送。这是因为 river_seat_v1 状态变更与 river 窗口管理的 manage 序列同步,而全局变更则不是。

理由:窗口管理器可能希望基于其 shell surface 接收的正常输入事件来触发窗口管理状态变更。

pointer_enter(window: object<river_window_v1>)
参数
类型
描述
windowobject<river_window_v1>
指针进入了窗口

seat 的指针进入了指定窗口的区域。

窗口的区域定义为包括窗口尺寸定义的区域、使用 river_window_v1.set_borders 配置的边框以及装饰表面的输入区域。特别是,它不包括属于窗口但延伸到窗口尺寸之外的 surface 的输入区域。

seat 的指针一次只能进入一个窗口。当指针在窗口之间移动时,旧窗口的 pointer_leave 事件必须在新窗口的 pointer_enter 事件之前发送。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

pointer_leave()
指针离开了已进入的窗口

seat 的指针离开了最近发送 pointer_enter 的窗口。详见 pointer_enter。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

window_interaction(window: object<river_window_v1>)
参数
类型
描述
windowobject<river_window_v1>
窗口已被交互

窗口已被交互,不仅仅是指针经过。此事件可能因指针按钮按下或触摸/数位板工具与窗口的交互而发送。

此事件与 pointer_enter 和 pointer_leave 事件的发送关系没有保证,因为交互可能使用触摸或数位板工具输入。

理由:此事件为窗口管理器提供必要信息,以决定何时发送键盘焦点、提升已有键盘焦点的窗口等。采用策略优于机制的方法,而不是向窗口管理器暴露所有指针、触摸和数位板事件。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

shell_surface_interaction(shell_surface: object<river_shell_surface_v1>)
参数
类型
描述
shell_surfaceobject<river_shell_surface_v1>
shell surface 已被交互

shell surface 已被交互,不仅仅是指针经过。此事件可能因指针按钮按下或触摸/数位板工具与 shell_surface 的交互而发送。

此事件与 pointer_enter 和 pointer_leave 事件的发送关系没有保证,因为交互可能使用触摸或数位板工具输入。

理由:虽然 shell surface 确实直接接收所有 wl_pointer、wl_touch 等输入事件,但这些事件不一定触发 manage 序列,因此不允许窗口管理器以无竞争的方式更新焦点或执行其他操作来响应输入。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

op_delta(dx: int, dy: int)
参数
类型
描述
dxint
total change in x
dyint
total change in y
自操作开始以来的总累积运动

此事件表示自操作开始以来指针/触摸点等位置的总变化量。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

op_release()
操作输入已被释放

驱动当前交互操作的输入已被释放。例如,对于指针操作,所有指针按钮都已释放。

根据操作类型,op_delta 事件可能继续发送,直到通过 op_end 请求结束操作。

此事件在交互操作期间最多发送一次。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

pointer_position(x: int, y: int)
参数
类型
描述
xint
yint
指针的当前位置

指针在合成器逻辑坐标空间中的当前位置。

此状态是特殊的,仅指针位置的变化不得导致合成器启动 manage 序列。

假设 seat 有指针,此事件必须在每个 manage 序列中发送,除非自上次发送此事件以来 x/y 位置没有变化。

modifiers { none, shift, ctrl, mod1, mod3, mod4, mod5 } 
参数
描述
none0
shift1
ctrl4
mod18
通常称为 alt
mod332
mod464
通常称为 super 或 logo
mod5128
一组键盘修饰键

此枚举用于描述触发按键绑定或指针绑定时必须按下的键盘修饰键。

注意,river 和 wlroots 在内部使用值 2 和 16 表示 capslock 和 numlock。然而,将锁定修饰键用于绑定没有意义,因此这些值不包含在此枚举中。


配置指针绑定,接收触发事件

此对象允许窗口管理器配置指针绑定,并在绑定被触发时接收事件。

新的指针绑定在 manage 序列期间发出 enable 请求之前不会启用。

通常,所有指针按钮事件都由合成器发送到具有指针焦点的 surface。触发指针绑定的指针按钮事件不会发送到具有指针焦点的 surface。

如果多个指针绑定将由合成器端的单个物理指针事件触发,则由合成器策略决定哪个指针绑定将接收按下/释放事件,或者所有匹配的指针绑定是否都接收按下/释放事件。

destroy()
销毁指针绑定对象

此请求表示客户端将不再使用此指针绑定对象,可以安全销毁。

enable()
启用指针绑定

此请求应在所有初始配置完成且窗口管理器希望指针绑定能够被触发后发出。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

disable()
禁用指针绑定

此请求可用于临时禁用指针绑定。可以稍后通过 enable 请求重新启用。

此请求修改窗口管理状态,只能作为 manage 序列的一部分发出,参见 river_window_manager_v1 描述。

pressed()
绑定的指针按钮已被按下

此事件表示触发绑定的指针按钮已被按下。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

合成器应等待 manage 序列完成后再处理进一步的输入事件。这允许窗口管理器客户端例如修改按键绑定和键盘焦点,而不会与未来的输入事件产生竞争。当然,窗口管理器应尽快响应,因为合成器缓冲传入输入事件的能力是有限的。

released()
绑定的指针按钮已被释放

此事件表示触发绑定的指针按钮已被释放。

释放绑定的修饰键而不释放指针按钮不会触发释放事件。此事件在指针按钮释放时发送,即使修饰键自 pressed 事件以来已更改。

在服务器发送所有其他新状态后,此事件之后将跟随一个 manage_start 事件。

合成器应等待 manage 序列完成后再处理进一步的输入事件。这允许窗口管理器客户端例如修改按键绑定和键盘焦点,而不会与未来的输入事件产生竞争。当然,窗口管理器应尽快响应,因为合成器缓冲传入输入事件的能力是有限的。


合成器支持

未发现合成器支持

SPDX-FileCopyrightText: © 2024 Isaac Freund SPDX-License-Identifier: MIT

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Footer

© 2026 Wayland Explorer

本网站与 Wayland 官方项目无任何关联。网站所有内容均根据 Wayland 协议 XML 文件自动生成。

本网站使用的 Visual Studio Code - Codicons 遵循 CC BY 4.0 许可。