Wayland (简体中文)

From ArchWiki
翻译状态:本文是 Wayland翻译。上次翻译日期:2020-08-08。如果英文版本有所更改,则您可以帮助同步翻译。

Wayland 是一个用于 混成窗口管理器 与其客户端对话的协议,也是一个实现该协议的库。GNOMEKDE Plasma 等一些桌面环境支持 Wayland。它还有一个混成器实现参考叫做 Weston。Xwayland 则提供了一个兼容层,来让以前的 X11 应用程序能在 Wayland 中运行。

系统需求

目前 Wayland 只能在使用了 KMS 的系统上工作。Wayland 本身并不提供图形环境;为此还需要安装混成器(比如 WestonSway),或者内置混成器的桌面环境,比如 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].
要使用 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
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 ||
  • Maynard — 基于 GTK,是 Weston 的桌面 Shell 客户端。它曾基于 weston-gtk-shell(Tiago Vignatti 的一个项目),后者已不再开发。[4][5]
https://github.com/raspberrypi/maynard || maynard-gitAUR

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

显示管理器

下面列出的显示管理器均支持 Wayland 混成器。“类型”列指明了显示管理器是否支持在 Wayland 上运行。

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

图形库

详情请查看 官方网站

GTK

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

Qt 5

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

要搭配 Wayland 插件一起运行 Qt 5 应用程序[6],请使用 -platform waylandQT_QPA_PLATFORM=wayland 环境变量;要强制在 Wayland 会话中使用 X11,则使用 QT_QPA_PLATFORM=xcb。后者对于某些不使用系统 Qt 实现的应用(比如 zoomAUR),可能是必需的。

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

要在 Wayland 后端上使用 GLEW,请安装 glew-waylandAUR 软件包(而不是 glew)。

EFL

EFL 已经完全支持 Wayland。要在 Wayland 上运行 EFL 应用,请参阅 Wayland 项目页面

winit

Winit 是 Rust 语言中的窗口处理库。其默认使用 Wayland 后端,但是可以通过修改环境变量为 WINIT_UNIX_BACKEND=x11 覆盖设置将其切换到 Xwayland。

Electron

注意: 遗憾的是目前没办法通过系统环境变量来为 Electron 应用启用 Wayland 支持。必须为每个应用单独添加命令行参数或者编写配置文件。这个Feature Request 请求 Electron 添加相关支持。

为每个应用单独添加命令行参数或者编写配置文件可以为 Electron 应用添加 Wayland 支持。其中配置文件的优先级又要高于命令行参数的优先级。如果某些应用程序需要不同的参数,则必须注意它们不要与配置文件中的标志重复。

命令行参数

为了让基于 electron的应用在 Wayland 下运行,必须添加这些命令行参数: --enable-features=UseOzonePlatform --ozone-platform=wayland.

如果运行时发现应用没有标题栏,把上面的参数修改为 --enable-features=UseOzonePlatform,WaylandWindowDecorations --ozone-platform=wayland。这个特性从 electron17 开始支持,且对于 GNOME 尤其必要。

一个技巧是把命令行参数添加到 .desktop 文件中 并将上面所说的命令行参数添加到 Exec= 行的末尾。

警告: 比如 Visual Studio Code (bug report) 这样的一些应用在启动时不会接受你设定的命令行参数,这个问题需要由应用的开发者才能予以解决。

配置文件

添加或修改 ${XDG_CONFIG_HOME}/electron-flags.conf (如果 ${XDG_CONFIG_HOME} 没有被手动设置过,默认来说是 .config/electron-flags.conf ) 并添加下面提到的这些行:

~/.config/electron-flags.conf
--enable-features=UseOzonePlatform,WaylandWindowDecorations
--ozone-platform=wayland
注意: 旧版本的 Electron 需要单独设置 electron<version>-flags.conf 文件,但一个技巧是把它们软链接到 ${XDG_CONFIG_HOME}/electron-flags.conf
警告: 一些应用在启动时不会读取配置文件,这个问题需要由应用的开发者才能予以解决。

对于中文用户

目前 Electron 运行在 Wayland 下时不能使用中文输入法(包括 Fcitx5、ibus等)输入文字,关于此问题另见这个GitHub Issue

故障排除

颜色校正

请参阅 Backlight#Color correction

慢动作、图形显示故障和崩溃

Gnome-shell 用户从 X 切换到 Wayland 时可能会遇到这样的问题。根本原因之一是可能用户自己为基于 Xorg 的 gnome-shell 设置了 CLUTTER_PAINT=disable-clipped-redraws:disable-culling 变量。只需尝试将变量从 /etc/environment 或其它 rc 文件中移除,即可查看是否一切恢复正常。

无法在 display: :0 打开 Electron 应用

请确保没有设定 GDK_BACKEND=wayland 变量。将此变量应用到全局会使 Electron 应用中断运行。

远程显示

  • (20200206) wlroots (sway 使用) 自 0.10 版本通过 wayvnc 提供了一个 VNC 后端。RDP 后端则已被移除。 [7].
  • (20180401) mutter 当前在编译时就启用了远程桌面功能,详情请参阅 [8]gnome-remote-desktop
  • FreeRDP 在 2013 年合并入了 Weston,通过编译标志 (compile flag) 启用。weston 自 6.0.0 版本启用了 FreeRDP。
  • waypipe-gitAUR 是适用于 Wayland 应用的透明代理,可通过内封装的命令在 SSH 上运行。

游戏、远程桌面和虚拟机窗口中的输入捕获问题

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

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

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

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

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

相关的扩展有:

支持的 Wayland 混成器有:

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

支持的部件工具集有:

  • GTK,从 3.22.18 版本开始支持。

参见