本文是一份在 Arch Linux 上实现完整的 Wayland 设置的指南。

原文:Full Wayland Setup on Arch Linux

如果你遵循整个指南,到最后你将拥有:

  • Sway 一个平铺式窗口管理器。
  • Waybar 一个与 Polybar 非常相似的状态条。
  • Wofi 一个纯 GTK(也就是 Wayland)的可定制应用程序启动器。
  • Alacritty 一个现代化的终端,”又不是不能用”。
  • Wayland 中的 Firefox 和 Chromium,可以进行屏幕共享。
  • Emacs 通过全新的纯 GTK 内部结构在 Wayland 中完全运行。
  • 大多数 QT 应用程序在 Wayland 中运行。
  • 如果可以的话,将 Steam 游戏设置为考虑 Wayland。
  • (可选)通过 Fcitx5 的日语输入。

你还将学习如何确认一个应用程序是否在 Wayland 中运行,并了解 XWayland 和那些仍然需要它才能正常运行的主要程序。 虽然本指南是以 Arch Linux 为基础编写的,但它应该可以适应你所运行的任何的 Linux 发行版。好好享受吧,祝你好运!

注意:在继续之前,你可能希望在手机或第二台电脑上打开本指南,因为我们需要在整个过程中多次重启你的窗口管理器。

开始之前:Wayland? XWayland?

Wayland 是 Linux 的下一代显示协议。你可能听说过 X(或 X11XOrg),但你可能不知道它的问题:年龄、性能、安全性和开发友好性。

甚至 Adam Jackson(X 的长期发布和管理者),也 呼吁采用 Wayland。 不过,X 已经很成熟了,过渡不会在一夜之间发生。Linux 系统中的许多核心应用都与它的生态系统紧密相连。

> pacman -Qg xorg | wc -l
38

你可能会惊讶地发现,你几乎肯定已经安装了 wayland

> pacman -Qi wayland
Name            : wayland
Version         : 1.19.0-1
Description     : A computer display server protocol
Architecture    : x86_64
URL             : https://wayland.freedesktop.org/
Licenses        : MIT
# ... etc.

幸运的是,Linux 生态系统向 Wayland 的过渡在这些年里一直在 稳步向前推进。 主要的 GUI 框架如 GTK 和 QT 完全支持它。 Ubuntu 21.04 将默认使用 Wayland 运行。 但我们可以不需要等待主要发行版的行动:今天就可以直接使用 Wayland。

你应该知道,有一些主要的应用程序并不(或不会 或不能)支持 Wayland。 像这样的程序仍然可以通过一个名为 XWayland 的独立的 X 实例在 Wayland 环境中运行。 这意味着向 Wayland 的过渡可以是渐进的:你不会无法使用旧的应用程序。

译者注:

XWayland 本质上时 XOrg 的一个 Fork,可以在 Wayland 环境中使用 XOrg

在我们继续之前,还有一个好消息: 在 Wayland 中,你不需要像 picomcompiz 这样独立于窗口管理器的合成器程序。

解释一下?更少的活动组件,更少的配置管理,就可以实现终端透明化

前提条件

软件包

在 Arch Linux 上,运行下面的命令来安装本指南主要部分和 Wayland 兼容性所需的环境。

sudo pacman -S \
  sway alacritty waybar wofi \
  xorg-xwayland xorg-xlsclients qt5-wayland glfw-wayland

qt5-waylandglfw-wayland 分别为 QT5 和 GLFW 提供 Wayland 兼容 API 。 xlsclients 在下文中解释。

xlsclients 检测 XWayland

要获得当前通过 XWayland 运行的所有窗口的列表,请使用 xlsclients

> xlsclients
archlinux  discord
archlinux  krita
archlinux  steam

这样,你就可以用各种应用程序快速测试你的 Wayland 配置。

Sway

Sway 是一个平铺式窗口管理器,是一个在 Wayland 环境下 i3 的替代品。 和它的 i3 一样,它也是用 C 语言编写的,因此速度非常快,资源开销也很小。 尽管 Sway 可以按原样读取 i3 的配置(即你的 /home/you/.config/i3/config),但我建议从一个默认配置开始,然后在你需要时复制特定的绑定。

首先,复制 Sway 的配置模板。

cd ~/.config
mkdir sway
cd sway
cp /etc/sway/config .

