summaryrefslogtreecommitdiffstats
path: root/nixos/modules/config/fonts
diff options
context:
space:
mode:
authorThomas Tuegel <ttuegel@gmail.com>2014-11-30 13:36:49 -0600
committerThomas Tuegel <ttuegel@gmail.com>2014-12-08 10:55:23 -0600
commit1df1305a8a313120219e70ed1f50618b1047963d (patch)
treeabe2c83f634461ca198699ec7558edc5104f7d9c /nixos/modules/config/fonts
parentd75485c945f1424f8d69716c8519a4a7d62f22ad (diff)
Rewrite Fontconfig NixOS module
Details: * The option `fonts.enableFontConfig` has (finally) been renamed `fonts.fontconfig.enable`. * Configurations are loaded in this order: first the Fontconfig-upstream configuration is loaded, then the NixOS-specific font directories are set, the system-wide default configuration is loaded, and finally the user configuration is loaded (if enabled). * The NixOS options `fonts.fontconfig.defaultFonts.monospace`, `fonts.fontconfig.defaultFonts.sansSerif` and `fonts.fontconfig.defaultFonts.serif` are added to allow setting the default system-wide font used for these generic faces. The defaults are the appropriate faces from the DejaVu collection because of their comprehensive Unicode coverage, clean rendering, and excellent legibility. * The NixOS option `fonts.fontconfig.antialias` can be used to disable antialiasing (it is enabled by default). * The options `fonts.fontconfig.subpixel.rgba` and `fonts.fontconfig.subpixel.lcdfilter` control the system-wide default settings for subpixel order and LCD filtering algorithm, respectively. * `fonts.fontconfig.hinting.enable` can be used to disable TrueType font hinting (it is enabled by default). `fonts.fontconfig.hinting.autohint` controls the FreeType autohinter. `fonts.fontconfig.hinting.style` controls the hint style; it is "full" by default. * User configurations can be disabled system-wide by setting `fonts.fontconfig.includeUserConf = false`. They are enabled by default so users can set Fontconfig options in the desktop environment of their choice.
Diffstat (limited to 'nixos/modules/config/fonts')
-rw-r--r--nixos/modules/config/fonts/fontconfig.nix327
1 files changed, 278 insertions, 49 deletions
diff --git a/nixos/modules/config/fonts/fontconfig.nix b/nixos/modules/config/fonts/fontconfig.nix
index 4b6f9325fda0..ca8313e017b1 100644
--- a/nixos/modules/config/fonts/fontconfig.nix
+++ b/nixos/modules/config/fonts/fontconfig.nix
@@ -8,72 +8,301 @@ with lib;
fonts = {
- enableFontConfig = mkOption { # !!! should be enableFontconfig
- type = types.bool;
- default = true;
- description = ''
- 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.
- '';
+ fontconfig = {
+ enable = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ 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.
+ '';
+ };
+
+ antialias = mkOption {
+ type = types.bool;
+ default = true;
+ description = "Enable font antialiasing.";
+ };
+
+ dpi = mkOption {
+ type = types.int;
+ default = 0;
+ description = ''
+ Force DPI setting. Setting to <literal>0</literal> disables DPI
+ forcing; the DPI detected for the display will be used.
+ '';
+ };
+
+ defaultFonts = {
+ monospace = mkOption {
+ type = types.str;
+ default = "DejaVu Sans Mono";
+ description = ''
+ System-wide default monospace font. The default is not set if the
+ option is set to <literal>""</literal>.
+ '';
+ };
+
+ sansSerif = mkOption {
+ type = types.str;
+ default = "DejaVu Sans";
+ description = ''
+ System-wide default sans serif font. The default is not set if the
+ option is set to <literal>""</literal>.
+ '';
+ };
+
+ serif = mkOption {
+ type = types.str;
+ default = "DejaVu Serif";
+ description = ''
+ System-wide default serif font. The default is not set if the
+ option is set to <literal>""</literal>.
+ '';
+ };
+ };
+
+ hinting = {
+ enable = mkOption {
+ type = types.bool;
+ default = true;
+ description = "Enable TrueType hinting.";
+ };
+
+ autohint = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Enable the autohinter, which provides hinting for otherwise
+ un-hinted fonts. The results are usually lower quality than
+ correctly-hinted fonts.
+ '';
+ };
+
+ style = mkOption {
+ type = types.str // {
+ check = flip elem ["none" "slight" "medium" "full"];
+ };
+ default = "full";
+ description = ''
+ TrueType hinting style, one of <literal>none</literal>,
+ <literal>slight</literal>, <literal>medium</literal>, or
+ <literal>full</literal>.
+ '';
+ };
+ };
+
+ includeUserConf = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Include the user configuration from
+ <filename>~/.config/fontconfig/fonts.conf</filename> or
+ <filename>~/.config/fontconfig/conf.d</filename>.
+ '';
+ };
+
+ subpixel = {
+
+ rgba = mkOption {
+ type = types.string // {
+ check = flip elem ["rgb" "bgr" "vrgb" "vbgr" "none"];
+ };
+ default = "rgb";
+ description = ''
+ Subpixel order, one of <literal>none</literal>,
+ <literal>rgb</literal>, <literal>bgr</literal>,
+ <literal>vrgb</literal>, or <literal>vbgr</literal>.
+ '';
+ };
+
+ lcdfilter = mkOption {
+ type = types.str // {
+ check = flip elem ["none" "default" "light" "legacy"];
+ };
+ default = "default";
+ description = ''
+ FreeType LCD filter, one of <literal>none</literal>,
+ <literal>default</literal>, <literal>light</literal>, or
+ <literal>legacy</literal>.
+ '';
+ };
+
+ };
+
};
};
};
+ config =
+ let fontconfig = config.fonts.fontconfig;
+ fcBool = x: "<bool>" + (if x then "true" else "false") + "</bool>";
+ in mkIf fontconfig.enable {
- config = mkIf config.fonts.enableFontConfig {
+ # Fontconfig 2.10 backward compatibility
- # Fontconfig 2.10 backward compatibility
+ # Bring in the default (upstream) fontconfig configuration, only for fontconfig 2.10
+ environment.etc."fonts/fonts.conf".source =
+ pkgs.makeFontsConf { fontconfig = pkgs.fontconfig_210; fontDirectories = config.fonts.fonts; };
- # Bring in the default (upstream) fontconfig configuration, only for fontconfig 2.10
- environment.etc."fonts/fonts.conf".source =
- pkgs.makeFontsConf { fontconfig = pkgs.fontconfig_210; fontDirectories = config.fonts.fonts; };
+ environment.etc."fonts/conf.d/98-nixos.conf".text =
+ ''
+ <?xml version='1.0'?>
+ <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
+ <fontconfig>
- environment.etc."fonts/conf.d/00-nixos.conf".text =
- ''
- <?xml version='1.0'?>
- <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
- <fontconfig>
+ <!-- Default rendering settings -->
+ <match target="font">
+ <edit mode="assign" name="hinting">
+ ${fcBool fontconfig.hinting.enable}
+ </edit>
+ <edit mode="assign" name="autohint">
+ ${fcBool fontconfig.hinting.autohint}
+ </edit>
+ <edit mode="assign" name="hintstyle">
+ <const>hint${fontconfig.hinting.style}</const>
+ </edit>
+ <edit mode="assign" name="antialias">
+ ${fcBool fontconfig.antialias}
+ </edit>
+ <edit mode="assign" name="rgba">
+ <const>${fontconfig.subpixel.rgba}</const>
+ </edit>
+ <edit mode="assign" name="lcdfilter">
+ <const>lcd${fontconfig.subpixel.lcdfilter}</const>
+ </edit>
+ </match>
- <!-- Set the default hinting style to "slight". -->
- <match target="font">
- <edit mode="assign" name="hintstyle">
- <const>hintslight</const>
- </edit>
- </match>
+ <!-- Default fonts -->
+ ${optionalString (fontconfig.defaultFonts.sansSerif != "") ''
+ <alias>
+ <family>sans-serif</family>
+ <prefer>
+ <family>${fontconfig.defaultFonts.sansSerif}</family>
+ </prefer>
+ </alias>
+ ''}
+ ${optionalString (fontconfig.defaultFonts.serif != "") ''
+ <alias>
+ <family>serif</family>
+ <prefer>
+ <family>${fontconfig.defaultFonts.serif}</family>
+ </prefer>
+ </alias>
+ ''}
+ ${optionalString (fontconfig.defaultFonts.monospace != "") ''
+ <alias>
+ <family>monospace</family>
+ <prefer>
+ <family>${fontconfig.defaultFonts.monospace}</family>
+ </prefer>
+ </alias>
+ ''}
- </fontconfig>
- '';
+ ${optionalString (fontconfig.dpi != 0) ''
+ <match target="pattern">
+ <edit name="dpi" mode="assign">
+ <double>${fontconfig.dpi}</double>
+ </edit>
+ </match>
+ ''}
- # Versioned fontconfig > 2.10. Take shared fonts.conf from fontconfig.
- # Otherwise specify only font directories.
- environment.etc."fonts/${pkgs.fontconfig.configVersion}/fonts.conf".source =
- "${pkgs.fontconfig}/etc/fonts/fonts.conf";
- environment.etc."fonts/${pkgs.fontconfig.configVersion}/conf.d/00-nixos.conf".text =
- ''
- <?xml version='1.0'?>
- <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
- <fontconfig>
+ </fontconfig>
+ '';
- <!-- Set the default hinting style to "slight". -->
- <match target="font">
- <edit mode="assign" name="hintstyle">
- <const>hintslight</const>
- </edit>
- </match>
+ # Versioned fontconfig > 2.10. Take shared fonts.conf from fontconfig.
+ # Otherwise specify only font directories.
+ environment.etc."fonts/${pkgs.fontconfig.configVersion}/fonts.conf".source =
+ "${pkgs.fontconfig}/etc/fonts/fonts.conf";
- <!-- Font directories -->
- ${concatStringsSep "\n" (map (font: "<dir>${font}</dir>") config.fonts.fonts)}
+ environment.etc."fonts/${pkgs.fontconfig.configVersion}/conf.d/00-nixos.conf".text =
+ ''
+ <?xml version='1.0'?>
+ <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
+ <fontconfig>
+ <!-- Font directories -->
+ ${concatStringsSep "\n" (map (font: "<dir>${font}</dir>") config.fonts.fonts)}
+ </fontconfig>
+ '';
- </fontconfig>
- '';
+ environment.etc."fonts/${pkgs.fontconfig.configVersion}/conf.d/98-nixos.conf".text =
+ ''
+ <?xml version='1.0'?>
+ <!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
+ <fontconfig>
- environment.systemPackages = [ pkgs.fontconfig ];
+ <!-- Default rendering settings -->
+ <match target="font">
+ <edit mode="assign" name="hinting">
+ ${fcBool fontconfig.hinting.enable}
+ </edit>
+ <edit mode="assign" name="autohint">
+ ${fcBool fontconfig.hinting.autohint}
+ </edit>
+ <edit mode="assign" name="hintstyle">
+ <const>hint${fontconfig.hinting.style}</const>
+ </edit>
+ <edit mode="assign" name="antialias">
+ ${fcBool fontconfig.antialias}
+ </edit>
+ <edit mode="assign" name="rgba">
+ <const>${fontconfig.subpixel.rgba}</const>
+ </edit>
+ <edit mode="assign" name="lcdfilter">
+ <const>lcd${fontconfig.subpixel.lcdfilter}</const>
+ </edit>
+ </match>
- };
+ <!-- Default fonts -->
+ <alias>
+ <family>sans-serif</family>
+ <prefer>
+ <family>${fontconfig.defaultFonts.sansSerif}</family>
+ </prefer>
+ </alias>
+ <alias>
+ <family>serif</family>
+ <prefer>
+ <family>${fontconfig.defaultFonts.serif}</family>
+ </prefer>
+ </alias>
+ <alias>
+ <family>monospace</family>
+ <prefer>
+ <family>${fontconfig.defaultFonts.monospace}</family>
+ </prefer>
+ </alias>
+
+ ${optionalString (fontconfig.dpi != 0) ''
+ <match target="pattern">
+ <edit name="dpi" mode="assign">
+ <double>${fontconfig.dpi}</double>
+ </edit>
+ </match>
+ ''}
+
+ </fontconfig>
+ '';
+
+ environment.etc."fonts/${pkgs.fontconfig.configVersion}/conf.d/99-user.conf" = {
+ enable = fontconfig.includeUserConf;
+ text = ''
+ <?xml version="1.0"?>
+ <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
+ <fontconfig>
+ <include ignore_missing="yes" prefix="xdg">fontconfig/conf.d</include>
+ <include ignore_missing="yes" prefix="xdg">fontconfig/fonts.conf</include>
+ </fontconfig>
+ '';
+ };
+
+ environment.systemPackages = [ pkgs.fontconfig ];
+
+ };
}