使用脚本全自动修复gnome-shell中的布局bug(大雾

我前几个月转用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。