Wayland
Wayland 是一个显示服务器协议,目标是替代掉 X Window System。 这里 有 Wayland 和 Xorg 的对比。
使用 Wayland 协议的显示服务器被称为 混成器(compositors),因为它们会被用作混成窗口管理器。
XWayland 在 Wayland 中提供了 X server,可以让 X11 应用程序无缝运行于 Wayland 中。
系统需求[编辑 | 编辑源代码]
目前 Wayland 只能在使用了 KMS 的系统上工作。Wayland 本身并不提供图形环境;为此还需要安装混成器,或者内置混成器的桌面环境,比如 GNOME 或 KDE。
为了使 GPU 驱动程序和 Wayland 混成器兼容,它们必须支持相同的缓冲器 API(Buffer API)。现在主要有两种 API:GBM 和 EGLStreams.
Buffer API | GPU 驱动支持 | Wayland 混成器支持 |
---|---|---|
GBM | 全部(除了 NVIDIA < 495*) | 全部 |
EGLStreams | NVIDIA | GNOME, KDE, Weston(需要第三方补丁) |
- * NVIDIA驱动版本 ≥ 495 同时支持 EGLStreams 和 GBM。[1]
自从 NVIDIA 引入了 GBM 支持,许多合成器(包括 Mutter 和 KWin)默认开始在 NVIDIA ≥ 495 中使用它。通常认为 GBM 更好,有更为广泛的支持,而以前支持 EGLStreams 是因为 NVIDIA 之前没有提供任何其他方式以在 Wayland 下通过其专有驱动程序来使用他们的 GPU。此外,在 NVIDIA 支持 GBM 后,·KWin 放弃了对 EGLStreams 的支持[2]。
如果您使用的是流行的桌面环境/混成器,GPU 也依旧被 NVIDIA 支持,那么您很可能已经在使用 GBM 后端了。要检查,运行 journalctl -b 0 --grep "renderer for"
。要强制将使用 GBM 后端,请设置以下环境变量:
GBM_BACKEND=nvidia-drm __GLX_VENDOR_LIBRARY_NAME=nvidia
注意在错误的环境下设置此变量有可能导致火狐浏览器崩溃之类的问题。
混成器[编辑 | 编辑源代码]
平铺式和堆叠式的区别参见窗口管理器#类型。
平铺式[编辑 | 编辑源代码]
- Cardboard — 基于 wlroots 的滚动混成器,受 PaperWM 启发。
- dwl — 类似 dwm的 Wayland 混成器,基于 wlroots。
- Hyprland — A dynamic tiling Wayland compositor that does not sacrifice on its looks.
- japokwm — Dynamic Wayland tiling compositor based around creating layouts, based on wlroots.
- newm — 考虑到笔记本电脑和触摸板的 Wayland 混成器。
- Qtile — A full-featured, hackable tiling window manager and Wayland compositor written and configured in Python.
- river — 动态平铺 Wayland 混成器,受 dwm 和 bspwm 启发。
- Velox — 基于 swc 的简单窗口管理器,受 dwm 和 xmonad 启发。
- Vivarium — A dynamic tiling Wayland compositor using wlroots, with desktop semantics inspired by xmonad.
- waymonad — 用 Haskell 编写的 Wayland 混成器,受 xmonad 启发。
- https://github.com/waymonad/waymonad || not packaged? search in AUR
堆叠式[编辑 | 编辑源代码]
- Enlightenment — 请参阅 Enlightenment#Manually。更多信息:[1][失效链接 2022-09-23 ⓘ] [2]
- Greenfield — 是一款可以在网页浏览器中运行、并显示远程应用的 Wayland 混成器。
- Grefsen — 是一款提供最精简桌面环境的 Qt/Wayland 混成器。
- hikari — 基于 wlroots 并受 cwm 启发开发,在 FreeBSD 上开发很活跃,但也支持 Linux。
- KDE KWin — 请参阅 KDE#Starting Plasma。
- Liri Shell — 是 Liri 一部分,其使用 QtQuick 和 QtCompositor 为 Wayland 构建。
- labwc — 受 Openbox 启发,基于 wlroots 的混成器.
- Mutter — 请参阅 GNOME#Starting。
- Orbital — 是一款使用 Qt5 和 Weston 的混成器和 Shell(它更像是窗户管理器而非桌面环境)。目标是构建一个简单但灵活且美观的桌面。
- wayfire — 3D 混成器,受 Compiz 启发并基于 wlroots 开发。
- https://wayfire.org/ || wayfireAUR
- Weston — 本身还是其它 Wayland 混成器开发的实现参考。
- wio — 是一款基于 wlroots 的混成器,致力于复刻 Plan 9 的 Rio 桌面的外观和质感。
- https://wio-project.org/[失效链接 2022-09-23 ⓘ] ||
其它类型[编辑 | 编辑源代码]
- Cage — 显示单个全屏应用程序(就像自助取款机那样)。
- Maze Compositor — 使用 Qt 将窗口渲染成 3D 迷宫一样。
- Motorcar — 是一款使用虚拟现实来探索 3D 窗口的 Wayland 混成器。
- nwg-shell — A GTK-based shell for the sway Wayland compositor.
- kiwmi — A fully programmable Wayland Compositor.
上述某些混成器/窗户管理器支持 显示管理器。请检查 /usr/share/wayland-sessions/compositor.desktop
文件看它们如何启动。
显示管理器[编辑 | 编辑源代码]
下面列出的显示管理器均支持 Wayland 混成器。
名称 | 在 Wayland 上运行 | 描述 |
---|---|---|
GDM | 是 | GNOME 的显示管理器。 |
greetd | 提供了 Wayland 登陆程序 | 小巧且灵活的登录守护程序。 |
LightDM | 是 | 跨桌面显示管理器。 |
Ly | 在控制台中运行 | 用 C 语言编写的 TUI 显示管理器。 |
SDDM | 是 | 基于 QML 开发的显示管理器。 |
tbsm | 否 | 用纯 Bash 编写的简单 CLI 会话启动器。 |
图形库[编辑 | 编辑源代码]
详情请查看 官方网站。
GTK[编辑 | 编辑源代码]
gtk3包 和 gtk4包 包已经提供了 Wayland 支持。GTK 会默认使用 Wayland 后端,但是可以通过修改环境变量为 GDK_BACKEND=x11
覆盖设置将其切换到 Xwayland。
Qt 5[编辑 | 编辑源代码]
要在 Qt 5 和 6 中启用 Wayland 支持,请按需要安装 qt5-wayland包、qt6-wayland包 软件包。
要搭配 Wayland 插件一起运行 Qt 5 应用程序[3],请使用 -platform wayland
或 QT_QPA_PLATFORM=wayland
环境变量;要强制在 Wayland 会话中使用 X11,则使用 QT_QPA_PLATFORM=xcb
。后者对于某些不使用系统 Qt 实现的应用(比如 zoomAUR),可能是必需的。QT_QPA_PLATFORM="wayland;xcb"
让 Qt 在 Wayland 不可用时使用 xcb (X11) 插件[4]。
像 sway 这样的一些混成器,本机运行的 Qt 程序可能会有一些功能缺失。例如,KeepassXC 会无法最小化到托盘。通过安装 qt5ct包 并在程序运行前设定好 QT_QPA_PLATFORMTHEME=qt5ct
环境变量,可以解决这一问题。
Clutter[编辑 | 编辑源代码]
Clutter 工具包有 Wayland 后端支持,可以作为 Wayland 客户端运行。这一后端支持已在官方软件包 clutter包 中启用。
要在 Wayland 上运行 Clutter 应用,请设定 CLUTTER_BACKEND=wayland
环境变量。
SDL[编辑 | 编辑源代码]
要在 Wayland 上运行 SDL 应用,请设定 SDL_VIDEODRIVER=wayland
环境变量。
SDL_VIDEODRIVER=wayland
环境变量还可能会导致游戏运行完全中断。要强制应用在 XWayland 上运行,请设定 SDL_VIDEODRIVER=x11
环境变量。GLFW[编辑 | 编辑源代码]
要在 Wayland 后端上使用 GLFW,请安装 glfw-wayland包 软件包(而不是 glfw-x11包)。
GLEW[编辑 | 编辑源代码]
glew-waylandAUR 软件包支持的后端还很少,请使用 glew包 和 Xwayland. FS#62713。
EFL[编辑 | 编辑源代码]
EFL 已经完全支持 Wayland。要在 Wayland 上运行 EFL 应用,请参阅 Wayland 项目页面。
winit[编辑 | 编辑源代码]
Winit 是 Rust 语言中的窗口处理库。其默认使用 Wayland 后端,但是可以通过修改环境变量为 WINIT_UNIX_BACKEND=x11
覆盖设置将其切换到 Xwayland。
Electron[编辑 | 编辑源代码]
为每个应用单独添加命令行参数或者编写全局配置文件可以为 Electron 应用添加 Wayland 支持。
命令行参数[编辑 | 编辑源代码]
为了让基于 electron包的应用在 Wayland 下运行,必须添加这些命令行参数(例如 Electron 20 中): --ozone-platform-hint=auto
.
如果运行时发现应用没有标题栏,把上面的参数修改为--enable-features=WaylandWindowDecorations
。这个特性从 electron17 开始支持,且对于 GNOME 尤其必要。
一个技巧是把命令行参数添加到 .desktop 文件中 并将上面所说的命令行参数添加到 Exec=
行的末尾。
配置文件[编辑 | 编辑源代码]
添加或修改 ${XDG_CONFIG_HOME}/electron-flags.conf
(默认是 .config/electron-flags.conf
) 并添加下面提到的这些行:
~/.config/electron-flags.conf
--enable-features=WaylandWindowDecorations --ozone-platform-hint=auto
旧 Electron 版本[编辑 | 编辑源代码]
electron<version>-flags.conf
文件,但一个技巧是把它们软链接到 ${XDG_CONFIG_HOME}/electron-flags.conf
。老版本需要的参数也不一样,例如 Electron 13 需要:
~/.config/electron13-flags.conf
--enable-features=UseOzonePlatform --ozone-platform=wayland
对于中文用户[编辑 | 编辑源代码]
目前 Electron 运行在 Wayland 下时不能使用中文输入法(包括 Fcitx5、ibus等)输入文字,关于此问题另见这个GitHub Issue。
Java[编辑 | 编辑源代码]
The open source implementation of the Java platform OpenJDK, does not yet have native support for Wayland. Until Wakefield, the project that aims to implement Wayland in OpenJDK, is available, XWayland can be used.
XWayland[编辑 | 编辑源代码]
XWayland是一个运行在Wayland之下的 x 服务器,为尚未提供Wayland支持的本地 x11应用程序提供兼容性, 要使用它,安装 xorg-xwayland 包
XWayland 是通过一个混成器启动的,因此您应该检查所选混成器的文档以了解 XWayland 的兼容性以及如何启动 XWayland 的说明。
- 安全性:XWayland 是一个 X 服务器,因此它不具备 Wayland 的安全特性
- 性能:XWayland 的 性能几乎与 X11 相同。 在某些情况下,您可能会注意到性能下降,尤其是在 NVIDIA 卡上。
- 兼容性:XWayland 不完全向后兼容 X11。 某些应用程序可能无法在 XWayland 下正常运行。
Nvidia driver[编辑 | 编辑源代码]
需要启用 DRM KMS。 官方文档中可能有关于您的显示管理器(例如 GDM)的其他信息。
Tips and tricks[编辑 | 编辑源代码]
Automation[编辑 | 编辑源代码]
- ydotool (ydotool包) - Generic command-line automation tool (not limited to wayland). Enable/start the
ydotool.service
user unit. See ydotoold(8), ydotoold(1). - wtype (wtype包) - xdotool type for wayland. See wtype(1).
- keyboard - Python library that works on Windows and Linux with experimental OS X support. Also see the mouse library.
Kwin Wayland debug console[编辑 | 编辑源代码]
If you use kwin包, execute the following to see which windows use Xwayland or native Wayland, surfaces, input events, clipboard contents, and more.
$ qdbus org.kde.KWin /KWin org.kde.KWin.showDebugConsole
Detect Xwayland applications visually[编辑 | 编辑源代码]
To determine whether an application is running via Xwayland, you can run extramausAUR. Move your mouse pointer over the window of an application. If the red mouse moves, the application is running via Xwayland.
Alternatively, you can use xorg-xeyes包 and see if the eyes are moving, when moving the mouse pointer over an application window.
An other option is to run xwininfo (from xorg-xwininfo包) in a terminal window : when hovering over an Xwayland window the mouse pointer will turn into a + sign. If you click the window it will display some information and end, but it will not do anything with native Wayland windows.You can use Ctrl+C
to end it.
Remap keyboard or mouse keys[编辑 | 编辑源代码]
故障排除[编辑 | 编辑源代码]
颜色校正[编辑 | 编辑源代码]
请参阅 Backlight#Color correction。
慢动作、图形显示故障和崩溃[编辑 | 编辑源代码]
Gnome-shell 用户从 X 切换到 Wayland 时可能会遇到这样的问题。根本原因之一是可能用户自己为基于 Xorg 的 gnome-shell 设置了 CLUTTER_PAINT=disable-clipped-redraws:disable-culling
变量。只需尝试将变量从 /etc/environment
或其它 rc 文件中移除,即可查看是否一切恢复正常。
远程显示[编辑 | 编辑源代码]
- wlroots包 (sway 使用) 自 0.10 版本通过 wayvnc包 提供了一个 VNC 后端。RDP 后端则已被移除。 [5].
- mutter包 当前在编译时就启用了远程桌面功能,详情请参阅 [6] 和 gnome-remote-desktop包。
- FreeRDP 在 2013 年合并入了 Weston,通过编译标志 (compile flag) 启用。weston包 自 6.0.0 版本启用了 FreeRDP。
- waypipeAUR 或 waypipe-gitAUR 是适用于 Wayland 应用的透明代理,可通过内封装的命令在 SSH 上运行。
游戏、远程桌面和虚拟机窗口中的输入捕获问题[编辑 | 编辑源代码]
与 Xorg 相比,Wayland 并不允许独占输入设备捕获、也被称为主动捕获或显式捕获 (比如 键盘、鼠标 等设备)。相反,Wayland 依赖 Wayland 混成器传递键盘快捷键,并将指针设备限定在应用窗口中。
输入捕获方式的变化破坏了当前应用程序的行为,意味着:
- 热键组合和修饰符输入会被混成器捕获,并且不会发送到远程桌面和虚拟机窗口中。
- 鼠标指针将不会被限制在应用程序的窗口中,这可能会导致视差效应,即虚拟机或远程桌面的窗口内鼠标指针的位置与主机的鼠标指针发生偏差。
Wayland 通过为 Wayland 和 XWayland 添加协议扩展来解决此问题。为此 Wayland 混成器需要添加对这些扩展的支持。如果是本地 Wayland 客户端,其使用的部件工具集 (widget toolkits,比如 GTK,Qt) 需要支持这些插件;如果没有使用部件工具集,则需要支持应用程序本身。如果是 Xorg 应用程序,则不需要改变应用程序或者部件工具集,因为 Xwayland 的支持就足够了。
wayland-protocols包 中已经包含了这些扩展, 并由 xorg-xwayland包 支持。
相关的扩展有:
支持的 Wayland 混成器有:
支持的部件工具集有:
- GTK,从 3.22.18 版本开始支持。
GTK主题没有生效[编辑 | 编辑源代码]
请查看 https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland.
避免加载 NVIDIA 模块[编辑 | 编辑源代码]
在Wayland混成器(如sway)启动之前添加 __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json
到系统环境变量中。
参见[编辑 | 编辑源代码]
- Wayland 在线文档
- 官方 Wayland Git 仓库
- Fedora:How to debug Wayland problems
- Wayland 完成了吗?
- Wayland 项目汇总
- 光标主题
- Arch Linux 论坛讨论(页面将持续关注 Wayland 信息 ,如有兴趣请留意)
- i3 Migration Guide - Common X11 apps used on i3 with Wayland alternatives
- Wayland Explorer - A better way to read Wayland documentation
- How can I tell if an application is using XWayland