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;
}