Wayland

来自 Arch Linux 中文维基

Wayland 是一个显示服务器协议,目标是替代掉 X Window System这里 有 Wayland 和 Xorg 的对比。

使用 Wayland 协议的显示服务器被称为 混成器(compositors),因为它们会被用作混成窗口管理器

XWayland 在 Wayland 中提供了 X server,可以让 X11 应用程序无缝运行于 Wayland 中。

系统需求[编辑 | 编辑源代码]

目前 Wayland 只能在使用了 KMS 的系统上工作。Wayland 本身并不提供图形环境;为此还需要安装混成器,或者内置混成器的桌面环境,比如 GNOMEKDE

为了使 GPU 驱动程序和 Wayland 混成器兼容,它们必须支持相同的缓冲器 API(Buffer API)。现在主要有两种 API:GBMEGLStreams.

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

注意在错误的环境下设置此变量有可能导致火狐浏览器崩溃之类的问题。

混成器[编辑 | 编辑源代码]

平铺式堆叠式的区别参见窗口管理器#类型

平铺式[编辑 | 编辑源代码]

https://github.com/project-repo/cagebreak || cagebreakAUR cagebreak-binAUR
  • Cardboard — 基于 wlroots 的滚动混成器,受 PaperWM 启发。
https://gitlab.com/cardboardwm/cardboard || cardboard-gitAUR
  • dwl — 类似 dwm的 Wayland 混成器,基于 wlroots。
https://github.com/djpohly/dwl || dwlAUR
  • Hyprland — A dynamic tiling Wayland compositor that does not sacrifice on its looks.
https://github.com/vaxerski/Hyprland || hyprlandAUR
  • japokwm — Dynamic Wayland tiling compositor based around creating layouts, based on wlroots.
https://github.com/werererer/japokwm || japokwm-gitAUR
  • newm — 考虑到笔记本电脑和触摸板的 Wayland 混成器。
https://github.com/jbuchermn/newm/ || newm-gitAUR
  • Qtile — A full-featured, hackable tiling window manager and Wayland compositor written and configured in Python.
https://github.com/qtile/qtile || qtile
  • river — 动态平铺 Wayland 混成器,受 dwm 和 bspwm 启发。
https://github.com/ifreund/river || riverAUR
  • Sway — 兼容 i3 的 Wayland 混成器,基于 wlroots。
https://github.com/swaywm/sway || sway
  • Velox — 基于 swc 的简单窗口管理器,受 dwm 和 xmonad 启发。
https://github.com/michaelforney/velox || velox-gitAUR
  • Vivarium — A dynamic tiling Wayland compositor using wlroots, with desktop semantics inspired by xmonad.
https://github.com/inclement/vivarium || vivarium-gitAUR
  • waymonad — 用 Haskell 编写的 Wayland 混成器,受 xmonad 启发。
https://github.com/waymonad/waymonad || not packaged? search in AUR

堆叠式[编辑 | 编辑源代码]

https://www.enlightenment.org/ || enlightenment
  • Greenfield — 是一款可以在网页浏览器中运行、并显示远程应用的 Wayland 混成器。
https://greenfield.app/ ||
  • Grefsen — 是一款提供最精简桌面环境的 Qt/Wayland 混成器。
https://github.com/ec1oud/grefsen ||
  • hikari — 基于 wlroots 并受 cwm 启发开发,在 FreeBSD 上开发很活跃,但也支持 Linux。
https://hikari.acmelabs.space/ || hikariAUR
https://userbase.kde.org/KWin || kwin
  • Liri Shell — 是 Liri 一部分,其使用 QtQuick 和 QtCompositor 为 Wayland 构建。
https://github.com/lirios/shell || liri-shell-gitAUR
  • labwc — 受 Openbox 启发,基于 wlroots 的混成器.
https://github.com/labwc/labwc || labwc-gitAUR
https://gitlab.gnome.org/GNOME/mutter || mutter
  • Orbital — 是一款使用 Qt5 和 Weston 的混成器和 Shell(它更像是窗户管理器而非桌面环境)。目标是构建一个简单但灵活且美观的桌面。
https://github.com/giucam/orbital ||
  • wayfire — 3D 混成器,受 Compiz 启发并基于 wlroots 开发。
https://wayfire.org/ || wayfireAUR
  • Weston — 本身还是其它 Wayland 混成器开发的实现参考。
https://gitlab.freedesktop.org/wayland/weston || weston
  • wio — 是一款基于 wlroots 的混成器,致力于复刻 Plan 9 的 Rio 桌面的外观和质感。
https://wio-project.org/[失效链接 2022-09-23 ⓘ] ||

其它类型[编辑 | 编辑源代码]

  • Cage — 显示单个全屏应用程序(就像自助取款机那样)。
https://www.hjdskes.nl/projects/cage/ || cage
  • Maze Compositor — 使用 Qt 将窗口渲染成 3D 迷宫一样。
https://github.com/imbavirus/mazecompositor ||
  • Motorcar — 是一款使用虚拟现实来探索 3D 窗口的 Wayland 混成器。
