From bcb82da88f9f5e80dbeb14f6d9a6b58e01212f8e Mon Sep 17 00:00:00 2001 From: Robert Helgesson Date: Wed, 8 Nov 2017 01:17:46 +0100 Subject: [PATCH] gtk: improve theme and font configuration Specifically, allow the user to specify the package that provides the theme or font. Fixes #1. --- modules/misc/gtk.nix | 99 ++++++++++++++++++++++++++++++++++++------- modules/misc/news.nix | 27 ++++++++++++ 2 files changed, 110 insertions(+), 16 deletions(-) diff --git a/modules/misc/gtk.nix b/modules/misc/gtk.nix index f0fc8b1ae..db374c35f 100644 --- a/modules/misc/gtk.nix +++ b/modules/misc/gtk.nix @@ -27,6 +27,50 @@ let in "${n} = ${v'}"; + fontType = types.submodule { + options = { + package = mkOption { + type = types.nullOr types.package; + default = null; + example = literalExample "pkgs.dejavu_fonts"; + description = '' + Package providing the font. This package will be installed + to your profile. If null then the font + is assumed to already be available in your profile. + ''; + }; + + name = mkOption { + type = types.str; + example = "DejaVu Sans 8"; + description = '' + The family name and size of the font within the package. + ''; + }; + }; + }; + + themeType = types.submodule { + options = { + package = mkOption { + type = types.nullOr types.package; + default = null; + example = literalExample "pkgs.gnome3.gnome_themes_standard"; + description = '' + Package providing the theme. This package will be installed + to your profile. If null then the theme + is assumed to already be available in your profile. + ''; + }; + + name = mkOption { + type = types.str; + example = "Adwaita"; + description = "The name of the theme within the package."; + }; + }; + }; + in { @@ -36,27 +80,24 @@ in gtk = { enable = mkEnableOption "GTK 2/3 configuration"; - fontName = mkOption { - type = types.nullOr types.str; + font = mkOption { + type = types.nullOr fontType; default = null; - example = "DejaVu Sans 8"; description = '' The font to use in GTK+ 2/3 applications. ''; }; - themeName = mkOption { - type = types.nullOr types.str; + iconTheme = mkOption { + type = types.nullOr themeType; default = null; - example = "Vertex-Dark"; - description = "The name of the GTK+2/3 theme to use."; + description = "The icon theme to use."; }; - iconThemeName = mkOption { - type = types.nullOr types.str; + theme = mkOption { + type = types.nullOr themeType; default = null; - example = "Tango"; - description = "The name of the icon theme to use."; + description = "The GTK+2/3 theme to use."; }; gtk2 = mkOption { @@ -110,15 +151,24 @@ in let ini = optionalAttrs (cfg.fontName != null) - { gtk-font-name = cfg.fontName; } + { gtk-font-name = cfg.font.name; } // - optionalAttrs (cfg.themeName != null) - { gtk-theme-name = cfg.themeName; } + optionalAttrs (cfg.theme != null) + { gtk-theme-name = cfg.theme.name; } // - optionalAttrs (cfg.iconThemeName != null) - { gtk-icon-theme-name = cfg.iconThemeName; }; + optionalAttrs (cfg.iconTheme != null) + { gtk-icon-theme-name = cfg.iconTheme.name; }; + + optionalPackage = opt: + optional (opt != null && opt.package != null) opt.package; in { + + home.packages = + optionalPackage cfg.font + ++ optionalPackage cfg.theme + ++ optionalPackage cfg.iconTheme; + home.file.".gtkrc-2.0".text = concatStringsSep "\n" ( mapAttrsToList formatGtk2Option ini @@ -130,4 +180,21 @@ in xdg.configFile."gtk-3.0/gtk.css".text = cfg3.extraCss; } ); + + imports = + let + name = n: [ "gtk" n ]; + in [ + (mkChangedOptionModule (name "fontName") (name "font") ( + config: { name = getAttrFromPath (name "fontName") config; } + )) + + (mkChangedOptionModule (name "themeName") (name "theme") ( + config: { name = getAttrFromPath (name "themeName") config; } + )) + + (mkChangedOptionModule (name "iconThemeName") (name "iconTheme") ( + config: { name = getAttrFromPath (name "iconThemeName") config; } + )) + ]; } diff --git a/modules/misc/news.nix b/modules/misc/news.nix index b27882ec1..656e95e5f 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -467,6 +467,33 @@ in i3.config.focus.mouseWarping ''; } + + { + time = "2017-11-23T00:31:12+00:00"; + condition = + config.gtk.fontName != "_mkMergedOptionModule" + || config.gtk.themeName != "_mkMergedOptionModule" + || config.gtk.iconThemeName != "_mkMergedOptionModule"; + message = '' + The options + + gtk.fontName, gtk.themeName, and gtk.iconThemeName + + are deprecated and will be removed on December 23, 2017. + + Please use + + gtk.font.name, gtk.theme.name, and gtk.iconTheme.name + + instead. You can find information about these in the manual + page. + + This change was made to introduce the options + 'gtk.font.package', 'gtk.theme.package', and + 'gtk.iconTheme.package', which allow you to specify the + package that provides the font or theme. + ''; + } ]; }; }