nix-git/modules/gnome-fractional-scaling.nix
2024-08-16 11:11:17 +02:00

85 lines
3.8 KiB
Nix
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ config, pkgs, lib, ... }:
let
version = "45.5";
in
{
# TODO: This module is broken for 46.2
# https://wiki.archlinux.org/title/HiDPI#Wayland
# Results in blurry font in non-Wayland applications :/
# https://wiki.archlinux.org/title/HiDPI#Xorg
# https://devicetests.com/set-different-scaling-multi-monitors-gnome
# "scale-monitor-framebuffer": This allows GNOME to scale each monitors framebuffer independently, which is necessary for per-monitor scaling.
# "x11-randr-fractional-scaling": This allows fractional scaling, which gives you finer control over the scaling factor.
# TODO open issue: Fractional scaling can't be enabled with multiple monitors.
# https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/2076
# https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/2365
# -> https://bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/2008355
programs.dconf.enable = true;
# Overlays.
# https://nixos.wiki/wiki/Overlays#In_NixOS
# https://discourse.nixos.org/t/use-specific-pkg-version-in-overlay/32741/3
# If on X11, then use patched version of mutter.
nixpkgs.overlays = lib.mkIf (! config.services.xserver.displayManager.gdm.wayland) [
(
# Patched version of mutter 44.2.
# Outdated example: https://nixos.wiki/wiki/Overlays#Overriding_a_package_inside_a_scope
#
# On the AUR, they apply only one patch, not three.
# And they pick the patch that corresponds to the mutter version.
# https://aur.archlinux.org/packages/mutter-x11-scaling
#
# New patch URL:
# -> https://salsa.debian.org/gnome-team/mutter/-/blob/ubuntu/master/debian/patches/ubuntu/x11-Add-support-for-fractional-scaling-using-Randr.patch
# For release 44.2:
# -> https://salsa.debian.org/gnome-team/mutter/-/tags?sort=updated_desc&search=ubuntu%2F
# -> https://salsa.debian.org/gnome-team/mutter/-/tags/ubuntu%2F44.2-3ubuntu1
# -> https://salsa.debian.org/gnome-team/mutter/-/raw/ubuntu/44.2-3ubuntu1/debian/patches/ubuntu/x11-Add-support-for-fractional-scaling-using-Randr.patch
# For release 45.3:
# -> https://salsa.debian.org/gnome-team/mutter/-/tags?sort=updated_desc&search=ubuntu%2F
# -> https://salsa.debian.org/gnome-team/mutter/-/tags/ubuntu%2F45.3-1ubuntu1
# -> https://salsa.debian.org/gnome-team/mutter/-/raw/ubuntu/45.3-1ubuntu1/debian/patches/ubuntu/x11-Add-support-for-fractional-scaling-using-Randr.patch
# Elements of nixpkgs must be taken from final and prev.
final: prev: {
# Elements of pkgs.gnome must be taken from gfinal and gprev.
gnome = prev.gnome.overrideScope' (gfinal: gprev: {
mutter = gprev.mutter.overrideAttrs (oldAttrs:
if oldAttrs.version == version then
{
patches = (oldAttrs.patches or []) ++ [
(prev.fetchpatch {
url = "https://salsa.debian.org/gnome-team/mutter/-/raw/ubuntu/${version}-1ubuntu1/debian/patches/ubuntu/x11-Add-support-for-fractional-scaling-using-Randr.patch";
# Determining the hash: https://github.com/NixOS/nixpkgs/issues/191128#issuecomment-1246030431
hash = "sha256-snEgCuTsTEo0wQ5XsjEM53K2j7l4ZQ3t9FT3+Yfoti0=";
})
];
}
else throw "Mutter version mismatch. Please update patch to ${oldAttrs.version}"
);
});
}
)
];
home-manager.users.yoda = { osConfig, config, pkgs, ... }: {
dconf.settings = {
"org/gnome/mutter" = {
experimental-features = (
if (osConfig.services.xserver.displayManager.gdm.wayland)
# Wayland
then ["scale-monitor-framebuffer"]
# X11
else ["scale-monitor-framebuffer" "x11-randr-fractional-scaling"]
);
};
};
};
}