Wayland

出自 ArchWiki

Wayland 是一种显示服务器协议。它的目标是成为 X Window 系统的继任者。您可以在维基百科上找到 Wayland 和 Xorg 之间的比较

使用 Wayland 协议的显示服务器被称为合成器,因为它们也充当 合成窗口管理器。下面您可以找到 Wayland 合成器的列表

为了与原生 X11 应用程序兼容并使其无缝运行,可以使用 Xwayland,它在 Wayland 中提供了一个 X Server。

要求

大多数 Wayland 合成器仅在使用 内核模式设置的系统上工作。Wayland 本身不提供图形环境;为此,您还需要一个合成器(请参阅以下部分),或者包含合成器的桌面环境(例如 GNOMEPlasma)。

为了使 GPU 驱动程序和 Wayland 合成器兼容,它们必须支持相同的缓冲区 API。主要有两种 API:GBMEGLStreams

缓冲区 API GPU 驱动程序支持 Wayland 合成器支持
GBM NVIDIA < 495* 外的所有 所有
EGLStreams NVIDIA GNOME
* NVIDIA ≥ 495 同时支持 EGLStreams 和 GBM。[1]

由于 NVIDIA 引入了 GBM 支持,许多合成器(包括 Mutter 和 KWin)开始默认对 NVIDIA ≥ 495 使用它。GBM 通常被认为更好,具有更广泛的支持,而 EGLStreams 仅在 NVIDIA 没有提供任何替代方法来在其专有驱动程序下与 Wayland 一起使用其 GPU 时才获得支持。此外,在 GBM 被引入 NVIDIA 后,KWin 放弃了对 EGLStreams 的支持

如果您使用流行的桌面环境/合成器和 NVIDIA 仍然支持的 GPU,那么您很可能已经在使用 GBM 后端。要检查,请运行 journalctl -b 0 --grep "renderer for"。要强制使用 GBM 作为后端,请设置以下环境变量

GBM_BACKEND=nvidia-drm
__GLX_VENDOR_LIBRARY_NAME=nvidia

合成器

有关堆叠式平铺式动态式之间的差异,请参阅 窗口管理器#类型

堆叠式

https://www.enlightenment.org/ || enlightenment
  • hikari — 基于 wlroots 的合成器,灵感来自 cwm,它在 FreeBSD 上积极开发,但也支持 Linux。
https://web.archive.org/web/20241220075628/https://hikari.acmelabs.space/ || hikariAUR
https://userbase.kde.org/KWin || kwin
  • Liri ShellLiri 的一部分,使用 QtQuick 和 QtCompositor 构建,作为 Wayland 的合成器。
https://github.com/lirios/shell || liri-shell-gitAUR
  • labwc — 基于 wlroots 的合成器,灵感来自 Openbox。
https://github.com/labwc/labwc || labwc
https://gitlab.gnome.org/GNOME/mutter || mutter
  • wayfire — 3D 合成器,灵感来自 Compiz,并基于 wlroots。
https://wayfire.org/ || wayfireAUR
  • Weston — Wayland 合成器,旨在实现正确性、可靠性、可预测性和性能。
https://gitlab.freedesktop.org/wayland/weston || weston
  • wio — 基于 wlroots 的合成器,旨在复制 Plan 9 的 Rio 桌面的外观和感觉。
https://gitlab.com/Rubo/wio || wio-wlAUR

平铺式

https://github.com/project-repo/cagebreak || cagebreakAUR
  • miracle-wm — 基于 Mir 的 Wayland 合成器,风格类似于 i3 和 sway,旨在比两者都更华丽和功能更丰富,例如 swayfx。
https://github.com/miracle-wm-org/miracle-wm || miracle-wmAUR
  • niri — 滚动平铺式 Wayland 合成器。
https://github.com/YaLTeR/niri/ || niri
  • Qtile — 功能齐全、可破解的平铺窗口管理器和 Wayland 合成器,使用 Python 编写和配置。
https://github.com/qtile/qtile || qtile
  • Sway — 基于 wlroots 的、与 i3 兼容的 Wayland 合成器。
https://github.com/swaywm/sway || sway
  • SwayFxSway,但带有视觉特效!
https://github.com/WillPower3309/swayfx || swayfxAUR
  • Velox — 基于 swc 的简单窗口管理器,灵感来自 dwm 和 xmonad
https://github.com/michaelforney/velox || velox-gitAUR

动态式

  • dwl — 基于 wlroots 的、类似 dwm 的 Wayland 合成器。
https://codeberg.org/dwl/dwl || dwlAUR
  • Hyprland — 一款动态平铺 Wayland 合成器,在外观上毫不妥协。
https://hyprland.org || hyprland
  • japokwm — 基于 wlroots 构建布局的动态 Wayland 平铺合成器。
https://github.com/werererer/japokwm || japokwm-gitAUR
  • river — 动态平铺 Wayland 合成器,灵感来自 dwm 和 bspwm
https://codeberg.org/river/river || river
  • Vivarium — 一款动态平铺 Wayland 合成器,使用 wlroots,其桌面语义灵感来自 xmonad
https://github.com/inclement/vivarium || vivarium-gitAUR

其他

  • Cage — 显示单个全屏应用程序,如信息亭。
https://www.hjdskes.nl/projects/cage/ || cage
  • phoc — 一款微型的、基于 wlroots 的合成器,用于移动设备。
https://gitlab.gnome.org/World/Phosh/phoc || phoc

以上某些可能支持显示管理器。检查 /usr/share/wayland-sessions/compositor.desktop 以查看它们的启动方式。

显示管理器

下面列出的显示管理器支持启动 Wayland 合成器。

名称 自身是否在 Wayland 上运行? 描述
emptty TTY 上的简单 CLI 显示管理器。
GDM GNOME 显示管理器。
greetd 当使用 Wayland 问候程序时 最小化且灵活的登录守护程序。
lemurs 用 Rust 编写的 TUI 显示管理器。
LightDM 跨桌面显示管理器。
ly 用 C 编写的 TUI 显示管理器
SDDM 基于 QML 的显示管理器。
tbsmAUR 用纯 bash 编写的简单 CLI 会话启动器。
uwsm 用于独立合成器的会话和 XDG 自动启动管理器,利用 Systemd 机制。

Xwayland

Xwayland(1) 是一种在 Wayland 下运行的 X 服务器,为尚未提供 Wayland 支持的原生 X11 应用程序提供兼容性。要使用它,安装 xorg-xwayland 软件包。

Xwayland 通过合成器启动,因此您应该查看所选合成器的文档,以了解 Xwayland 兼容性和有关如何启动 Xwayland 的说明。

注意
  • 安全性:Xwayland 是一种 X 服务器,因此它不具备 Wayland 的安全功能
  • 性能:Xwayland 的性能与 X11 几乎相同。在某些情况下,您可能会注意到性能下降,尤其是在 NVIDIA 显卡上。
  • 兼容性:Xwayland 与 X11 不是完全向后兼容的。某些应用程序可能在 Xwayland 下无法正常工作。

NVIDIA 驱动程序

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

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

Kwin Wayland 调试控制台

如果您使用 kwin,请执行以下命令以查看哪些窗口使用 Xwayland 或原生 Wayland、表面、输入事件、剪贴板内容等。

$ qdbus6 org.kde.KWin /KWin org.kde.KWin.showDebugConsole

可视化地检测 Xwayland 应用程序

要确定应用程序是否通过 Xwayland 运行,您可以运行 extramausAUR。将鼠标指针移动到应用程序的窗口上。如果红色鼠标移动,则应用程序通过 Xwayland 运行。

或者,您可以使用 xorg-xeyes,并在将鼠标指针移动到应用程序窗口上时查看眼睛是否在移动。

另一种选择是在终端窗口中运行 xwininfo(来自 xorg-xwininfo):当鼠标悬停在 Xwayland 窗口上时,鼠标指针将变为 + 号。如果您单击该窗口,它将显示一些信息并结束,但它不会对原生 Wayland 窗口执行任何操作。您可以使用 Ctrl+C 结束它。

您还可以使用 xlsclients(来自 xorg-xlsclients 软件包)。要列出所有通过 Xwayland 运行的应用程序,请运行 xlsclients -l

GUI 库

有关详细信息,请参阅 官方网站[死链 2024-10-12 ⓘ]

GTK

gtk3gtk4 软件包已启用 Wayland 后端。GTK 将默认使用 Wayland 后端,但可以通过修改环境变量将其覆盖为 Xwayland:GDK_BACKEND=x11

有关主题问题,请参阅 GTK#Wayland 后端

Qt

要在 Qt 5 或 6 中启用 Wayland 支持,请分别安装 qt5-waylandqt6-wayland 软件包。然后,Qt 应用程序将在 Wayland 会话中的 Wayland 下运行。

虽然应该没有必要,但要显式地使用 Wayland 插件 [4] 运行 Qt 应用程序,请使用 -platform waylandQT_QPA_PLATFORM=wayland 环境变量

要在 Wayland 会话中强制使用 X11,请使用 QT_QPA_PLATFORM=xcb。对于某些不使用系统 Qt 实现的专有应用程序(例如 zoomAUR),这可能是必要的。QT_QPA_PLATFORM="wayland;xcb" 允许 Qt 在 Wayland 不可用时改用 xcb (X11) 插件。[5]

本文或本节的事实准确性存在争议。

