期末、Linux 桌面和无人在意的事情
整个六月基本都在断断续续的考试、复习。说实话,没有这么多需要复习的,没学的复习了也没啥用,但就是不敢裸考,所以处于一种效率非常低下的状态。一晃一周过去了,两周过去了,莫名其妙就到月末了。
除了学业相关的事情,还有的就是在折腾 Linux 桌面。首先是把 Pixelbook 的桌面换成了 labwc,一个轻量级的堆叠型窗口合成器。这台机器的性能实在太差了,跑 GNOME 和 KDE 都不怎么样。刚好要学习一下 Wayland 开发,就挑了这么一个纯 C 写的轻量级桌面试试看,有问题自己也能改,结果还真有问题。
首先是平铺、贴边的窗口阴影会消失,这个其实是有意为之的,因为开发者担心窗口阴影在多显示器的情况下,渲染到另一块屏幕上,此外还有窗口阴影之间重叠的问题。和维护者 battle 了几轮最后选了一个比较折中的方法:如果窗口之间的间距大于阴影渲染的距离,则允许平铺窗口显示阴影,否则就乖乖隐藏吧。
合并的 PR 在 ssd: add configurable drop-shadows for tiled windows #2789
其次是个大问题,我发现微信的悬浮窗没办法在 labwc 上正常显示——点击按钮会弹出来一下,然后马上消失。更离谱的是不止 labwc 有这个问题,很多基于 wlroots 制作的合成器都有问题。详情可见这个帖子:【求助】wechat在sway上面搜索结果窗口,朋友圈点赞窗口行为异常。这个 BUG 非常刁钻,实际上根源来自于对窗口焦点的处理。
当你点击一个按钮弹出一个对话框(弹窗)时,理想的行为是将焦点转移到弹窗上——毕竟它是当前的视觉中心。从合成器的角度来看,这似乎是顺理成章的做法。然而,问题恰恰就出在这里:一旦焦点被转移到弹窗,弹窗的父窗口就会失去焦点。而在微信的逻辑中,只要父窗口失去焦点,弹窗就会被自动关闭。于是就出现了弹窗要么无法显示,要么刚出现就立刻消失的现象。
我自己没有能力修这个 Bug,但很惊喜的发现社区里有个大佬在修。可是维护者似乎不太愿意合并这个补丁,因为他们觉得补丁基本上是围绕微信这么一个 case 刻意修复的,很可能会 break 其他东西。于是又围绕这个 battle 了几十楼。
期间一直在要求我们给一个可复现的演示程序,因为国外人不用微信、也用不了微信,根本没有测试的条件。我本来都快放弃了,结果用 LLM 跑出来一个演示,成功推动了维护者对这个问题的重视。
水越来越深,最后发现问题牵涉到了 wlroots 中 Xwayland 模块对不同类型窗口的处理逻辑。维护者修复了这个问题,我很感谢他们的努力,但也隐隐感到一丝担忧——labwc 是树莓派默认的窗口合成器,wlroots 又是许多自制合成器的核心基础,可即使发展多年,依然存在各种细碎而复杂的问题。
说到底,还是因为这类基础软件无人在意。
大家以为“窗口显示出来”只是个简单的前提,就像水和阳光一样自然,但现实中,每一个细节都远比想象中复杂得多。基础软件有很酷的部分,比方说内核的调度器、新型的文件系统、容器技术、虚拟化… 但是要把所有这一切变成现实不仅仅是那些灵感迸发的 brilliant idea,更多时候是漫无边际的 debug,修着一个又一个平凡的问题。积硅步,至千里。