1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-08 19:46:05 +01:00

fontconfig: add fonts.fontconfig.extraConfigFiles option (#7754)

Co-authored-by: Tim Keller <tjk@tjkeller.xyz>
Co-authored-by: Benedikt M. Rips <benedikt.rips@gmail.com>
This commit is contained in:
Tim Keller 2025-09-16 22:31:54 -05:00 committed by GitHub
parent 75f97fcbe3
commit fad8e3033e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 161 additions and 23 deletions

View file

@ -15,6 +15,39 @@ let
profileDirectory = config.home.profileDirectory;
fontConfigFileType = lib.types.submodule (
{ name, ... }:
{
options = {
enable = lib.mkEnableOption "Whether this font config file should be generated.";
text = lib.mkOption {
type = lib.types.nullOr lib.types.lines;
default = null;
description = "Verbatim contents of the config file. If this option is null then the 'source' option must be set.";
};
source = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;
description = "Config file to source. Alternatively, use the 'text' option instead.";
};
label = lib.mkOption {
type = lib.types.str;
default = name;
defaultText = "<name>";
description = "Label to use for the name of the config file.";
};
priority = lib.mkOption {
type = lib.types.ints.between 0 99;
default = 90;
description = ''
Determines the order in which configs are loaded.
Must be a value within the range of 0-99, where priority 0 is the highest priority and 99 is the lowest.
'';
};
};
}
);
in
{
meta.maintainers = with lib.maintainers; [
@ -125,6 +158,44 @@ in
example = "rgb";
};
configFile = lib.mkOption {
type = lib.types.attrsOf fontConfigFileType;
default = { };
description = ''
Extra font config files that will be added to `~/.config/fontconfig/conf.d/`.
Files are named like `fontconfig/conf.d/{priority}-{label}.conf`.
'';
example = {
tamzen = {
enable = true;
label = "tamzen-disable-antialiasing";
text = ''
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<description>Disable anti-aliasing for Tamzen since it is a bitmap font</description>
<match target="pattern">
<test name="family" compare="eq" qual="any">
<string>Tamzen</string>
</test>
<edit name="antialias" mode="assign">
<bool>false</bool>
</edit>
</match>
</fontconfig>
'';
priority = 90;
}; # => conf.d/90-tamzen-disable-antialiasing.conf
commit-mono-options = {
enable = true;
source = "./resources/fontconfig/commit-mono.conf";
priority = 80;
}; # => conf.d/80-commit-mono-options.conf
};
};
};
};
@ -164,7 +235,7 @@ in
fi
'';
xdg.configFile =
fonts.fontconfig.configFile =
let
mkFontconfigConf = conf: ''
<?xml version='1.0'?>
@ -178,21 +249,25 @@ in
'';
in
{
"fontconfig/conf.d/10-hm-fonts.conf".text = mkFontconfigConf ''
<description>Add fonts in the Nix user profile</description>
fonts = {
enable = true;
priority = 10;
source = null; # Set the source as null explicitly so that it cannot be overwritten by mistake by a user
text = mkFontconfigConf ''
<description>Add fonts in the Nix user profile</description>
<include ignore_missing="yes">${config.home.path}/etc/fonts/conf.d</include>
<include ignore_missing="yes">${config.home.path}/etc/fonts/fonts.conf</include>
<include ignore_missing="yes">${config.home.path}/etc/fonts/conf.d</include>
<include ignore_missing="yes">${config.home.path}/etc/fonts/fonts.conf</include>
<dir>${config.home.path}/lib/X11/fonts</dir>
<dir>${config.home.path}/share/fonts</dir>
<dir>${profileDirectory}/lib/X11/fonts</dir>
<dir>${profileDirectory}/share/fonts</dir>
<dir>${config.home.path}/lib/X11/fonts</dir>
<dir>${config.home.path}/share/fonts</dir>
<dir>${profileDirectory}/lib/X11/fonts</dir>
<dir>${profileDirectory}/share/fonts</dir>
<cachedir>${config.home.path}/lib/fontconfig/cache</cachedir>
'';
"fontconfig/conf.d/10-hm-rendering.conf" =
<cachedir>${config.home.path}/lib/fontconfig/cache</cachedir>
'';
};
rendering =
let
set =
name: value:
@ -222,13 +297,15 @@ in
set "rgba" (builtins.replaceStrings [ "ertical-" ] [ "" ] cfg.subpixelRendering)
);
in
lib.mkIf (builtins.length content > 0) {
{
enable = builtins.length content > 0;
priority = 10;
source = null;
text = mkFontconfigConf (
lib.concatStrings ([ "<description>Set the rendering mode</description>\n" ] ++ content)
);
};
"fontconfig/conf.d/52-hm-default-fonts.conf".text =
default-fonts =
let
genDefault =
fonts: name:
@ -245,13 +322,26 @@ in
</alias>
'';
in
mkFontconfigConf ''
<!-- Default fonts -->
${genDefault cfg.defaultFonts.sansSerif "sans-serif"}
${genDefault cfg.defaultFonts.serif "serif"}
${genDefault cfg.defaultFonts.monospace "monospace"}
${genDefault cfg.defaultFonts.emoji "emoji"}
'';
{
enable = true;
priority = 52;
source = null;
text = mkFontconfigConf ''
<!-- Default fonts -->
${genDefault cfg.defaultFonts.sansSerif "sans-serif"}
${genDefault cfg.defaultFonts.serif "serif"}
${genDefault cfg.defaultFonts.monospace "monospace"}
${genDefault cfg.defaultFonts.emoji "emoji"}
'';
};
};
xdg.configFile = lib.mapAttrs' (
name: config:
lib.nameValuePair "fontconfig/conf.d/${builtins.toString config.priority}-hm-${config.label}.conf" {
inherit (config) enable text;
source = lib.mkIf (config.source != null) config.source;
}
) cfg.configFile;
};
}

View file

@ -22,4 +22,5 @@
fontconfig-default-rendering = ./default-rendering.nix;
fontconfig-custom-rendering = ./custom-rendering.nix;
fontconfig-extra-config-files = ./extra-config-files.nix;
}

View file

@ -0,0 +1,33 @@
let
sampleTextContent = "hello world";
fcConfD = "home-files/.config/fontconfig/conf.d";
in
{
fonts.fontconfig = {
enable = true;
configFile = {
text-label-test = {
enable = true;
label = "sample-text-config";
text = sampleTextContent;
priority = 55;
};
source-nolabel-test = {
enable = true;
source = ./sample-extra-config.conf;
};
};
};
nmt.script = ''
assertDirectoryExists ${fcConfD}
assertFileExists ${fcConfD}/55-hm-sample-text-config.conf
assertFileContent ${fcConfD}/55-hm-sample-text-config.conf \
${builtins.toFile "sample-text-config" sampleTextContent}
assertFileExists ${fcConfD}/90-hm-source-nolabel-test.conf
assertFileContent ${fcConfD}/90-hm-source-nolabel-test.conf \
${./sample-extra-config.conf}
'';
}

View file

@ -0,0 +1,14 @@
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<description>Disable anti-aliasing for Tamzen since it is a bitmap font</description>
<match target="pattern">
<test name="family" compare="eq" qual="any">
<string>Tamzen</string>
</test>
<edit name="antialias" mode="assign">
<bool>false</bool>
</edit>
</match>
</fontconfig>