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.nix164
1 files changed, 164 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..bf25aaaf664
--- /dev/null
+++ b/home-manager/modules/misc/gtk.nix
@@ -0,0 +1,164 @@
+{ 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'}";
+
+ 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 hm.types.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 = {
+ bookmarks = mkOption {
+ type = types.listOf types.str;
+ default = [ ];
+ example = [ "file:///home/jane/Documents" ];
+ description = "Bookmarks in the sidebar of the GTK file browser";
+ };
+
+ 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;
+
+ xdg.configFile."gtk-3.0/bookmarks" = mkIf (cfg3.bookmarks != [ ]) {
+ text = concatStringsSep "\n" cfg3.bookmarks;
+ };
+
+ dconf.settings."org/gnome/desktop/interface" = dconfIni;
+ });
+}