跳转至内容

通用 Wayland 会话管理器

来自 ArchWiki

通用 Wayland 会话管理器 (uwsm) 可以动态地将独立的 Wayland compositor 包装成一套 systemd unit。这提供了强大的会话管理功能,包括环境变量、XDG Autostart 支持、与登录会话的双向绑定以及干净的关机。

注意 强烈建议使用 dbus-broker 作为 D-Bus 守护进程实现。除了其他优点外,它会重用 systemd 激活环境,而不是拥有一个单独的环境。这简化了环境管理并允许正确清理。 参考实现也受支持,但它不允许取消设置变量,因此通过将它们设置为空字符串来执行尽力清理。正确清理参考 D-Bus 守护进程的独立环境的唯一方法是运行 loginctl terminate-user ""

安装

安装 uwsm 包。

配置

服务启动通知和 compositor 设置的变量

注意 如果托管的 compositor 已经将 WAYLAND_DISPLAY(和其他有用的环境变量)设置到 systemd 激活环境中,那么您可以跳过本节,并且不需要使用 uwsm finalize

为了找到当前的 compositor,作为 systemd 服务运行的 Wayland 应用程序需要 WAYLAND_DISPLAY 环境变量(或者如果是通过 Xwayland 运行,则为 DISPLAY)。因此,一旦 compositor 设置了它们的值,这些以及其他有用的环境变量就应该被放入 systemd/dbus 激活环境中。

uwsm finalize 命令会将 WAYLAND_DISPLAYDISPLAY 以及通过空格分隔的 UWSM_FINALIZE_VARNAMES 列表中列出的其他环境变量放入激活环境中。建议在 compositor 就绪后执行此命令。

如果 compositor 设置的其他变量需要在激活环境中使用,它们可以作为参数传递给 uwsm finalize,或者放入 UWSM_FINALIZE_VARNAMES 的空格分隔列表中。请参阅下面的示例

exec uwsm finalize VAR1 VAR2 ...
export UWSM_FINALIZE_VARNAMES=VAR1 VAR2 ...

环境变量

${XDG_CONFIG_HOME}/uwsm/env 中设置的所有环境变量都将被 *uwsm* sourced,并且可供该会话中运行的所有托管 compositor 和图形应用程序使用。

如果您需要某些环境变量仅为特定的 *compositor*(以及该图形会话中的图形应用程序)设置,请将它们放入 ${XDG_CONFIG_HOME}/uwsm/env-compositor 中。

下面可以看到一个此类文件的示例

~/.config/uwsm/env
export KEY1=VAR1
export KEY2=VAR2
export KEY3=VAR3
...

用法

启动

注意 环境预加载器不再 sourcing POSIX shell 配置文件,如果从 uwsm start 上下文中使用的环境成功使用。

uwsm 可以由 TTY 或 显示管理器启动。

TTY

在您的 ~/.profile 文件中添加

if uwsm check may-start && uwsm select; then
  exec uwsm start default
fi

如果您想始终启动相同的 *compositor*,那么您可以在您的 ~/.profile 文件中改用

if uwsm check may-start; then
  exec uwsm start compositor.desktop
fi

显示管理器

您可以创建一个自定义会话桌面条目,通过 *uwsm* 启动您的 compositor

/usr/share/wayland-sessions/my-compositor-uwsm.desktop
[Desktop Entry]
Name=My compositor (with UWSM)
Comment=My cool compositor, UWSM session

# either full command line with metadata and executable
Exec=uwsm start -N "My compositor" -D mycompositor:mylib -C "My cool compositor" -- my-compositor

# or a reference to another entry
Exec=uwsm start -- my-compositor.desktop

DesktopNames=mycompositor;mylib
Type=Application

会话终止

如果您想终止当前的 uwsm 会话,那么您应该使用 loginctl terminate-user ""(终止整个用户会话)或 uwsm stop(在 uwsm start 之后执行代码,或者如果它替换了 登录 shell,则终止用户会话)。

注意 不要使用 compositor 的原生退出机制或直接杀死其进程。这会将 compositor 从所有客户端下拔出,并干扰有序的 unit 停用顺序。

技巧与提示

应用程序和自动启动

默认情况下,uwsm 通过 session.slice 中的自定义 systemd 服务启动 compositors。许多 Wayland compositors 允许您启动其他应用程序,这些应用程序随后将在 compositor 服务中启动,这将无用地消耗 compositor 资源,甚至干扰通知套接字。

要将应用程序作为单独的 systemd scope unit 启动,您可以使用 uwsm app,它可以启动可执行文件

uwsm app -- /my/program/path

桌面条目

uwsm app -- myprogram.desktop

默认情况下,uwsm 将启动的 scope unit 放在 app-graphical.slice slice 中。如果您想将它们放在 background-graphical.slicesession-graphical.slice 中,则应分别使用选项 -s b-s s

uwsm app -s b -- background-app.desktop

替代方案

您可以使用一个更快的替代方案,而不是 uwsm app(它是一个 Python 脚本)

  • uwsm 的 uwsm-app 脚本,它与 uwsm 的 app daemon 通信。
  • app2unit-gitAUR,它是一个 shell 脚本。您可以通过设置 APP2UNIT_SLICES 环境变量如下来将其用作 uwsm app 的即插即用替换
    APP2UNIT_SLICES='a=app-graphical.slice b=background-graphical.slice s=session-graphical.slice'
  • runappAUR,它是用 C++ 编写的,但缺少一些功能。

参见