现在退出你所处的任何 桌面环境(DE) / 窗口管理器(WM),并回到你的基本登录终端。在这里,运行 sway,Sway 就会启动。恭喜你,你正在运行 Wayland!

好了,我们不要庆祝的太早。你可能已经习惯了在 .xinitrc 中加入 exec i3 这样的行,然后用 startx 启动 X。现在不一样了! 从这里开始,一切都发生在我们的 Sway 配置中。说到这,下面是一些重点。

Sway 配置和附加功能

这里是我的全部 Sway 配置。 其他方面,Sway 主要的文档是在它的 man pages 中记录的。如果有疑问,请先查看它们。 如果不行,你也可以参考 Sway Wiki

这里有一些有用的绑定,你马上就会需要,但以后可以自由改变。

  • 重新加载 Sway。Super+Shift+c (不会关闭正在运行的程序)
  • 退出 Sway。Super+Shift+e
  • 打开一个终端。Super+Return
  • 打开一个程序。Super+d

显示器设置

我有两台显示器:我的笔记本电脑在我的左边,而我主显示器在我的正前方。要让我的鼠标在显示器边界上自然移动,需要做以下工作。

output eDP-1 mode 2560x1440 position 0,0 scale 2
output HDMI-A-2 mode 1920x1080 position 1280,0

在确定第二个显示器(第二行中的 1280)使用的适当偏移量时,涉及到一些数学问题。更多信息见 man sway-output。 你可以使用 swaymsg -t get_outputs 来查看你所有显示器的正式名称和可用分辨率。

Gaps

i3-gaps 是一个流行的 i3 变种,允许窗口之间有间隙。幸运的是,这个功能已经包含在 Sway 中,可以通过在你的 Sway 配置中添加以下内容来激活。

# A 10-pixel border around every window.
gaps inner 10

# Removes the title bar of each window.
default_border pixel 3

你需要退出 Sway 一次,然后从你的登录终端重新运行它,这样的改变才会生效。

随机壁纸

虽然还没有整合到我自己的配置中,但 setwall 可以用来设置一个随机的背景图片。

setwall random ~/Pictures/backgrounds/ -c sway

译者注:

setwall 是这篇文章的原作者自己写的工具

Alacritty

Alacritty 是一个强大的现代终端模拟器,具有理想的默认值。当用 Super+Return 打开一个新的终端时,它也是 Sway 的默认快捷键。 我使用 urxvt 多年,但最近切换到 Alacritty 后,我遇到的一些问题就消失了。

我对 Alacritty 的默认配置的唯一改变是背景的不透明度。在 /home/you/.config/alacritty/alacritty.yml 中。

background_opacity: 0.8

看, 透明的终端!

译者注: 新版本的 Alacritty 推荐设置

window:
  opacity: 0.8

Waybar

Sway 的默认状态栏很好,但 Waybar 提供了更多的自定义功能。它还能在多个显示器上 “正常工作”,而不像 Polybar 那样需要自定义脚本。

要使用 Waybar 而不是默认 bar ,请注释掉你的 Sway 配置中靠近结尾的 bar 部分,并在其位置上添加以下内容。

bar {
  swaybar_command waybar
}

Waybar Wiki 有很多配置的例子, 这里是我自己的配置, 以及 自定义的 CSS 样式。 bar 本身是透明的,右上方的小部件和托盘看起来像这样。

waybar-top-right

在调整了你的 Waybar 配置后,像往常一样通过 Super+Shift+c 刷新 Sway,就可以刷新你的 Waybar 了。

Wofi

默认情况下,Sway 使用 dmenu 来打开程序,但令人惊讶的是,它的用户界面在 XWayland 中运行。 有 许多可用的替代品,我选择了 Wofi

wofi

这是 我设置的外观, 但由于它都是 CSS,所以你可以 自由地进行试验!

请注意,你需要在你的 Sway 配置中加入以下内容。

set $menu wofi --show=drun --lines=5 --prompt=""

这有几种不同的提示模式。 drun 只匹配并显示那些在你的机器上有 Desktop 条目的程序(就是有 .desktop 文件的程序),而不是你的 PATH 上的所有程序。 事实上,不这样做会产生性能问题,是一个已知的问题。

主要的应用程序

大多数应用程序,如果在 GTK 或 QT 上运行,都有自动的 Wayland 支持,不需要进一步配置。一些特定的程序需要进行调整,我们将在下面讨论。

