之前一开始使用 KDE 桌面的时候,遇到了一个这样的问题:KDE 的图标任务管理器反应很迟顿是什么原因
https://bugs.kde.org/show_bug.cgi?id=433907
在一个组里面包含很多窗口时,鼠标移到任务组上,需要很长时间才能显示出缩略图工具提示,而且整个 shell 会变得很卡顿。
这个 BUG 曾经有人在 5.22 发布前提交过一个补丁,但据反馈这个补丁没有真正修复相关的问题,所以即使到 5.23 发布的时候,这个 BUG 还是一直存在的。因此很长一段时间,我都不敢把合并相同程序的窗口的设置打开。
直到最近突然心血来潮,想研究下这个 BUG 到底是由什么引起的,看看自己业余的编程水平能不能解决这个问题,于是我做了几件事:
-
研究了一下之前 有问题的补丁,然后找了些 QML 的文档,发现其实这个补丁的思路是对的,用 ListView 替代 Repeater 确实能够实现只加载当前可见的元素(ToolTipInstance)。但问题在于,这个补丁在 ListView 里设置了长度和宽度(正常应该在 ListView 外设置尺寸),导致实际上加载的时候还是会把所有窗口的 ToolTipInstance 都一次性加载进来,所以反而相当于一个性能更差的 Repeater。
-
了解到问题所在后,开始动手修改相关源代码。首先需要定位 问题源代码,一般是去 https://invent.kde.org/ 上相关的项目里找,有时候也可以用关键词(比如问题组件的名称:task manager)搜索一下相关的 commit,看看别人修改了哪几个文件。不得不说虽然 VSCode 很好用,但编写 Qt 的东西还是 Qt Creator 给的提示比较全一点。
-
然后就是反复的修改和调试,幸好这个源代码是不需要编译的 QML 文件,可以直接在本地修改后用
plasmashell --replace
重启桌面进行测试,因此相对方便调试。我做的 主要修改 是把ScrollView
移至Component
里,然后在ScrollView
里设置工具提示的宽度和高度,并把原来的Repeater
替换为ListView
。 -
修改完成后,就可以准备提交合并请求(Merge Request)了,https://invent.kde.org/ 的操作和 GitHub 基本没有差异,都是先 fork 到自己的仓库下,然后拉取到本地,修改完后再推送到远程仓库,然后就可以按照指示提交合并请求了。可以看到 Plasma 桌面的开发比较活跃,有很多提交请求(19 年才迁移到 GitLab,已经有 653 个请求了)。
-
提交请求的时候,除了写上对修复内容的描述外,还可以加入
BUG: XXXXXX
这种记号,这样在你提交合并请求和合并被接收后,就可以在 bugs.kde.org 里自动将对应 BUG 设置为解决(RESOLVED FIXED)状态。对于不方便用英语描述的内容,还可以加上一段简短的视频或几张图片来描述这个合并请求的作用。 -
提交合并请求后,等待 KDE 的开发者对合并请求进行审阅,在这个过程中 KDE 的开发者可能会提出一些问题或修改建议,按照他们的指示进一步修改源代码。如果 KDE 的开发者认为这个合并请求满足要求了,就会 “Approve” 并最终通过这个合并请求。通过后就可以在 History 里看到你的 commit 了。如果你是第一次往这个项目提交合并请求,在你的名字旁边还会有一个 ,表明这是你的第一次贡献。
可以看出,自从 KDE 将代码库迁移到 GitLab 后,为 KDE 提交补丁的流程已经简化了很多,我们这种业余爱好者也有机会为开源项目做一点贡献了。
受限于开源项目开发人手的问题,很多 BUG 虽然有人报告,但一直没有人修复。如果你也像我一样对某个 BUG 忍受不了,或许可以尝试一下自己去解决。