我绝对不知道,我作为一个 KDE Plasma 忠实用户怎么换到 Sway 去了。 本人是多年 KDE 老用户,直到双十一入手了某国产白菜价 27 吋 4k 显示器,用以替换掉原有双 1080p 屏幕其中之一,与留下的一块组双屏使用。

高分屏自然是要设置缩放的,但发现 KDE 设置中无法分别为两块屏幕设置不同的缩放比例,经查询得知这是 Xorg 的限制,Wayland 支持这种设置,于是便切换到了 Wayland 会话下的 KDE。切换后确实可以为不同屏幕单独设置缩放比例了,但使用一两天后发现了一些问题,例如:

  • KWin 的窗口标题字体是糊的,似乎并没有经过缩放
  • 点击 Wine WeChat 的托盘图标没有反应,所以手滑关掉窗口后就无法唤出了,得把之前的进程杀掉重开
  • KDE 设置中的开机启动项消失了,在 Xorg 会话下设置的启动项仍然是工作的,但要增删得切回 Xorg
  • Wayland 下无法使用 tdrop。我之前把它绑定到一个全局快捷键上用来快速唤出或隐藏 kitty,在 KDE Wayland 下没有找到替代品
  • 切到 tty 再切回桌面后有一个显示器会花屏,需要重启系统才能恢复,可能是显卡驱动的 bug

上述问题十分影响正常使用,但考虑到多显示器设置不同缩放比例的需求又不可能切回 Xorg,于是便产生了更换 Wayland compositor 的想法。而 Wayland compositor 是与桌面环境强绑定的,不像 Xorg 下面能单独替换 desktop environment 自带的 window manager,这也就意味着我需要抛弃使用多年的 KDE,而起因仅仅是更换了一个显示器而已🤡

一番对比后决定使用 i3wm 在 Wayland 下的精神续作 Sway,因为作为 vim 用户应该能很快习惯这种纯键盘操作逻辑,本文记录了使用过程中遇到的一些问题及解决方案。

本体

没有输入法指示框

使用 patch 过的 sway

1
yay -S sway-im-git

部分 Xwayland 软件缩放异常

使用 patch 过的 xorg-xwaylandwlroots

1
yay -S xorg-xwayland-hidpi-xprop wlroots-hidpi-xprop-git

并在 Sway 配置中为 Xwayland 设置 DPI:

1
2
exec xprop -root -format _XWAYLAND_GLOBAL_OUTPUT_SCALE 32c -set _XWAYLAND_GLOBAL_OUTPUT_SCALE 2
exec echo "Xft.dpi: 192" | xrdb -merge

设置 Gtk 主题

使用 nwg-look 配置似乎是最方便的:

1
yay -S nwg-look-bin

设置 Qt 主题

设置环境变量 QT_QPA_PLATFORMTHEME=qt5ct 并使用 qt5ct 进行配置:

1
yay -S qt5ct

如果还用到了 kvantum 则需要设置另一个环境变量 QT_STYLE_OVERRIDE=kvantum

应用软件

Fcitx5

除配置环境变量外,还要在 Sway 配置里增加自动启动项:

1
exec fcitx5 -d

Chrome / Chromium

默认是运行在 Xwayland 下的,功能上一般不会有什么问题。在参数中增加 --ozone-platform-hint=auto 可以让他运行在原生 Wayland 下,但输入法会无法使用,需要再启用 Gtk 4[1]。综上所述,需要在 ~/.config/chrome-flags.conf 增加:

1
2
--ozone-platform-hint=auto
--gtk-version=4

如果启用 Gtk 4 后无法下载文件,则需要装两个包:

1
yay -S xdg-desktop-portal xdg-desktop-portal-gtk

需要注意的是虽然也可以为 Electron 启用原生 Wayland,但其暂不支持 Gtk 4[2],因此目前最佳方案仍是继续使用 Xwayland(悲

网易云音乐托盘图标右键菜单为空

运行前设置环境变量 XDG_CURRENT_DESKTOP=Unity 即可,为方便起见也可以修改 usr/share/applications/netease-cloud-music.desktop 中的运行参数:

1
Exec=env XDG_CURRENT_DESKTOP=Unity netease-cloud-music %U

开机启动

部分应用程序的设置里会提供是否开机启动的选项,一般来说勾选后会在 ~/.config/autostart/ 生成 XDG Autostart 启动项。GNOME 和 KDE 等桌面环境会自动解析并运行他们,但 Sway 不会,因此这些选项不会生效。一种办法是手动在 Sway 配置中添加 exec 指令,但比较麻烦而且不清真,更好的方案是使用独立的 XDG Autostart 实现。

以 dex 为例,在 Sway 配置中增加 exec dex -a 即可调用 dex 来启动 XDG Autostart 程序。但是默认除用户目录下的启动项还会运行系统目录 /etc/xdg/autostart 下的,而其中包括若干 DE 的依赖项,在 Sway 下面并没有用,可以通过 -s 参数指定只运行用户目录下的启动项。此外,部分程序启动如果早于 Waybar 则不会注册托盘图标,比较好的解决方案是等托盘服务启动后再运行开机启动项[3]

1
exec gdbus wait --session org.kde.StatusNotifierWatcher && dex -a -s ~/.config/autostart/

无法通过 Chrome 等程序的“在文件夹中显示”打开 Dolphin

部分程序的“在文件夹中显示”是通过 D-Bus 的 org.freedesktop.FileManager1 协议来启动文件管理器对应的 D-Bus 服务[4],从命令行启动的方法如下:

1
2
3
4
5
6
dbus-send --session \
--print-reply \
--dest=org.freedesktop.FileManager1 \
/org/freedesktop/FileManager1 \
org.freedesktop.FileManager1.ShowFolders \
array:string:"file:/" string:""

一般来说这个协议本身在 Sway 上是正常工作的,但在我的机器上无法通过它正常启动 Dolphin。神奇的是,journalctl --user -u plasma-dolphin.service 可以观察到 Dolphin 的 systemd 服务确实触发了,但 GUI 无法弹出。在一顿试错后,终于发现了一种蜜汁 workaround:将 /usr/share/dbus-1/services/org.kde.dolphin.FileManager1.service 拷贝一份到 $XDG_DATA_HOME/dbus-1/services 并删去其中 SystemdService 一行,修改后服务如下:

1
2
3
4
# ~/.local/share/dbus-1/services/org.kde.dolphin.FileManager1.service
[D-BUS Service]
Name=org.freedesktop.FileManager1
Exec=/usr/bin/dolphin --daemon

  1. https://www.csslayer.info/wordpress/fcitx-dev/chrome-state-of-input-method-on-wayland/ ↩︎

  2. https://github.com/electron/electron/issues/33690 ↩︎

  3. https://github.com/manjaro-sway/desktop-settings/blob/b2462ad975b6e0842646251cf015a84ece391e67/community/sway/etc/sway/config.d/99-autostart-applications.conf#L11 ↩︎

  4. https://wiki.archlinux.org/title/File_manager_functionality#D-Bus ↩︎