目前有一些资源要求你需要设置 GTK 和 QT 的特定环境变量才能使用 Wayland,但 我发现这不是真的

Firefox

在 Firefox 的 about:support 页面上有一个名为 Window Protocol 的字段,告诉我们它是通过哪个协议运行的。 如果还在 X11 上,这个字段就会显示 X11。如果通过 Sway 而没有下面的调整,你应该看到 xwayland。 用 xlsclients 进行的快速测试也会发现,Firefox 还没有通过 Wayland 原生运行。让我们来解决这个问题。

MOZ_ENABLE_WAYLAND 环境变量设为 1 ,我在我的 Fish 配置中设置了以下内容(其他 shell 的用户也需要类似的内容)。

set -x MOZ_ENABLE_WAYLAND 1

退出 Sway 并完全注销一次。 一旦重新登录并重新打开 Sway,这个变量的变化应该已经传播到了所有重要的地方。 现在,如果你通过 Wofi 再次打开 Firefox,并检查 about:support,你应该发现。

firefox-wayland

Chromium

Chromium 的转换要简单一些。在 /home/you/.config/chromium-flags.conf 中,添加以下几行。

--enable-features=UseOzonePlatform
--ozone-platform=wayland

重新启动 Chromium,这样就可以了。你可以用 xlsclients 来确认。

Emacs

是的,Emacs 可以纯粹地在 Wayland 中运行。你们中的一些人可能会说。

但是 Emacs 并不是一个真正的 GTK 应用程序!

是的,这曾经是真的。从 2021 年初开始,Emacs 可以用 “纯 GTK” 的内部结构构建,使其完全兼容 Wayland。 这项功能将在 Emacs 28 中实现(截至本文撰写时尚未发布),但幸运的是, 有一个 AUR 包 可以跟踪 Wayland 开发分支,并提供一个预构建的二进制文件。 我们可以用 AURA 这样的工具来安装它。

译者注:

AURA 也是这篇文章的原作者写的,中文社区的用户可能更习惯使用 yay

sudo aura -Axa emacs-gcc-wayland-devel-bin

注意,这个软件包 Provides: emacs,所以它将取代你所安装的任何其他 Emacs 软件包。

Steam and Gaming

Among Us 这样的 Proton games 可以按原样运行, 因为它们在高度修改的 Wine/dependency 环境中运行,而这种环境对每个游戏都是已知的。 Among Us 对 Sway 中的窗口大小调整和重新定位反应良好。

对于像 Half-life (old)、 Trine 2 (graphics heavy) 和 Tabletop Simulator(modern toolchain)这样的原生游戏, 我不得不将环境变量 SDL_VIDEODRIVER 设为 x11。否则它们就不能正常启动。

来自 Arch Wiki:

注意: 许多专有游戏都捆绑了旧版本的 SDL,它们不支持 Wayland,如果你设置 SDL_VIDEODRIVER=wayland,可能会完全崩溃。

甚至 Stellaris 也需要 x11 才能工作。

如果你不想把所有 SDL 的使用强制到 X11,你也不必这样做。Steam 允许我们为每个游戏设置特定的环境变量。 要设置这个,右键单击一个游戏,并访问其 Properties。在 GENERAL > LAUNCH OPTIONS 中,输入以下内容,你的游戏应该可以运行了。

steam-sdl-override

所以重申一下,这里是我在 Fish 中设置的环境变量。

set -x SDL_VIDEODRIVER 'wayland'

而我在 Steam 中根据具体情况将其覆盖为 x11

Signal

在 2021 年 5 月初,Signal 发布了 5.1.0 版本,该版本使用与 Wayland 兼容的 Electron。 不幸的是,Arch 软件包 signal-desktop 还没有默认在这种模式下运行,所以手动激活是必要的。在命令行中。

signal-desktop --use-tray-icon --enable-features=UseOzonePlatform --ozon-platform=wayland

或者如果你通过启动器运行 Signal,我们可以编辑软件包提供的 .desktop 文件来尊重这些选项。 在 /usr/share/applications/signal-desktop.desktop 中,修改 Exec 一行,使其成为以下内容。

Exec=signal-desktop --use-tray-icon --enable-features=UseOzonePlatform --ozone-platform=wayland -- %u

类似的策略也适用于其他至少使用 12 版的 Electron 应用程序。

