跳转到内容

通用Wayland会话管理器

来自 Arch Linux 中文维基

通用Wayland会话管理器 (uwsm) 运行时会将独立 Wayland混成器变成一组systemd 单元。这提供一个包括环境的稳定的会话管理,并且支持XDG Autostart,与登录会话双向连接,并且可以完全关闭。

注意:强烈建议使用dbus-broker作为D-Bus守护进程的实现。因为它会重复利用systemd激活环境,而不是启动一个独立的环境。这个简化的环境管理可以有恰当的清理,也支持reference implementation,但是不允许取消设置一个变量,所以更高效的清理方式是将其设置为空字符。唯一可能的清理办法是使用loginctl terminate-user ""来将D-Bus守护进程引用的环境分离

安装

安装 uwsm(或者你也可以安装uwsm-gitAUR的Git版本以获取master分支上的最新提交)

配置

服务启动通知和混成器设置的变量

注意:如果被管理的混成器已经将 WAYLAND_DISPLAY(和其他有用的环境变量)添加到 systemd 激活的环境中,那么你可以跳过这部分,并且无需使用 uwsm finalize

为了找到当前的混成器,一个Wayland软件作为systemd服务运行需要 WAYLAND_DISPLAY 环境变量(如果它们预期是在Xwayland中运行则是 DISPLAY)。因此,一旦混成器设置了这个和其他有用的环境变量,都应该被放进 systemd/dbus 激活环境中。

uwsm finalize 命令会根据 UWSM_FINALIZE_VARNAMES 列表(使用空白字符 (white-space) 作为分隔符),将 WAYLAND_DISPLAYDISPLAY 和其他环境变量加入到激活环境。建议在混成器就绪后执行该命令。

如果在激活环境中需要其他由混成器设置的变量,可以将变量名称作为参数传递给 uwsm finalize 或将其放入 UWSM_FINALIZE_VARNAMES 中的使用空白字符分隔的列表中。例如:

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

环境变量

所有来源于uwsm的环境变量都设置在${XDG_CONFIG_HOME}/uwsm/env并且可用于在这个会话中所有的被管理混成器和图形化软件。

如果你想仅仅为一个指定的混成器(以及对应图形会话中的图形应用程序)设置一些环境变量,那么请将变量放在${XDG_CONFIG_HOME}/uwsm/env-compositor

这个文件的模板如下:

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

使用

启动

注意:如果在uwsm start中的环境变量被成功使用,那么环境预加载器不再生效POSIX shell配置。

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

从TTY启动

将如下代码添加进~/.profile

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

如果你想始终启动指定混成器,将上述代码替换为:

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

从显示管理器中启动

你可以创建一个自定义桌面项以通过uwsm启动你的混成器:

/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取代了登录shell,那么它会在uwsm start后启动代码或终止用户会话)

注意:请不要使用混成器的原生退出机制或者直接杀死其进程。这将会使混成器从所有客户端之下强制抽除,并干扰有序的单元停用流程。

技巧提示

软件与自动启动

默认情况下,uwsm 通过在session.slice中的一个自定义systemd服务来启动混成器。很多Wayland混成器允许你在混成器服务中启动其他软件,然而这将会消耗混成器资源,甚至会干扰通知sockets

要将应用程序作为独立的 systemd 范围单元 (scope units) 启动,你可以使用 uwsm app,它既可以启动可执行文件:

uwsm app -- /my/program/path

也可以启动桌面项

uwsm app -- myprogram.desktop

uwsm 默认会将启动的范围单元放置在 app-graphical.slice。如果你想要将它们放置在 background-graphical.slicesession-graphical.slice,应该分别使用 -s b-s s

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

替代

你可以使用以下方案作为替代,比起uwsm app(运行一个Python脚本)会更快:

  • uwsm 的 uwsm-app 脚本,与 uwsm 的应用守护进程进行通信。
  • app2unit-gitAUR,一个shell脚本。你可以通过设置APP2UNIT_SLICES环境变量为如下值来让它作为uwsm app的替代方案:
    APP2UNIT_SLICES='a=app-graphical.slice b=background-graphical.slice s=session-graphical.slice'
  • runappAUR,由C++编写,但是少了些许功能。

另见