diff --git a/modules/misc/fontconfig.nix b/modules/misc/fontconfig.nix index e5e218c79..0485e81f4 100644 --- a/modules/misc/fontconfig.nix +++ b/modules/misc/fontconfig.nix @@ -90,6 +90,41 @@ in ''; }; }; + + antialiasing = lib.mkOption { + type = with lib.types; nullOr bool; + default = null; + description = "Whether to enable font antialiasing."; + example = true; + }; + hinting = lib.mkOption { + type = + with lib.types; + nullOr (enum [ + "none" + "slight" + "medium" + "full" + ]); + default = null; + description = "The font hinting mode."; + example = "slight"; + }; + subpixelRendering = lib.mkOption { + type = + with lib.types; + nullOr (enum [ + "none" + "rgb" + "bgr" + "vertical-rgb" + "vertical-bgr" + ]); + default = null; + description = "The sub-pixel rendering mode."; + example = "rgb"; + }; + }; }; @@ -157,6 +192,42 @@ in ${config.home.path}/lib/fontconfig/cache ''; + "fontconfig/conf.d/10-hm-rendering.conf" = + let + set = + name: value: + let + xmlValue = + if builtins.isBool value then + "${lib.boolToString value}" + else if builtins.isString value then + "${value}" + else + throw ("expected bool or string but got ${builtins.typeOf value}: ${toString value}"); + in + '' + + + ${xmlValue} + + + ''; + content = + lib.optional (cfg.antialiasing != null) (set "antialias" cfg.antialiasing) + ++ lib.optionals (cfg.hinting != null) [ + (set "hinting" true) + (set "hintstyle" ("hint" + cfg.hinting)) + ] + ++ lib.optional (cfg.subpixelRendering != null) ( + set "rgba" (builtins.replaceStrings [ "ertical-" ] [ "" ] cfg.subpixelRendering) + ); + in + lib.mkIf (builtins.length content > 0) { + text = mkFontconfigConf ( + lib.concatStrings ([ "Set the rendering mode\n" ] ++ content) + ); + }; + "fontconfig/conf.d/52-hm-default-fonts.conf".text = let genDefault = diff --git a/tests/modules/misc/fontconfig/custom-rendering.nix b/tests/modules/misc/fontconfig/custom-rendering.nix new file mode 100644 index 000000000..113884ff8 --- /dev/null +++ b/tests/modules/misc/fontconfig/custom-rendering.nix @@ -0,0 +1,47 @@ +{ + fonts.fontconfig = { + enable = true; + antialiasing = false; + hinting = "none"; + subpixelRendering = "vertical-bgr"; + }; + + nmt.script = + let + configFile = "home-files/.config/fontconfig/conf.d/10-hm-rendering.conf"; + in + '' + assertFileExists ${configFile} + assertFileContent ${configFile} ${builtins.toFile "rendering.conf" '' + + + + + + + Set the rendering mode + + + false + + + + + true + + + + + hintnone + + + + + vbgr + + + + + ''} + ''; +} diff --git a/tests/modules/misc/fontconfig/default-rendering.nix b/tests/modules/misc/fontconfig/default-rendering.nix new file mode 100644 index 000000000..397f150c0 --- /dev/null +++ b/tests/modules/misc/fontconfig/default-rendering.nix @@ -0,0 +1,7 @@ +{ + fonts.fontconfig.enable = true; + + nmt.script = '' + assertPathNotExists home-files/.config/fontconfig/conf.d/10-hm-rendering.conf + ''; +} diff --git a/tests/modules/misc/fontconfig/default.nix b/tests/modules/misc/fontconfig/default.nix index bea306165..7509af66a 100644 --- a/tests/modules/misc/fontconfig/default.nix +++ b/tests/modules/misc/fontconfig/default.nix @@ -19,4 +19,7 @@ # /nix/store/da…g5-home-manager-path/lib/fontconfig/cache: invalid cache file: 786068e7df13f7c2105017ef3d78e351-x86_64.cache-7 # /nix/store/da…g5-home-manager-path/lib/fontconfig/cache: invalid cache file: 4766193978ddda4bd196f2b98c00fb00-x86_64.cache-7 #fontconfig-multiple-font-packages = ./multiple-font-packages.nix; + + fontconfig-default-rendering = ./default-rendering.nix; + fontconfig-custom-rendering = ./custom-rendering.nix; }