Other Settings

如果这里的章节对你不适用,请随意跳过。

Keyboard Layouts

我在打字时使用 Colemak 布局,所以我在我的 Sway 配置里有以下内容。

input * {
  xkb_layout "us"
  xkb_variant "colemak"
}

不幸的是,似乎有 一个奇怪的 Bug,在某些窗口中布局会突然切换回 qwerty。 我注意到以下症状:当一个终端被打开时,最左边的 XWayland 窗口会切换回 qwerty。 我发现有两个办法可以解决这个问题。

  • 尽可能多地使用纯 Wayland 应用程序,或者。
  • 安装一个IME(Input Method Editor),例如用于输入 non-ASCII 语言(见下文)。

日语输入法

Sway 已经非常接近对切换输入法的一流支持(见 Sway#4740Sway#5890Sway#4932)。 目前,这里有一个通过 dbus 工作的设置,允许我们在 除 Alacritty 之外的所有 Wayland 和 XWayland 窗口中改变方法和输入日文。

首先,安装这些软件包。

sudo pacman -S fcitx5 fcitx5-configtool \
  fcitx5-gtk fcitx5-mozc fcitx5-qt

然后在 /etc/environment 中添加以下内容:

GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx

然后把这个放到你的 Sway 配置中:

exec_always fcitx5 -d --replace

现在重新启动你的电脑。

希望你现在能在你的 Waybar 托盘中看到一个键盘图标。要配置 fcitx5,请打开 fcitx5-configtool。这是我的设置。

fcitx5

你会看到,我特别将我的英文键盘设置为 Colemak,并从右边的列表中添加了 Mozc。 勾选 Global Options 标签,设置你的方法切换键绑定。 之后,点击 Apply,你现在应该可以切换输入法并输入日语了。 如果键盘绑定不起作用,你也可以通过点击 Waybar 托盘上的图标来切换方法。

译者注:

对于中文用户,就是把 Mozc 换成 Rime

屏幕共享

在 Firefox 和 Chromium 中,通过 Pipewire 和一些辅助包可以实现屏幕共享,尽管目前我们只能共享整个屏幕,而不是单个窗口。要继续进行,首先安装以下软件包。

sudo pacman -S xdg-desktop-portal-wlr libpipewire02

后者只对 Chromium 是必要的。 现在重新启动你的电脑。

让我们先用 Mozilla 的 gum test page 测试一下 Firefox。 当浏览器提示你选择窗口时,选择 Use operating system settings:

firefox-screen-select

你会注意到你的光标发生了变化;xdg-desktop-portal-wlr 正在期待你选择一个显示器来共享。点击一个,屏幕共享应该开始。

对于 Chromium,我们需要激活一个功能标志,让 Chromium 与 Pipewire 对话。 首先访问 chrome://flags,然后找到并启用 WebRTC PipeWire support。这就是了!

如果你在使用这些浏览器时遇到问题,请查看 XDPW FAQ

XWayland 和不兼容

您还知道其他不兼容的情况吗?请让我知道。

Krita

数字艺术程序 Krita 是一个在 QT5 中运行的很棒的应用程序,但由于某些硬件支持不成熟的原因(对于手写板等), 它不支持 Wayland,因此总是在 XWayland 中运行。

Electron Apps

从 2021 年 5 月起,由于 Signal 和 VSCode 升级到 Electron 12,它们现在可以在 Wayland 中运行。

而其他 Electron Apps,如 Discord 和 Slack,则必须在 XWayland 中运行,直到他们能够升级。

社区提示

KWin 用户

感谢 flying-sheep 提供的这个提示。

对于使用 KWin 的人来说:你可以显示一个窗口,帮助你使用识别 XWayland 窗口。

qdbus org.kde.KWin /KWin org.kde.KWin.showDebugConsole

Polkit

感谢 Aaron Wiedemer 提出的以下建议。

一些应用程序有时需要权限,例如,软件管理器需要权限来启动更新,但只是搜索软件包不需要额外权限。 这些应用程序会弹出一个小盒子,要求输入密码。这需要一个不由 sway 启动的守护程序,所以我们需要用我们的 sway 配置自动启动一个。

Polkit 客户端有很多选择。 例如,polkit-gnome 没有依赖性,可以通过以下方式在 sway 中启动:

exec_always /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1

Resources