我绝对不知道,我作为一个 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-xwayland
和 wlroots
:
1 | yay -S xorg-xwayland-hidpi-xprop wlroots-hidpi-xprop-git |
并在 Sway 配置中为 Xwayland 设置 DPI:
1 | exec xprop -root -format _XWAYLAND_GLOBAL_OUTPUT_SCALE 32c -set _XWAYLAND_GLOBAL_OUTPUT_SCALE 2 |
设置 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 | --ozone-platform-hint=auto |
如果启用 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 | dbus-send --session \ |
一般来说这个协议本身在 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 | # ~/.local/share/dbus-1/services/org.kde.dolphin.FileManager1.service |
https://www.csslayer.info/wordpress/fcitx-dev/chrome-state-of-input-method-on-wayland/ ↩︎
https://github.com/manjaro-sway/desktop-settings/blob/b2462ad975b6e0842646251cf015a84ece391e67/community/sway/etc/sway/config.d/99-autostart-applications.conf#L11 ↩︎
https://wiki.archlinux.org/title/File_manager_functionality#D-Bus ↩︎