前天得知 wayfire 能够直接在 X Window 下运行之后,我就尝试了一下。很好,能跑。虽然不能捕获键盘,从而与外边窗口管理器重复的快捷键无法使用,但至少它的鼠标光标位置是对的,能够用来测试。我在 QEMU 里跑过 KDE Wayland、sway 和 wayfire,无一例外鼠标位置不对。KDE 里是缩放倍数设为 2 之后,鼠标的实际坐标会翻倍。后两者基于 wlroots 的,鼠标的实际坐标位于显示的光标上方几十像素处。总之没法用。
在 X Window 里粗略地配置了一下 wayfire 之后,我就想实际在外边跑跑看。结果被惊艳到了,感觉就像年轻了24岁一样!
优势
尝试几次之后,我终于把 wayfire 跑起来了。
首先是火狐图形性能翻倍!
我打开火狐,跑了一下 WebGL 水族馆(微软的 FishGL 没啦)。接近 60fps,是我在 X Window 下跑的两倍有余!再试试 YouTube 的 4K 视频,竟然几乎不掉帧!我的电脑的性能原来这么好的吗……在 X Window 下,火狐播放这 4K 视频,会占满 GPU,并且 CPU 也几乎用满,丢掉约十分之一的帧。而在 Wayland 下竟然只用了一半的 GPU,CPU 用量也不怎么高。而且操作起来很流畅,右键菜单一点就出来,鼠标划过菜单项,高亮也跟得很紧。
画面再也不撕裂啦!
一直以来,我切换窗口、播放视频、快速滚动窗口内容的时候,时不时能见到画面撕裂。一般是在中间附近,一道水平接着倾斜接着再水平的裂痕会一闪而过,其上和其下是两帧不同的内容。读过 xplain 以及 Wayland Book,我知道这是由于 X Window 服务端与客户端之间并不同步,显示画面时,缓冲区里有啥画啥,并不在乎客户端有没有画完,导致相邻的两帧拼接在了一起。而 Wayland 会使用双重缓冲,客户端在缓冲区里画好了,才告诉混成器这一帧画好了、可以显示出去了。而在画好之前就显示上一次提交的缓冲区内容,所以永远不会出现画一半的情况。
我的光标也不再闪烁啦!
我也不知道为啥,我在 X Window 下,特别是接外接显示器的屋里,鼠标光标会像遥远的星星一样闪啊闪的,有时候闪得甚至影响我操作。我用的 picom 混成器的选项我改来改去,不光没能解决这个问题,反而是搞得它时不时崩溃一下了。我也不知道这是怎么回事,按理说鼠标光标由硬件绘制的,不应该时有时无啊。而在 wayfire 里,光标一直很稳定,从来不闪烁。我是返回到 X Window 下才注意到这一点的。
特效!
尝试 wayfire 的一大原因是我看中了它的特效。当年我初入 Linux 的时候,就挺喜欢 compiz 的特效的,只是后来因为性能问题才转到 Awesome 的。wayfire 有好多我当年常用的特效,果冻、火焰、立方体、展览,还有那个翻页一样的切换效果叫啥来着。没有纸飞机倒是有点可惜。
其它的 Wayland 混成器,KDE 我已经尝试过了,虽然是 X Window 版本,但功能应该是一致的。同样 sway 的对应 X Window 版本 i3 我也尝试过了。结论是,我并不是很在意平铺,但是我很在意键盘操控性。wayfire 也有较为丰富的键盘操作设置,应该也可以通过插件来扩展。
已解决的问题
虽然有上边这些优势,我还是回到 Awesome 来了,因为还有不少问题和需要配置的地方呢。此节记录一下我已经解决的问题。
- GVim。因为 GVim 使用的是 GTK,所以改一改让它支持 Wayland 并没有很难。我改好的版本在我的 vim fork 的 wayland 分支上。目前还缺少两个重要功能:终端里的剪贴板,以及 +clientserver。
-
mpv 是糊的。研究发现这是因为我加了
no-hidpi-window-scale
参数。它是为了解决 X Window HiDPI 下窗口过大的问题,但到了 Wayland 下使用它就会导致并不进行 HiDPI 缩放了。 - 窗口焦点不会跟随鼠标。这是在平铺式窗口管理器里使用很广泛的特性。wayfire-plugins-extra 里有个 follow-mouse 插件可以实现这个。
-
GTK 的鼠标主题、禁用动画设置等不生效。原来在 Wayland 下 GTK 不读取
~/.config/gtk-3.0/settings.ini
,可以使用 dconf-editor 去编辑 org.gnome.desktop.interface 下的选项。 - xfce4-notifyd 的通知会被当成普通窗口,置于屏幕中间并且有标题栏。有一个 fork 修复了此问题,不过我还是决定使用更轻量的 mako(不是 Python 的那个模板引擎哦)。
- Xwayland 跑 PRIME offloading 时,Minecraft 的画面会来回抖动。于是只好放弃 NVidia 显卡改成 Intel 显卡了(反正自从我买了 4K 显示器之后就都跑不动了 QAQ)。
-
fcitx5
- GTK 中,在输入编码的时候,按一次键闪烁一下。csslayer 说是不这样做就无法移动窗口。于是我改了一下代码,选择移不动。反正也只有在屏幕边缘的时候才需要移动。Qt 那边这个问题倒是不大,因为 fcitx5-qt 总是在应用程序的窗口范围内绘制候选词窗口,能够判断什么时候需要移动,所以只是在屏幕边缘的时候闪一闪。
- Qt 中(就是 Telegram 啦),在窗口下方输入的时候候选词窗口会悬在文本上空。我改了一下代码,现在能够准确定位到文本的上方紧贴着了。代码已经 pr。
-
fcitx5-configtool 不显示部分图标。把
GNOME_DESKTOP_SESSION_ID=0
环境变量加上就好了。这个环境变量莫名其妙地解决了不少问题呢。
剩下的问题
我暂时还是以 Awesome 为主,因为还有很多问题有待解决:
- Vim 不支持剪贴板、clientserver 特性。我打算通过另外的方式实现。工作量有些大。
- SPICE 客户端 spicy 无法捕获键盘,造成虚拟机里无法使用与外边相同的快捷键。
- LightDM 启动 wayfire 会话时会立即退出,而实际上 wayfire 是已经启动了的。各种日志里均没有找到任何有用的信息。
- wl-paste 获取的剪贴板内容与 Xwayland 的并不同步。似乎大部分程序都支持两种剪贴板协议,但是 wl-paste 和 Xwayland 各支持其中之一?
- Xwayland 不支持 HiDPI。有个补丁,但是会造成窗口一直缩小再缩小。
-
fcitx5
- 候选词的内边距有些大。有空再调了。
- fcitx5-paste-primary 不支持 Wayland。有空再加了。
-
wayfire
- 窗口标题不支持中文。我倒是打算给 wayfire 加个不显示标题栏的选项。
- 的 fast switch(真的很快)会导致全屏窗口取消全屏。
- 似乎不支持触摸板拖拽的时候中断一下。应该很好修补吧?
- 只能切换到本工作区的上一个窗口,不能跨工作区
- invert 和 zoom 插件只支持某一个显示器。前者我用不到,但后者应该还有些用处的。
- 设置的 Super+数字键 切换工作区无效。
-
我还没想好我那些环境变量去哪里设置比较好。
~/.xprofile
没啦,~/.pam_enviroment
我也不想用。在考虑使用 systemd 那个功能,或者我自己 wrapper 一下 wayfire。
缺憾
- 使用 libinput 取代了 synpatics,非常好用的画圈滚动(一直画、一直滚)没了。
结语
还有挺多东西要配置的。锁屏啦,壁纸啦,还有未发现的问题啦,等等。慢慢来吧。Wayland 真的挺顺滑的。
对了,有个有意思视频给大家看一下。
这是我还没运行通知守护进程时,火狐发出的通知窗口,不知道为什么被反复创建和销毁。