https://github.com/evil0sheep/motorcar ||
  • nwg-shell — A GTK-based shell for the sway Wayland compositor.
https://github.com/nwg-piotr/nwg-shell || nwg-shellAUR
  • kiwmi — A fully programmable Wayland Compositor.
https://github.com/buffet/kiwmi || kiwmi-gitAUR

上述某些混成器/窗户管理器支持 显示管理器。请检查 /usr/share/wayland-sessions/compositor.desktop 文件看它们如何启动。

显示管理器[编辑 | 编辑源代码]

下面列出的显示管理器均支持 Wayland 混成器。

名称 在 Wayland 上运行 描述
GDM GNOME 的显示管理器。
greetd 提供了 Wayland 登陆程序 小巧且灵活的登录守护程序。
LightDM 跨桌面显示管理器。
Ly 在控制台中运行 用 C 语言编写的 TUI 显示管理器。
SDDM 基于 QML 开发的显示管理器。
tbsm 用纯 Bash 编写的简单 CLI 会话启动器。

图形库[编辑 | 编辑源代码]

详情请查看 官方网站

GTK[编辑 | 编辑源代码]

gtk3gtk4 包已经提供了 Wayland 支持。GTK 会默认使用 Wayland 后端,但是可以通过修改环境变量为 GDK_BACKEND=x11 覆盖设置将其切换到 Xwayland。

Qt 5[编辑 | 编辑源代码]

要在 Qt 5 和 6 中启用 Wayland 支持,请按需要安装 qt5-waylandqt6-wayland 软件包。

要搭配 Wayland 插件一起运行 Qt 5 应用程序[3],请使用 -platform waylandQT_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,导致并不支持 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= 行的末尾。

警告: visual-studio-code-binAUR (bug report) 这样的一些应用在启动时不会将命令行参数传递给 Electron,这个问题需要由应用的开发者才能解决。

配置文件[编辑 | 编辑源代码]

添加或修改 ${XDG_CONFIG_HOME}/electron-flags.conf (默认是 .config/electron-flags.conf ) 并添加下面提到的这些行:

~/.config/electron-flags.conf
--enable-features=WaylandWindowDecorations
--ozone-platform-hint=auto
注意: These configuration files only work for the Electron packages in the official repositories and packages that use them. They do not work for packages that bundle their own build of Electron such as slack-desktopAUR. Sometimes alternatives exist such as slack-electronAUR.

旧 Electron 版本[编辑 | 编辑源代码]

注意: 旧版本的 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[编辑 | 编辑源代码]

注意: 版本470之前的 Nvidia 驱动程序 (例如. nvidia-390xx-dkmsAUR) 不支持硬件加速的 XWayland,导致非 Wayland 本地应用程序在Wayland会话中性能不佳。

需要启用 DRM KMS。 官方文档中可能有关于您的显示管理器(例如 GDM)的其他信息。

Tips and tricks[编辑 | 编辑源代码]

Automation[编辑 | 编辑源代码]

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[编辑 | 编辑源代码]

See Input remap utilities.

故障排除[编辑 | 编辑源代码]

颜色校正[编辑 | 编辑源代码]

请参阅 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。
  • waypipeAURwaypipe-gitAUR 是适用于 Wayland 应用的透明代理,可通过内封装的命令在 SSH 上运行。

游戏、远程桌面和虚拟机窗口中的输入捕获问题[编辑 | 编辑源代码]

与 Xorg 相比,Wayland 并不允许独占输入设备捕获、也被称为主动捕获或显式捕获 (比如 键盘鼠标 等设备)。相反,Wayland 依赖 Wayland 混成器传递键盘快捷键,并将指针设备限定在应用窗口中。

输入捕获方式的变化破坏了当前应用程序的行为,意味着:

  • 热键组合和修饰符输入会被混成器捕获,并且不会发送到远程桌面和虚拟机窗口中。
  • 鼠标指针将不会被限制在应用程序的窗口中,这可能会导致视差效应,即虚拟机或远程桌面的窗口内鼠标指针的位置与主机的鼠标指针发生偏差。

Wayland 通过为 Wayland 和 XWayland 添加协议扩展来解决此问题。为此 Wayland 混成器需要添加对这些扩展的支持。如果是本地 Wayland 客户端,其使用的部件工具集 (widget toolkits,比如 GTK,Qt) 需要支持这些插件;如果没有使用部件工具集,则需要支持应用程序本身。如果是 Xorg 应用程序,则不需要改变应用程序或者部件工具集,因为 Xwayland 的支持就足够了。

wayland-protocols 中已经包含了这些扩展, 并由 xorg-xwayland 支持。

相关的扩展有:

支持的 Wayland 混成器有:

  • Mutter,GNOME 的混成器(窗口管理器),从 3.28 版本 开始支持
  • wlroots 支持相对指针协议和指针约束协议

支持的部件工具集有:

  • 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 到系统环境变量中。

参见[编辑 | 编辑源代码]

参考来源[编辑 | 编辑源代码]