原因: 这感觉是错误的或过时的。我不知道其他潜在的应用程序,但 KeepassXC 不需要任何这些东西就可以在 Sway 下正确最小化到托盘(在 Talk:Wayland 中讨论)

在某些合成器上,例如 sway,原生运行的 Qt 应用程序可能缺少功能。例如,KeepassXC 将无法最小化到托盘。这可以通过安装 qt5ct 并在运行应用程序之前设置 QT_QPA_PLATFORMTHEME=qt5ct 来解决。

由于 在 Wayland 上使用分数缩放时,带有 WebEngine 的 Qt WebEngine 出现不正确的尺寸和不良的文本渲染 Qt WebEngine 错误,使用 Qt WebEngine 的应用程序(例如 Calibre)可能会显示锯齿状字体。一种解决方法是使用 QT_SCALE_FACTOR_ROUNDING_POLICY=RoundPreferFloor 启动应用程序。这可以防止应用程序窗口被分数缩放。

Clutter

Clutter 工具包具有 Wayland 后端,使其可以作为 Wayland 客户端运行。后端在 clutter 软件包中启用。

要在 Wayland 上运行 Clutter 应用程序,请设置 CLUTTER_BACKEND=wayland

SDL2

要在 Wayland 上运行 SDL2 应用程序,请设置 SDL_VIDEODRIVER=waylandSDL_VIDEODRIVER="wayland,x11" 允许 SDL2 在 Wayland 不可用时改用 x11 视频驱动程序。[6] 您可能还需要安装 libdecor 以启用窗口装饰(例如,在 GNOME 上)。

GLFW

glfw 软件包支持 Wayland,如果 环境变量 XDG_SESSION_TYPE 设置为 wayland 并且应用程序开发人员未设置特定的所需后端,则使用 Wayland 后端。

有关更多信息,请参阅 源代码

GLEW

glew-waylandAUR 软件包目前仍然无法与许多基于 GLEW 的应用程序一起使用,因此唯一的选择是使用带有 Xwayland 的 glew。请参阅 FS#62713

EFL

EFL 具有完整的 Wayland 支持。要在 Wayland 上运行 EFL 应用程序,请参阅 Wayland 项目页面[死链 2024-10-12 ⓘ]

winit

Winit 是 Rust 中的一个窗口处理库。它将默认使用 Wayland 后端,但可以通过修改环境变量将其覆盖为 Xwayland

  • 在 0.29.2 版本之前,设置 WINIT_UNIX_BACKEND=x11
  • 对于 0.29.2 及更高版本,取消设置 WAYLAND_DISPLAY,这将强制回退到使用 DISPLAY 变量的 X。[7]

Electron

可以通过每应用程序命令行标志或更全局地使用配置文件来激活 Wayland 支持。有关详细信息,请参阅 #配置文件

要确定应用程序使用的 electron 版本,请参阅 [8]

注意: 在 Plasma 中,某些 Electron 应用程序可能会为窗口使用错误的图标(默认的 Wayland 图标),同时为任务栏使用正确的图标。要修复此问题,您可以创建一个特殊的应用程序/窗口规则,强制此类应用程序使用桌面文件名。

环境变量

使用 Electron 28 及更高版本的应用程序可以使用 环境变量 ELECTRON_OZONE_PLATFORM_HINT 设置为 autowayland

这比命令行标志的优先级低。

命令行标志

与 Electron 所基于的 Chromium 不同,Electron 应用程序默认不通过 PipeWire 启用 WebRTC 屏幕捕获。因此,建议使用 --enable-features=WebRTCPipeWireCapturer 以避免 Wayland 上的屏幕捕获问题。捕获基于 xdg-desktop-portal

要在使用环境变量不可取或不可行时,在 Wayland 下原生使用基于 electron 的应用程序,可以在 Electron 20+ 上添加 --ozone-platform-hint=auto

缺少顶部栏的问题可以通过使用 --enable-features=WaylandWindowDecorations 来解决。这通常在 GNOME 下是必要的(自 electron17 起支持)。

您可以通过修改应用程序的 .desktop 文件并将标志添加到 Exec= 行的末尾,或者更简洁地使用下面描述的配置文件来更永久地设置这些标志。

注意: 某些软件包不将标志转发到 Electron,因此需要应用程序开发人员实施解决方案。

配置文件

Electron 软件包读取 ~/.config/electronXX-flags.conf 文件,其中 XX 是 Electron 版本,如果版本化的文件不存在,则回退到共享的 ~/.config/electron-flags.conf

将前面提到的标志每行放置一个

~/.config/electron-flags.conf
--enable-features=WaylandWindowDecorations
--ozone-platform-hint=auto
注意: 这些配置文件仅适用于官方存储库中的 Electron 软件包以及使用它们的软件包。它们不适用于捆绑了自己的 Electron 构建版本的软件包,例如 slack-desktopAUR。有时存在替代方案,例如 slack-electronAUR

