前言
这学期灯花购入了一台联想拯救者 Y9000P 并装了个 NixOS。除了声卡和睡眠休眠有问题之外,使用起来还是不错的,最新的内核也支持 12 代 i7 CPU 的大小核调度。但……还有一点小问题:就是这台笔记本的屏幕默认是 150% 缩放的,然而 GNOME 只支持诸如 100%,200% 的整数倍缩放,并不支持 150% 的分数倍缩放。导致咱被 KDE 所「绑架」了长达半年多(bushi
如图,只有 100, 200, 300。在这屏幕上,100% 的缩放看起来太小,200% 又太大,GNOME 的 Wayland 虽支持非整数倍缩放,但会导致字体发虚。然而 KDE 却能很好地支持 150% 非整数倍缩放,最终只能忍痛告别了陪伴咱多年的 GNOME ,投奔了 KDE…
半年后,偶然在 Arch Wiki 上看到了如下内容:
「Ubuntu 提供了一个补丁以在 GNOME 设置选项中使用 Randr。这个补丁也为 mutter-x11-scaling (AUR) 所提供。在安装之后,使用
1 2
| # 注意,该命令在 NixOS 上不可用 gsettings set org.gnome.mutter experimental-features "['x11-randr-fractional-scaling']"
|
以启用非整数倍缩放的功能。」
其中提到了 AUR 中的一个软件包,mutter-x11-scaling
于是我打开了它的 PKGBUILD 文件并一探究竟:
1 2 3 4 5
| _scaling_commit=c3ca443d49da639e73f27ab92a758a41259ba732 # Commit c3ca443d _commit=4b35c269c7ad2515f91d2d3ccaea7526e0cb5f97 # tags/42.5^0 source=("git+https://gitlab.gnome.org/GNOME/mutter.git#commit=$_commit" "x11-Add-support-for-fractional-scaling-using-Randr.patch::https://salsa.debian.org/gnome-team/mutter/-/raw/$_scaling_commit/debian/patches/ubuntu/x11-Add-support-for-fractional-scaling-using-Randr.patch" "Support-Dynamic-triple-double-buffering.patch::https://raw.githubusercontent.com/puxplaying/mutter-x11-scaling/11525ce32c13b542bbfcb7f43a76d51111077cea/Support-Dynamic-triple-double-buffering.patch")
|
上段内容是这个 PKGBUILD 脚本异于原版的特点,相比于原版,它在源代码中增加了两个补丁(patch)文件,并重新打包了 mutter。
然而 Nix 提供了一个叠层(Overlay)功能,可以用于修改 Nixpkgs 中软件包的构建。得益于叠层(Overlay),可以在不重新打包 mutter 的情况下修改这个包的构建。
正文
警告:此处的 patch 的 commit 已经过时,无法使用。请参见我的新文档: 后传:在 NixOS 的 GNOME 实现 X11 非整数倍缩放
正片开始!
首先在 /etc/nixos/ 下新建一个叠层(Overlay)文件,例如 mutterX11.nix
,然后加入如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| final: prev: { gnome = prev.gnome.overrideScope' (final': prev': { mutter = prev'.mutter.overrideAttrs (old: { patches = (old.patches or []) ++ [ (final.fetchpatch { url = "https://raw.githubusercontent.com/puxplaying/mutter-x11-scaling/11525ce32c13b542bbfcb7f43a76d51111077cea/Support-Dynamic-triple-double-buffering.patch"; sha256 = "sha256-dTv7tNyTcOj1nJLDLfccWuZuMs62VtowZ2pz8QaRW9A="; }) (final.fetchpatch { url = "https://salsa.debian.org/gnome-team/mutter/-/raw/c3ca443d49da639e73f27ab92a758a41259ba732/debian/patches/ubuntu/x11-Add-support-for-fractional-scaling-using-Randr.patch"; sha256 = "sha256-ut78BQemEF8T3189c9KWGrJ2mh8mFkgUxpad0ogNkFI="; }) ]; }); }); }
|
然后在 configuration.nix
中启用该叠层(Overlay):
1 2 3 4
| nixpkgs.overlays = [ (import ./mutterX11.nix) ];
|
以及启用 GNOME X11 的非整数倍缩放功能:
1 2 3 4 5 6 7 8
| services.xserver.desktopManager.gnome = { enable = true; extraGSettingsOverridePackages = [ pkgs.gnome.mutter ]; extraGSettingsOverrides = '' [org.gnome.mutter] experimental-features=['x11-randr-fractional-scaling'] ''; };
|
然后,使用 nixos-rebuild switch
重构 NixOS,并重新登录 GNOME X11。
结语
大功告成啦!
重新打开 GNOME 的显示设置,可以看到,出现了很多非整数倍的缩放选项: