summary refs log tree commit diff
path: root/nixos
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
parentd75485c945f1424f8d69716c8519a4a7d62f22ad (diff)
downloadnixlib-1df1305a8a313120219e70ed1f50618b1047963d.tar
nixlib-1df1305a8a313120219e70ed1f50618b1047963d.tar.gz
nixlib-1df1305a8a313120219e70ed1f50618b1047963d.tar.bz2
nixlib-1df1305a8a313120219e70ed1f50618b1047963d.tar.lz
nixlib-1df1305a8a313120219e70ed1f50618b1047963d.tar.xz
nixlib-1df1305a8a313120219e70ed1f50618b1047963d.tar.zst
nixlib-1df1305a8a313120219e70ed1f50618b1047963d.zip
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')
-rw-r--r--nixos/modules/config/fonts/fontconfig.nix327
-rw-r--r--nixos/modules/config/no-x-libs.nix2
-rw-r--r--nixos/modules/rename.nix1
3 files changed, 280 insertions, 50 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 ];
+
+    };
 
 }
diff --git a/nixos/modules/config/no-x-libs.nix b/nixos/modules/config/no-x-libs.nix
index f91dbb4cc281..47393c9d3f5c 100644
--- a/nixos/modules/config/no-x-libs.nix
+++ b/nixos/modules/config/no-x-libs.nix
@@ -24,7 +24,7 @@ with lib;
     programs.ssh.setXAuthLocation = false;
     security.pam.services.su.forwardXAuth = lib.mkForce false;
 
-    fonts.enableFontConfig = false;
+    fonts.fontconfig.enable = false;
 
     nixpkgs.config.packageOverrides = pkgs:
       { dbus = pkgs.dbus.override { useX11 = false; }; };
diff --git a/nixos/modules/rename.nix b/nixos/modules/rename.nix
index b29a3d0354c9..cb1b92e78d62 100644
--- a/nixos/modules/rename.nix
+++ b/nixos/modules/rename.nix
@@ -74,6 +74,7 @@ in zipModules ([]
 ++ obsolete [ "environment" "x11Packages" ] [ "environment" "systemPackages" ]
 ++ obsolete [ "environment" "enableBashCompletion" ] [ "programs" "bash" "enableCompletion" ]
 ++ obsolete [ "environment" "nix" ] [ "nix" "package" ]
+++ obsolete [ "fonts" "enableFontConfig" ] [ "fonts" "fontconfig" "enable" ]
 ++ obsolete [ "fonts" "extraFonts" ] [ "fonts" "fonts" ]
 
 ++ obsolete [ "security" "extraSetuidPrograms" ] [ "security" "setuidPrograms" ]