较旧的 Electron 版本

electron25-flags.conf 仅适用于 Electron 的 25 版本。可以使用其自己的 electron<version>-flags.conf 文件配置较旧版本的 Electron。

较旧的版本也可能需要不同的标志,具体取决于相应的 Chromium 版本。例如,以下标志在 Electron 13 上有效

~/.config/electron13-flags.conf
--enable-features=UseOzonePlatform
--ozone-platform=wayland

Java

Java 平台的开源实现 OpenJDK 尚不原生支持 Wayland。在旨在在 OpenJDK 中实现 Wayland 的项目 Wakefield 可用之前,可以使用 Xwayland。

请参阅 Debian:Wayland#Java Programs (OpenJDK 16? 版本后支持)

从 OpenJDK 16 开始,JRE 可以动态加载 GTK3(它具有 Wayland 支持),根据此讨论,这似乎可能被支持。
可以将 _JAVA_AWT_WM_NONREPARENTING 环境变量 设置为“1”,以修复应用程序以空白屏幕启动的错误行为。

由于 XWayland 与 Wayland 没有完全的功能对等性,因此可以使用 WLToolkit 来填补 Wakefield 尚未准备就绪时的空白。可以使用 -Dawt.toolkit.name=WLToolkit 激活它。一些程序(例如 JetBrains IDE)支持它。

提示与技巧

自动化

重映射键盘或鼠标按键

参见输入重映射工具

使用 X11 应用程序录制 Wayland 窗口

参见屏幕捕获#使用 X11 应用程序录制 Wayland 窗口

Chromium 未完全最大化

您必须通过 chrome://settings/appearance 菜单启用使用系统标题栏和边框

应用程序关闭后保持剪贴板内容

本文或本节可能需要与剪贴板合并。

注意: 即使在 Xorg 上这也是标准行为。还有许多其他剪贴板管理器。(在Talk:Wayland中讨论)

由于 Wayland 的设计理念,剪贴板数据存储在源客户端的内存中。当客户端关闭时,剪贴板数据将丢失。您可以使用 wl-clip-persist 来解决此问题,它在后台运行以读取剪贴板数据并将其存储在自己的内存中,与源客户端分离。

故障排除

色彩校正

参见背光#色彩校正

慢动作、图形故障和崩溃

Gnome-shell 用户从 X 切换到 Wayland 时可能会遇到显示问题。其中一个根本原因可能是您为基于 Xorg 的 gnome-shell 设置的 CLUTTER_PAINT=disable-clipped-redraws:disable-culling。尝试从 /etc/environment 或其他 rc 文件中删除它,看看是否一切恢复正常。

远程显示

  • wlrootssway 使用)自 0.10 版本以来通过 wayvnc 提供 VNC 后端。 RDP 后端已在 [9] 中移除。
  • mutter 现在在编译时启用了远程桌面,请参阅 [10]gnome-remote-desktop 了解详细信息。
  • krfbkwin 提供 VNC 服务器。 krfb-virtualmonitor 可用于将另一台设备设置为额外的显示器。
  • 2013 年,FreeRDP 合并到 Weston 中,通过编译标志启用。weston 软件包自 6.0.0 版本起已启用它。
  • waypipeAUR(或 waypipe-gitAUR)是 Wayland 应用程序的透明代理,带有一个包装命令,可以通过 SSH 运行
    • 这是一个在 Plasma 下启动远程 KDE kcalc 的示例
$ waypipe ssh example.local env QT_QPA_PLATFORM=wayland-egl QT_QPA_PLATFORMTHEME=KDE dbus-launch kcalc

游戏中、远程桌面和虚拟机窗口中的输入抓取

与 Xorg 相比,Wayland 不允许独占输入设备抓取,也称为主动或显式抓取(例如 键盘鼠标),相反,它依赖 Wayland 合成器来传递键盘快捷键并将指针设备限制在应用程序窗口中。

输入抓取的这种变化破坏了当前应用程序的行为,意味着

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

Wayland 通过为 Wayland 和 Xwayland 添加协议扩展来解决此问题。 Wayland 合成器需要添加对这些扩展的支持。对于原生 Wayland 客户端,使用的窗口小部件工具包(例如 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 模块

在启动像 sway 这样的 Wayland 合成器之前,添加 __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json 作为环境变量

放大/表面缩放

屏幕放大问题尚未解决,2022 年年中合并了一个 pull request 提供了 wp-surface-scale 协议

自内核 6.11.2 (AMD) 以来的 Wayland 延迟/卡顿

在该问题在未来的内核版本中得到修补之前,一个权宜之计是将 amdgpu.dcdebugmask=0x400 添加到 cmdline。

参见:https://community.frame.work/t/wayland-lag-stuttering-since-kernel-6-11-2/59422

另请参阅