summaryrefslogtreecommitdiffstats
path: root/nixos/modules/config/fonts
diff options
context:
space:
mode:
authorThomas Tuegel <ttuegel@mailbox.org>2017-04-03 08:48:50 -0500
committerThomas Tuegel <ttuegel@mailbox.org>2017-04-03 09:26:19 -0500
commit89bfa112cfd8a8b3da642169d33f1dfe3ea1e839 (patch)
treee8646f420a5eb4b9c7149f35a1ee45a3c62f7cce /nixos/modules/config/fonts
parent03942659ca1189ba50f9f1b86bbe6d925eba237b (diff)
fontconfig-penultimate: 0.2.1 -> 0.3.2
Diffstat (limited to 'nixos/modules/config/fonts')
-rw-r--r--nixos/modules/config/fonts/fontconfig-penultimate.nix221
-rw-r--r--nixos/modules/config/fonts/fontconfig.nix15
2 files changed, 226 insertions, 10 deletions
diff --git a/nixos/modules/config/fonts/fontconfig-penultimate.nix b/nixos/modules/config/fonts/fontconfig-penultimate.nix
index 8e41d3421173..83d6532774e3 100644
--- a/nixos/modules/config/fonts/fontconfig-penultimate.nix
+++ b/nixos/modules/config/fonts/fontconfig-penultimate.nix
@@ -3,23 +3,236 @@
with lib;
let
- cfg = config.fonts.fontconfig.penultimate;
+ cfg = config.fonts.fontconfig;
+ fcBool = x: "<bool>" + (if x then "true" else "false") + "</bool>";
+
+ # back-supported fontconfig version and package
+ # version is used for font cache generation
+ supportVersion = "210";
+ supportPkg = pkgs."fontconfig_${supportVersion}";
+
+ # latest fontconfig version and package
+ # version is used for configuration folder name, /etc/fonts/VERSION/
+ # note: format differs from supportVersion and can not be used with makeCacheConf
latestVersion = pkgs.fontconfig.configVersion;
+ latestPkg = pkgs.fontconfig;
+
+ # supported version fonts.conf
+ supportFontsConf = pkgs.makeFontsConf { fontconfig = supportPkg; fontDirectories = config.fonts.fonts; };
+
+ # configuration file to read fontconfig cache
+ # version dependent
+ # priority 0
+ cacheConfSupport = makeCacheConf { version = supportVersion; };
+ cacheConfLatest = makeCacheConf {};
+
+ # generate the font cache setting file for a fontconfig version
+ # use latest when no version is passed
+ makeCacheConf = { version ? null }:
+ let
+ fcPackage = if builtins.isNull version
+ then "fontconfig"
+ else "fontconfig_${version}";
+ makeCache = fontconfig: pkgs.makeFontsCache { inherit fontconfig; fontDirectories = config.fonts.fonts; };
+ cache = makeCache pkgs."${fcPackage}";
+ cache32 = makeCache pkgs.pkgsi686Linux."${fcPackage}";
+ in
+ pkgs.writeText "fc-00-nixos-cache.conf" ''
+ <?xml version='1.0'?>
+ <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
+ <fontconfig>
+ <!-- Font directories -->
+ ${concatStringsSep "\n" (map (font: "<dir>${font}</dir>") config.fonts.fonts)}
+ <!-- Pre-generated font caches -->
+ <cachedir>${cache}</cachedir>
+ ${optionalString (pkgs.stdenv.isx86_64 && cfg.cache32Bit) ''
+ <cachedir>${cache32}</cachedir>
+ ''}
+ </fontconfig>
+ '';
# The configuration to be included in /etc/font/
- confPkg = pkgs.runCommand "font-penultimate-conf" {} ''
+ penultimateConf = pkgs.runCommand "font-penultimate-conf" {} ''
support_folder=$out/etc/fonts/conf.d
latest_folder=$out/etc/fonts/${latestVersion}/conf.d
mkdir -p $support_folder
mkdir -p $latest_folder
- # fontconfig ultimate various configuration files
+ ln -s ${supportFontsConf} $support_folder/../fonts.conf
+ ln -s ${latestPkg.out}/etc/fonts/fonts.conf \
+ $latest_folder/../fonts.conf
+
+ # fontconfig-penultimate various configuration files
ln -s ${pkgs.fontconfig-penultimate}/etc/fonts/conf.d/*.conf \
$support_folder
ln -s ${pkgs.fontconfig-penultimate}/etc/fonts/conf.d/*.conf \
$latest_folder
+
+ ln -s ${cacheConfSupport} $support_folder/00-nixos-cache.conf
+ ln -s ${cacheConfLatest} $latest_folder/00-nixos-cache.conf
+
+ rm $support_folder/10-antialias.conf $latest_folder/10-antialias.conf
+ ln -s ${antialiasConf} $support_folder/10-antialias.conf
+ ln -s ${antialiasConf} $latest_folder/10-antialias.conf
+
+ rm $support_folder/10-hinting.conf $latest_folder/10-hinting.conf
+ ln -s ${hintingConf} $support_folder/10-hinting.conf
+ ln -s ${hintingConf} $latest_folder/10-hinting.conf
+
+ ${optionalString cfg.useEmbeddedBitmaps ''
+ rm $support_folder/10-no-embedded-bitmaps.conf
+ rm $latest_folder/10-no-embedded-bitmaps.conf
+ ''}
+
+ rm $support_folder/10-subpixel.conf $latest_folder/10-subpixel.conf
+ ln -s ${subpixelConf} $support_folder/10-subpixel.conf
+ ln -s ${subpixelConf} $latest_folder/10-subpixel.conf
+
+ ${optionalString (cfg.dpi != 0) ''
+ ln -s ${dpiConf} $support_folder/11-dpi.conf
+ ln -s ${dpiConf} $latest_folder/11-dpi.conf
+ ''}
+
+ ${optionalString (!cfg.includeUserConf) ''
+ rm $support_folder/50-user.conf
+ rm $latest_folder/50-user.conf
+ ''}
+
+ # 51-local.conf
+ rm $latest_folder/51-local.conf
+ substitute \
+ ${pkgs.fontconfig-penultimate}/etc/fonts/conf.d/51-local.conf \
+ $latest_folder/51-local.conf \
+ --replace local.conf /etc/fonts/${latestVersion}/local.conf
+
+ ln -s ${defaultFontsConf} $support_folder/52-default-fonts.conf
+ ln -s ${defaultFontsConf} $latest_folder/52-default-fonts.conf
+
+ ${optionalString cfg.allowBitmaps ''
+ rm $support_folder/53-no-bitmaps.conf
+ rm $latest_folder/53-no-bitmaps.conf
+ ''}
+
+ ${optionalString (!cfg.allowType1) ''
+ ln -s ${rejectType1} $support_folder/53-no-type1.conf
+ ln -s ${rejectType1} $latest_folder/53-no-type1.conf
+ ''}
+ '';
+
+ hintingConf = pkgs.writeText "fc-10-hinting.conf" ''
+ <?xml version='1.0'?>
+ <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
+ <fontconfig>
+
+ <!-- Default rendering settings -->
+ <match target="pattern">
+ <edit mode="append" name="hinting">
+ ${fcBool cfg.hinting.enable}
+ </edit>
+ <edit mode="append" name="autohint">
+ ${fcBool cfg.hinting.autohint}
+ </edit>
+ <edit mode="append" name="hintstyle">
+ <const>hintslight</const>
+ </edit>
+ </match>
+
+ </fontconfig>
+ '';
+
+ antialiasConf = pkgs.writeText "fc-10-antialias.conf" ''
+ <?xml version='1.0'?>
+ <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
+ <fontconfig>
+
+ <!-- Default rendering settings -->
+ <match target="pattern">
+ <edit mode="append" name="antialias">
+ ${fcBool cfg.antialias}
+ </edit>
+ </match>
+
+ </fontconfig>
+ '';
+
+ subpixelConf = pkgs.writeText "fc-10-subpixel.conf" ''
+ <?xml version='1.0'?>
+ <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
+ <fontconfig>
+
+ <!-- Default rendering settings -->
+ <match target="pattern">
+ <edit mode="append" name="rgba">
+ <const>${cfg.subpixel.rgba}</const>
+ </edit>
+ <edit mode="append" name="lcdfilter">
+ <const>lcd${cfg.subpixel.lcdfilter}</const>
+ </edit>
+ </match>
+
+ </fontconfig>
+ '';
+
+ dpiConf = pkgs.writeText "fc-11-dpi.conf" ''
+ <?xml version='1.0'?>
+ <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
+ <fontconfig>
+
+ <match target="pattern">
+ <edit name="dpi" mode="assign">
+ <double>${toString cfg.dpi}</double>
+ </edit>
+ </match>
+
+ </fontconfig>
+ '';
+
+ defaultFontsConf =
+ let genDefault = fonts: name:
+ optionalString (fonts != []) ''
+ <alias>
+ <family>${name}</family>
+ <prefer>
+ ${concatStringsSep ""
+ (map (font: ''
+ <family>${font}</family>
+ '') fonts)}
+ </prefer>
+ </alias>
+ '';
+ in
+ pkgs.writeText "fc-52-nixos-default-fonts.conf" ''
+ <?xml version='1.0'?>
+ <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
+ <fontconfig>
+
+ <!-- Default fonts -->
+ ${genDefault cfg.defaultFonts.sansSerif "sans-serif"}
+
+ ${genDefault cfg.defaultFonts.serif "serif"}
+
+ ${genDefault cfg.defaultFonts.monospace "monospace"}
+
+ </fontconfig>
+ '';
+
+ rejectType1 = pkgs.writeText "fc-53-no-type1.conf" ''
+ <?xml version="1.0"?>
+ <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+ <fontconfig>
+
+ <!-- Reject Type 1 fonts -->
+ <selectfont>
+ <rejectfont>
+ <pattern>
+ <patelt name="fontformat"><string>Type 1</string></patelt>
+ </pattern>
+ </rejectfont>
+ </selectfont>
+
+ </fontconfig>
'';
in
@@ -50,7 +263,7 @@ in
config = mkIf (config.fonts.fontconfig.enable && cfg.enable) {
- fonts.fontconfig.confPackages = [ confPkg ];
+ fonts.fontconfig.confPackages = [ penultimateConf ];
};
diff --git a/nixos/modules/config/fonts/fontconfig.nix b/nixos/modules/config/fonts/fontconfig.nix
index 1cf5cb6e0396..d44b583447a3 100644
--- a/nixos/modules/config/fonts/fontconfig.nix
+++ b/nixos/modules/config/fonts/fontconfig.nix
@@ -444,11 +444,14 @@ in
};
};
- config = mkIf cfg.enable {
- fonts.fontconfig.confPackages = [ confPkg ];
-
- environment.systemPackages = [ pkgs.fontconfig ];
- environment.etc.fonts.source = "${fontconfigEtc}/etc/fonts/";
- };
+ config = mkMerge [
+ (mkIf cfg.enable {
+ environment.systemPackages = [ pkgs.fontconfig ];
+ environment.etc.fonts.source = "${fontconfigEtc}/etc/fonts/";
+ })
+ (mkIf (cfg.enable && !cfg.penultimate.enable) {
+ fonts.fontconfig.confPackages = [ confPkg ];
+ })
+ ];
}