我前几个月转用 Ubuntu 发现了一个有意思的 bug:在我这个屏幕分辨率下 app grid 的布局竟然是不稳定的!调出 grid 的时候会将 app grid 其初始化成 \(3\times 8\),而如果鼠标悬浮在上面或者左右滑动起来,另一套逻辑又觉得应该是 \(4\times 6\) 了。这导致在浏览 app grid 的时候整个网格总是会 “卡一下”,切换生硬,观感不佳。在进行了一些研究之后我发现这应该是 gnome-shell 包的问题,但是网上似乎也没有相关的 bug report—— 可能是我的情况比较特殊?我的修理方法比较简单粗暴:app grid 的布局是在 /js/ui/iconGrid.js 里面定义的:

const defaultGridModes = [
    {
        rows: 8,
        columns: 3,
    },
    {
        rows: 6,
        columns: 4,
    },
    {
        rows: 4,
        columns: 6,
    },
    {
        rows: 3,
        columns: 8,
    },
];

直接把最后定义 \(3\times 8\) 的 object 删掉,就从根源上解决问题了!

修这个 bug 本身是很简单的,但是坏就坏在 gnome-shell 这个包更新的比较平凡,而 Debian 构建包的那一套又不简单。Gnome-shell 每次更新之后都需要重新做修改重新 build 再重新安装,手工操作比较繁琐。自己今天一时兴起写了一个脚本来自动化这个过程。

#!/bin/bash

# 删除除了本脚本以外的所有文件
find . \! -path './patch_gnome.sh' -delete
# 下载 gnome-shell 的源代码
apt source gnome-shell
# 转到源码根目录,因为根目录包含不断变化的版本号所以需要动态判断
cd $(find . -maxdepth 1 -path "./gnome-shell-*" -type d -print)
# 把 3x8 的布局改成和 4x6 的一样(也可以删除,但是感觉用 sed 的话这样修改比较简单)
sed -i -e "s/rows: 3/rows: 4/" -e "s/columns: 8/columns: 6/" js/ui/iconGrid.js
# 添加一个 changelog entry,这里需要手动按一下 enter
dch -i "Remove 3x8 grid"
# 构建并安装
dpkg-buildpackage -rfakeroot -b
sudo apt install ../gnome-shell*.deb

把这个脚本命名为 patch_gnome.sh 然后丢到一个空目录里就行了,以后每次看到 gnome-shell 更新了就调用这个进行一个全自动 patch,简单快捷。

写这个脚本的主要收获是熟悉了 findsed 命令的使用,同时把 Debian package build 的一些命令固化到脚本里面也省得我每次 patch 的时候都去搜相关的 wiki。