aboutsummaryrefslogtreecommitdiff
path: root/home-manager/modules/misc/gtk.nix
diff options
context:
space:
mode:
Diffstat (limited to 'home-manager/modules/misc/gtk.nix')
-rw-r--r--home-manager/modules/misc/gtk.nix188
1 files changed, 188 insertions, 0 deletions
diff --git a/home-manager/modules/misc/gtk.nix b/home-manager/modules/misc/gtk.nix
new file mode 100644
index 00000000000..1222db4ecab
--- /dev/null
+++ b/home-manager/modules/misc/gtk.nix
@@ -0,0 +1,188 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.gtk;
+ cfg2 = config.gtk.gtk2;
+ cfg3 = config.gtk.gtk3;
+
+ toGtk3Ini = generators.toINI {
+ mkKeyValue = key: value:
+ let
+ value' =
+ if isBool value then (if value then "true" else "false")
+ else toString value;
+ in
+ "${key}=${value'}";
+ };
+
+ formatGtk2Option = n: v:
+ let
+ v' =
+ if isBool v then (if v then "true" else "false")
+ else if isString v then "\"${v}\""
+ else toString v;
+ 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 <literal>null</literal> 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 <literal>null</literal> 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
+
+{
+ meta.maintainers = [ maintainers.rycee ];
+
+ imports = [
+ (mkRemovedOptionModule ["gtk" "gtk3" "waylandSupport"] ''
+ This options is not longer needed and can be removed.
+ '')
+ ];
+
+ options = {
+ gtk = {
+ enable = mkEnableOption "GTK 2/3 configuration";
+
+ font = mkOption {
+ type = types.nullOr fontType;
+ default = null;
+ description = ''
+ The font to use in GTK+ 2/3 applications.
+ '';
+ };
+
+ iconTheme = mkOption {
+ type = types.nullOr themeType;
+ default = null;
+ description = "The icon theme to use.";
+ };
+
+ theme = mkOption {
+ type = types.nullOr themeType;
+ default = null;
+ description = "The GTK+2/3 theme to use.";
+ };
+
+ gtk2 = {
+ extraConfig = mkOption {
+ type = types.lines;
+ default = "";
+ example = "gtk-can-change-accels = 1";
+ description = ''
+ Extra configuration lines to add verbatim to
+ <filename>~/.gtkrc-2.0</filename>.
+ '';
+ };
+ };
+
+ gtk3 = {
+ extraConfig = mkOption {
+ type = with types; attrsOf (either bool (either int str));
+ default = {};
+ example = { gtk-cursor-blink = false; gtk-recent-files-limit = 20; };
+ description = ''
+ Extra configuration options to add to
+ <filename>~/.config/gtk-3.0/settings.ini</filename>.
+ '';
+ };
+
+ extraCss = mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Extra configuration lines to add verbatim to
+ <filename>~/.config/gtk-3.0/gtk.css</filename>.
+ '';
+ };
+ };
+ };
+ };
+
+ config = mkIf cfg.enable (
+ let
+ ini =
+ optionalAttrs (cfg.font != null)
+ { gtk-font-name = cfg.font.name; }
+ //
+ optionalAttrs (cfg.theme != null)
+ { gtk-theme-name = cfg.theme.name; }
+ //
+ optionalAttrs (cfg.iconTheme != null)
+ { gtk-icon-theme-name = cfg.iconTheme.name; };
+
+ dconfIni =
+ optionalAttrs (cfg.font != null)
+ { font-name = cfg.font.name; }
+ //
+ optionalAttrs (cfg.theme != null)
+ { gtk-theme = cfg.theme.name; }
+ //
+ optionalAttrs (cfg.iconTheme != null)
+ { icon-theme = 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
+ ) + "\n" + cfg2.extraConfig;
+
+ xdg.configFile."gtk-3.0/settings.ini".text =
+ toGtk3Ini { Settings = ini // cfg3.extraConfig; };
+
+ xdg.configFile."gtk-3.0/gtk.css".text = cfg3.extraCss;
+
+ dconf.settings."org/gnome/desktop/interface" = dconfIni;
+ }
+ );
+}