2020-04-24 23:36:52 +00:00
|
|
|
|
/*
|
|
|
|
|
|
2020-09-25 04:45:31 +00:00
|
|
|
|
Configuration files are linked to /etc/fonts/conf.d/
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
|
|
This module generates a package containing configuration files and link it in /etc/fonts.
|
|
|
|
|
|
|
|
|
|
Fontconfig reads files in folder name / file name order, so the number prepended to the configuration file name decide the order of parsing.
|
|
|
|
|
Low number means high priority.
|
|
|
|
|
|
2023-03-24 00:07:29 +00:00
|
|
|
|
NOTE: Please take extreme care when adjusting the default settings of this module.
|
|
|
|
|
People care a lot, and I mean A LOT, about their font rendering, and you will be
|
|
|
|
|
The Person That Broke It if it changes in a way people don't like.
|
|
|
|
|
|
|
|
|
|
See prior art:
|
|
|
|
|
- https://github.com/NixOS/nixpkgs/pull/194594
|
|
|
|
|
- https://github.com/NixOS/nixpkgs/pull/222236
|
|
|
|
|
- https://github.com/NixOS/nixpkgs/pull/222689
|
|
|
|
|
|
|
|
|
|
And do not repeat our mistakes.
|
|
|
|
|
|
|
|
|
|
- @K900, March 2023
|
|
|
|
|
|
2020-04-24 23:36:52 +00:00
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
{ config, pkgs, lib, ... }:
|
|
|
|
|
|
|
|
|
|
with lib;
|
|
|
|
|
|
|
|
|
|
let
|
|
|
|
|
cfg = config.fonts.fontconfig;
|
|
|
|
|
|
|
|
|
|
fcBool = x: "<bool>" + (boolToString x) + "</bool>";
|
2020-08-20 17:08:02 +00:00
|
|
|
|
pkg = pkgs.fontconfig;
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
|
|
# configuration file to read fontconfig cache
|
|
|
|
|
# priority 0
|
2020-08-20 17:08:02 +00:00
|
|
|
|
cacheConf = makeCacheConf {};
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
2020-08-20 17:08:02 +00:00
|
|
|
|
# generate the font cache setting file
|
2020-04-24 23:36:52 +00:00
|
|
|
|
# When cross-compiling, we can’t generate the cache, so we skip the
|
|
|
|
|
# <cachedir> part. fontconfig still works but is a little slower in
|
|
|
|
|
# looking things up.
|
2020-08-20 17:08:02 +00:00
|
|
|
|
makeCacheConf = { }:
|
2020-04-24 23:36:52 +00:00
|
|
|
|
let
|
2023-08-04 22:07:22 +00:00
|
|
|
|
makeCache = fontconfig: pkgs.makeFontsCache { inherit fontconfig; fontDirectories = config.fonts.packages; };
|
2020-08-20 17:08:02 +00:00
|
|
|
|
cache = makeCache pkgs.fontconfig;
|
|
|
|
|
cache32 = makeCache pkgs.pkgsi686Linux.fontconfig;
|
2020-04-24 23:36:52 +00:00
|
|
|
|
in
|
|
|
|
|
pkgs.writeText "fc-00-nixos-cache.conf" ''
|
|
|
|
|
<?xml version='1.0'?>
|
2020-09-25 04:45:31 +00:00
|
|
|
|
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
|
2020-04-24 23:36:52 +00:00
|
|
|
|
<fontconfig>
|
|
|
|
|
<!-- Font directories -->
|
2023-08-04 22:07:22 +00:00
|
|
|
|
${concatStringsSep "\n" (map (font: "<dir>${font}</dir>") config.fonts.packages)}
|
2020-04-24 23:36:52 +00:00
|
|
|
|
${optionalString (pkgs.stdenv.hostPlatform == pkgs.stdenv.buildPlatform) ''
|
|
|
|
|
<!-- Pre-generated font caches -->
|
|
|
|
|
<cachedir>${cache}</cachedir>
|
|
|
|
|
${optionalString (pkgs.stdenv.isx86_64 && cfg.cache32Bit) ''
|
|
|
|
|
<cachedir>${cache32}</cachedir>
|
|
|
|
|
''}
|
|
|
|
|
''}
|
|
|
|
|
</fontconfig>
|
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
# rendering settings configuration file
|
|
|
|
|
# priority 10
|
|
|
|
|
renderConf = pkgs.writeText "fc-10-nixos-rendering.conf" ''
|
|
|
|
|
<?xml version='1.0'?>
|
2020-09-25 04:45:31 +00:00
|
|
|
|
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
|
2020-04-24 23:36:52 +00:00
|
|
|
|
<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>
|
|
|
|
|
</match>
|
|
|
|
|
|
|
|
|
|
</fontconfig>
|
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
# local configuration file
|
|
|
|
|
localConf = pkgs.writeText "fc-local.conf" cfg.localConf;
|
|
|
|
|
|
|
|
|
|
# default fonts configuration file
|
|
|
|
|
# priority 52
|
|
|
|
|
defaultFontsConf =
|
|
|
|
|
let genDefault = fonts: name:
|
|
|
|
|
optionalString (fonts != []) ''
|
|
|
|
|
<alias binding="same">
|
|
|
|
|
<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'?>
|
2020-09-25 04:45:31 +00:00
|
|
|
|
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
|
2020-04-24 23:36:52 +00:00
|
|
|
|
<fontconfig>
|
|
|
|
|
|
|
|
|
|
<!-- Default fonts -->
|
|
|
|
|
${genDefault cfg.defaultFonts.sansSerif "sans-serif"}
|
|
|
|
|
|
|
|
|
|
${genDefault cfg.defaultFonts.serif "serif"}
|
|
|
|
|
|
|
|
|
|
${genDefault cfg.defaultFonts.monospace "monospace"}
|
|
|
|
|
|
|
|
|
|
${genDefault cfg.defaultFonts.emoji "emoji"}
|
|
|
|
|
|
|
|
|
|
</fontconfig>
|
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
# bitmap font options
|
|
|
|
|
# priority 53
|
|
|
|
|
rejectBitmaps = pkgs.writeText "fc-53-no-bitmaps.conf" ''
|
|
|
|
|
<?xml version="1.0"?>
|
2020-09-25 04:45:31 +00:00
|
|
|
|
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
|
2020-04-24 23:36:52 +00:00
|
|
|
|
<fontconfig>
|
|
|
|
|
|
|
|
|
|
${optionalString (!cfg.allowBitmaps) ''
|
|
|
|
|
<!-- Reject bitmap fonts -->
|
|
|
|
|
<selectfont>
|
|
|
|
|
<rejectfont>
|
|
|
|
|
<pattern>
|
|
|
|
|
<patelt name="scalable"><bool>false</bool></patelt>
|
|
|
|
|
</pattern>
|
|
|
|
|
</rejectfont>
|
|
|
|
|
</selectfont>
|
|
|
|
|
''}
|
|
|
|
|
|
|
|
|
|
<!-- Use embedded bitmaps in fonts like Calibri? -->
|
|
|
|
|
<match target="font">
|
|
|
|
|
<edit name="embeddedbitmap" mode="assign">
|
|
|
|
|
${fcBool cfg.useEmbeddedBitmaps}
|
|
|
|
|
</edit>
|
|
|
|
|
</match>
|
|
|
|
|
|
|
|
|
|
</fontconfig>
|
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
# reject Type 1 fonts
|
|
|
|
|
# priority 53
|
|
|
|
|
rejectType1 = pkgs.writeText "fc-53-nixos-reject-type1.conf" ''
|
|
|
|
|
<?xml version="1.0"?>
|
2020-09-25 04:45:31 +00:00
|
|
|
|
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
|
2020-04-24 23:36:52 +00:00
|
|
|
|
<fontconfig>
|
|
|
|
|
|
|
|
|
|
<!-- Reject Type 1 fonts -->
|
|
|
|
|
<selectfont>
|
|
|
|
|
<rejectfont>
|
|
|
|
|
<pattern>
|
|
|
|
|
<patelt name="fontformat"><string>Type 1</string></patelt>
|
|
|
|
|
</pattern>
|
|
|
|
|
</rejectfont>
|
|
|
|
|
</selectfont>
|
|
|
|
|
|
|
|
|
|
</fontconfig>
|
|
|
|
|
'';
|
|
|
|
|
|
2023-07-15 17:15:38 +00:00
|
|
|
|
# Replace default linked config with a different variant
|
|
|
|
|
replaceDefaultConfig = defaultConfig: newConfig: ''
|
|
|
|
|
rm $dst/${defaultConfig}
|
|
|
|
|
ln -s ${pkg.out}/share/fontconfig/conf.avail/${newConfig} \
|
|
|
|
|
$dst/
|
|
|
|
|
'';
|
|
|
|
|
|
2020-04-24 23:36:52 +00:00
|
|
|
|
# fontconfig configuration package
|
|
|
|
|
confPkg = pkgs.runCommand "fontconfig-conf" {
|
|
|
|
|
preferLocalBuild = true;
|
|
|
|
|
} ''
|
2020-09-25 04:45:31 +00:00
|
|
|
|
dst=$out/etc/fonts/conf.d
|
2020-08-20 17:08:02 +00:00
|
|
|
|
mkdir -p $dst
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
|
|
# fonts.conf
|
2020-08-20 17:08:02 +00:00
|
|
|
|
ln -s ${pkg.out}/etc/fonts/fonts.conf \
|
|
|
|
|
$dst/../fonts.conf
|
|
|
|
|
# TODO: remove this legacy symlink once people stop using packages built before #95358 was merged
|
2020-09-25 04:45:31 +00:00
|
|
|
|
mkdir -p $out/etc/fonts/2.11
|
|
|
|
|
ln -s /etc/fonts/fonts.conf \
|
|
|
|
|
$out/etc/fonts/2.11/fonts.conf
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
|
|
# fontconfig default config files
|
2020-08-20 17:08:02 +00:00
|
|
|
|
ln -s ${pkg.out}/etc/fonts/conf.d/*.conf \
|
|
|
|
|
$dst/
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
2023-07-15 17:15:38 +00:00
|
|
|
|
${optionalString (!cfg.antialias)
|
|
|
|
|
(replaceDefaultConfig "10-yes-antialias.conf"
|
|
|
|
|
"10-no-antialias.conf")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
${optionalString (cfg.hinting.style != "slight")
|
|
|
|
|
(replaceDefaultConfig "10-hinting-slight.conf"
|
|
|
|
|
"10-hinting-${cfg.hinting.style}.conf")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
${optionalString (cfg.subpixel.rgba != "none")
|
|
|
|
|
(replaceDefaultConfig "10-sub-pixel-none.conf"
|
|
|
|
|
"10-sub-pixel-${cfg.subpixel.rgba}.conf")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
${optionalString (cfg.subpixel.lcdfilter != "default")
|
|
|
|
|
(replaceDefaultConfig "11-lcdfilter-default.conf"
|
|
|
|
|
"11-lcdfilter-${cfg.subpixel.lcdfilter}.conf")
|
|
|
|
|
}
|
|
|
|
|
|
2020-04-24 23:36:52 +00:00
|
|
|
|
# 00-nixos-cache.conf
|
2020-08-20 17:08:02 +00:00
|
|
|
|
ln -s ${cacheConf} $dst/00-nixos-cache.conf
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
|
|
# 10-nixos-rendering.conf
|
2020-08-20 17:08:02 +00:00
|
|
|
|
ln -s ${renderConf} $dst/10-nixos-rendering.conf
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
|
|
# 50-user.conf
|
2020-09-25 04:45:31 +00:00
|
|
|
|
${optionalString (!cfg.includeUserConf) ''
|
|
|
|
|
rm $dst/50-user.conf
|
2020-04-24 23:36:52 +00:00
|
|
|
|
''}
|
|
|
|
|
|
|
|
|
|
# local.conf (indirect priority 51)
|
|
|
|
|
${optionalString (cfg.localConf != "") ''
|
2020-08-20 17:08:02 +00:00
|
|
|
|
ln -s ${localConf} $dst/../local.conf
|
2020-04-24 23:36:52 +00:00
|
|
|
|
''}
|
|
|
|
|
|
|
|
|
|
# 52-nixos-default-fonts.conf
|
2020-08-20 17:08:02 +00:00
|
|
|
|
ln -s ${defaultFontsConf} $dst/52-nixos-default-fonts.conf
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
|
|
# 53-no-bitmaps.conf
|
2020-08-20 17:08:02 +00:00
|
|
|
|
ln -s ${rejectBitmaps} $dst/53-no-bitmaps.conf
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
|
|
${optionalString (!cfg.allowType1) ''
|
|
|
|
|
# 53-nixos-reject-type1.conf
|
2020-08-20 17:08:02 +00:00
|
|
|
|
ln -s ${rejectType1} $dst/53-nixos-reject-type1.conf
|
2020-04-24 23:36:52 +00:00
|
|
|
|
''}
|
|
|
|
|
'';
|
|
|
|
|
|
|
|
|
|
# Package with configuration files
|
|
|
|
|
# this merge all the packages in the fonts.fontconfig.confPackages list
|
|
|
|
|
fontconfigEtc = pkgs.buildEnv {
|
|
|
|
|
name = "fontconfig-etc";
|
|
|
|
|
paths = cfg.confPackages;
|
|
|
|
|
ignoreCollisions = true;
|
|
|
|
|
};
|
2023-03-24 00:07:29 +00:00
|
|
|
|
|
|
|
|
|
fontconfigNote = "Consider manually configuring fonts.fontconfig according to personal preference.";
|
2020-04-24 23:36:52 +00:00
|
|
|
|
in
|
|
|
|
|
{
|
|
|
|
|
imports = [
|
|
|
|
|
(mkRenamedOptionModule [ "fonts" "fontconfig" "ultimate" "allowBitmaps" ] [ "fonts" "fontconfig" "allowBitmaps" ])
|
|
|
|
|
(mkRenamedOptionModule [ "fonts" "fontconfig" "ultimate" "allowType1" ] [ "fonts" "fontconfig" "allowType1" ])
|
|
|
|
|
(mkRenamedOptionModule [ "fonts" "fontconfig" "ultimate" "useEmbeddedBitmaps" ] [ "fonts" "fontconfig" "useEmbeddedBitmaps" ])
|
|
|
|
|
(mkRenamedOptionModule [ "fonts" "fontconfig" "ultimate" "forceAutohint" ] [ "fonts" "fontconfig" "forceAutohint" ])
|
|
|
|
|
(mkRenamedOptionModule [ "fonts" "fontconfig" "ultimate" "renderMonoTTFAsBitmap" ] [ "fonts" "fontconfig" "renderMonoTTFAsBitmap" ])
|
|
|
|
|
(mkRemovedOptionModule [ "fonts" "fontconfig" "forceAutohint" ] "")
|
|
|
|
|
(mkRemovedOptionModule [ "fonts" "fontconfig" "renderMonoTTFAsBitmap" ] "")
|
2021-08-22 07:53:02 +00:00
|
|
|
|
(mkRemovedOptionModule [ "fonts" "fontconfig" "dpi" ] "Use display server-specific options")
|
2023-03-24 00:07:29 +00:00
|
|
|
|
(mkRemovedOptionModule [ "hardware" "video" "hidpi" "enable" ] fontconfigNote)
|
|
|
|
|
(mkRemovedOptionModule [ "fonts" "optimizeForVeryHighDPI" ] fontconfigNote)
|
2020-06-15 15:56:04 +00:00
|
|
|
|
] ++ lib.forEach [ "enable" "substitutions" "preset" ]
|
|
|
|
|
(opt: lib.mkRemovedOptionModule [ "fonts" "fontconfig" "ultimate" "${opt}" ] ''
|
|
|
|
|
The fonts.fontconfig.ultimate module and configuration is obsolete.
|
|
|
|
|
The repository has since been archived and activity has ceased.
|
|
|
|
|
https://github.com/bohoomil/fontconfig-ultimate/issues/171.
|
|
|
|
|
No action should be needed for font configuration, as the fonts.fontconfig
|
|
|
|
|
module is already used by default.
|
|
|
|
|
'');
|
2020-04-24 23:36:52 +00:00
|
|
|
|
|
|
|
|
|
options = {
|
|
|
|
|
|
|
|
|
|
fonts = {
|
|
|
|
|
|
|
|
|
|
fontconfig = {
|
|
|
|
|
enable = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = true;
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
If enabled, a Fontconfig configuration file will be built
|
|
|
|
|
pointing to a set of default fonts. If you don't care about
|
|
|
|
|
running X11 applications or any other program that uses
|
|
|
|
|
Fontconfig, you can turn this option off and prevent a
|
|
|
|
|
dependency on all those fonts.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
confPackages = mkOption {
|
|
|
|
|
internal = true;
|
|
|
|
|
type = with types; listOf path;
|
|
|
|
|
default = [ ];
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
Fontconfig configuration packages.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
antialias = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = true;
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
Enable font antialiasing. At high resolution (> 200 DPI),
|
|
|
|
|
antialiasing has no visible effect; users of such displays may want
|
|
|
|
|
to disable this option.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
localConf = mkOption {
|
|
|
|
|
type = types.lines;
|
|
|
|
|
default = "";
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
System-wide customization file contents, has higher priority than
|
2022-08-12 12:06:08 +00:00
|
|
|
|
`defaultFonts` settings.
|
2020-04-24 23:36:52 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
defaultFonts = {
|
|
|
|
|
monospace = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
default = ["DejaVu Sans Mono"];
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
System-wide default monospace font(s). Multiple fonts may be
|
|
|
|
|
listed in case multiple languages must be supported.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
sansSerif = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
default = ["DejaVu Sans"];
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
System-wide default sans serif font(s). Multiple fonts may be
|
|
|
|
|
listed in case multiple languages must be supported.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
serif = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
default = ["DejaVu Serif"];
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
System-wide default serif font(s). Multiple fonts may be listed
|
|
|
|
|
in case multiple languages must be supported.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
emoji = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
default = ["Noto Color Emoji"];
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
System-wide default emoji font(s). Multiple fonts may be listed
|
|
|
|
|
in case a font does not support all emoji.
|
|
|
|
|
|
|
|
|
|
Note that fontconfig matches color emoji fonts preferentially,
|
|
|
|
|
so if you want to use a black and white font while having
|
|
|
|
|
a color font installed (eg. Noto Color Emoji installed alongside
|
|
|
|
|
Noto Emoji), fontconfig will still choose the color font even
|
|
|
|
|
when it is later in the list.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
hinting = {
|
|
|
|
|
enable = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = true;
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
Enable font hinting. Hinting aligns glyphs to pixel boundaries to
|
|
|
|
|
improve rendering sharpness at low resolution. At high resolution
|
|
|
|
|
(> 200 dpi) hinting will do nothing (at best); users of such
|
|
|
|
|
displays may want to disable this option.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
autohint = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = false;
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
Enable the autohinter in place of the default interpreter.
|
|
|
|
|
The results are usually lower quality than correctly-hinted
|
|
|
|
|
fonts, but better than unhinted fonts.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2022-07-14 12:49:19 +00:00
|
|
|
|
|
|
|
|
|
style = mkOption {
|
2023-07-15 17:15:38 +00:00
|
|
|
|
type = types.enum ["none" "slight" "medium" "full"];
|
|
|
|
|
default = "slight";
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2022-07-14 12:49:19 +00:00
|
|
|
|
Hintstyle is the amount of font reshaping done to line up
|
|
|
|
|
to the grid.
|
|
|
|
|
|
2023-07-15 17:15:38 +00:00
|
|
|
|
slight will make the font more fuzzy to line up to the grid but
|
|
|
|
|
will be better in retaining font shape, while full will be a
|
|
|
|
|
crisp font that aligns well to the pixel grid but will lose a
|
|
|
|
|
greater amount of font shape.
|
2022-07-14 12:49:19 +00:00
|
|
|
|
'';
|
2023-07-15 17:15:38 +00:00
|
|
|
|
apply =
|
|
|
|
|
val:
|
|
|
|
|
let
|
|
|
|
|
from = "fonts.fontconfig.hinting.style";
|
|
|
|
|
val' = lib.removePrefix "hint" val;
|
|
|
|
|
warning = "The option `${from}` contains a deprecated value `${val}`. Use `${val'}` instead.";
|
|
|
|
|
in
|
|
|
|
|
lib.warnIf (lib.hasPrefix "hint" val) warning val';
|
2022-07-14 12:49:19 +00:00
|
|
|
|
};
|
2020-04-24 23:36:52 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
includeUserConf = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = true;
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
Include the user configuration from
|
2022-08-12 12:06:08 +00:00
|
|
|
|
{file}`~/.config/fontconfig/fonts.conf` or
|
|
|
|
|
{file}`~/.config/fontconfig/conf.d`.
|
2020-04-24 23:36:52 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
subpixel = {
|
|
|
|
|
|
|
|
|
|
rgba = mkOption {
|
2023-07-15 17:15:38 +00:00
|
|
|
|
default = "none";
|
2020-04-24 23:36:52 +00:00
|
|
|
|
type = types.enum ["rgb" "bgr" "vrgb" "vbgr" "none"];
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
Subpixel order. The overwhelming majority of displays are
|
2022-08-12 12:06:08 +00:00
|
|
|
|
`rgb` in their normal orientation. Select
|
|
|
|
|
`vrgb` for mounting such a display 90 degrees
|
|
|
|
|
clockwise from its normal orientation or `vbgr`
|
2020-04-24 23:36:52 +00:00
|
|
|
|
for mounting 90 degrees counter-clockwise. Select
|
2022-08-12 12:06:08 +00:00
|
|
|
|
`bgr` in the unlikely event of mounting 180
|
2020-04-24 23:36:52 +00:00
|
|
|
|
degrees from the normal orientation. Reverse these directions in
|
|
|
|
|
the improbable event that the display's native subpixel order is
|
2022-08-12 12:06:08 +00:00
|
|
|
|
`bgr`.
|
2020-04-24 23:36:52 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
lcdfilter = mkOption {
|
|
|
|
|
default = "default";
|
|
|
|
|
type = types.enum ["none" "default" "light" "legacy"];
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
FreeType LCD filter. At high resolution (> 200 DPI), LCD filtering
|
|
|
|
|
has no visible effect; users of such displays may want to select
|
2022-08-12 12:06:08 +00:00
|
|
|
|
`none`.
|
2020-04-24 23:36:52 +00:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
cache32Bit = mkOption {
|
|
|
|
|
default = false;
|
|
|
|
|
type = types.bool;
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2020-04-24 23:36:52 +00:00
|
|
|
|
Generate system fonts cache for 32-bit applications.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
allowBitmaps = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = true;
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2022-08-12 12:06:08 +00:00
|
|
|
|
Allow bitmap fonts. Set to `false` to ban all
|
2020-04-24 23:36:52 +00:00
|
|
|
|
bitmap fonts.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
allowType1 = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = false;
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = ''
|
2022-08-12 12:06:08 +00:00
|
|
|
|
Allow Type-1 fonts. Default is `false` because of
|
2020-04-24 23:36:52 +00:00
|
|
|
|
poor rendering.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
useEmbeddedBitmaps = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = false;
|
2024-04-21 15:54:59 +00:00
|
|
|
|
description = "Use embedded bitmaps in fonts like Calibri.";
|
2020-04-24 23:36:52 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
config = mkMerge [
|
|
|
|
|
(mkIf cfg.enable {
|
|
|
|
|
environment.systemPackages = [ pkgs.fontconfig ];
|
|
|
|
|
environment.etc.fonts.source = "${fontconfigEtc}/etc/fonts/";
|
2021-05-20 23:08:51 +00:00
|
|
|
|
security.apparmor.includes."abstractions/fonts" = ''
|
|
|
|
|
# fonts.conf
|
|
|
|
|
r ${pkg.out}/etc/fonts/fonts.conf,
|
|
|
|
|
|
|
|
|
|
# fontconfig default config files
|
|
|
|
|
r ${pkg.out}/etc/fonts/conf.d/*.conf,
|
|
|
|
|
|
|
|
|
|
# 00-nixos-cache.conf
|
|
|
|
|
r ${cacheConf},
|
|
|
|
|
|
|
|
|
|
# 10-nixos-rendering.conf
|
|
|
|
|
r ${renderConf},
|
|
|
|
|
|
|
|
|
|
# 50-user.conf
|
|
|
|
|
${optionalString cfg.includeUserConf ''
|
|
|
|
|
r ${pkg.out}/etc/fonts/conf.d.bak/50-user.conf,
|
|
|
|
|
''}
|
|
|
|
|
|
|
|
|
|
# local.conf (indirect priority 51)
|
|
|
|
|
${optionalString (cfg.localConf != "") ''
|
|
|
|
|
r ${localConf},
|
|
|
|
|
''}
|
|
|
|
|
|
|
|
|
|
# 52-nixos-default-fonts.conf
|
|
|
|
|
r ${defaultFontsConf},
|
|
|
|
|
|
|
|
|
|
# 53-no-bitmaps.conf
|
|
|
|
|
r ${rejectBitmaps},
|
|
|
|
|
|
|
|
|
|
${optionalString (!cfg.allowType1) ''
|
|
|
|
|
# 53-nixos-reject-type1.conf
|
|
|
|
|
r ${rejectType1},
|
|
|
|
|
''}
|
|
|
|
|
'';
|
2020-04-24 23:36:52 +00:00
|
|
|
|
})
|
2020-08-20 17:08:02 +00:00
|
|
|
|
(mkIf cfg.enable {
|
2020-04-24 23:36:52 +00:00
|
|
|
|
fonts.fontconfig.confPackages = [ confPkg ];
|
|
|
|
|
})
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
}
|