main
  1{lib, ...}: {
  2  den.aspects.desktop.aesthetic.gtk = {
  3    settings.host = {
  4      theme = {
  5        name = lib.mkOption {
  6          type = lib.types.str;
  7          default = "adw-gtk3";
  8        };
  9        package = lib.mkOption {
 10          type = lib.types.functionTo lib.types.package;
 11          default = pkgs: pkgs.adw-gtk3;
 12        };
 13      };
 14    };
 15
 16    provides.to-users.hjem = {
 17      host,
 18      pkgs,
 19      config,
 20      ...
 21    }: let
 22      fonts = host.settings.desktop.aesthetic.fonts;
 23      cursor = host.settings.desktop.aesthetic.cursor;
 24      icon = host.settings.desktop.aesthetic.icon;
 25      theme = host.settings.desktop.aesthetic.gtk.theme;
 26
 27      settings =
 28        {"gtk-theme-name" = theme.name;}
 29        // (lib.optionalAttrs (icon.name != null) {"gtk-icon-theme-name" = icon.name;})
 30        // (lib.optionalAttrs (cursor.name != null) {
 31          "gtk-cursor-theme-name" = cursor.name;
 32          "gtk-cursor-theme-size" = toString cursor.size;
 33        })
 34        // {
 35          "gtk-font-name" = "${(lib.head fonts.sansSerif).name} ${toString fonts.size}";
 36        };
 37
 38      gtkINIGenerator = (pkgs.formats.ini {}).generate;
 39
 40      gtk2Generator = settings:
 41        lib.concatMapAttrsStringSep "\n"
 42        (n: v: "${n} = ${
 43          if builtins.isBool v
 44          then lib.trivial.boolToString v
 45          else if builtins.isString v
 46          then
 47            if lib.strings.hasPrefix "GTK_" v
 48            then v
 49            else ''"${v}"''
 50          else toString v
 51        }")
 52        settings;
 53    in {
 54      packages = lib.optional (theme != null) (theme.package pkgs);
 55
 56      xdg.config.files = {
 57        "gtk-2.0/gtkrc" = {
 58          generator = gtk2Generator;
 59          value = settings;
 60        };
 61        "gtk-3.0/settings.ini" = {
 62          generator = gtkINIGenerator "gtk-3.0-settings.ini";
 63          value = {Settings = settings;};
 64        };
 65        "gtk-4.0/settings.ini" = {
 66          generator = gtkINIGenerator "gtk-4.0-settings.ini";
 67          value = {Settings = settings;};
 68        };
 69      };
 70
 71      dconf.settings."org/gnome/desktop/interface" = lib.filterAttrs (_: v: v != null) {
 72        "font-name" = settings."gtk-font-name" or null;
 73        "gtk-theme" = settings."gtk-theme-name" or null;
 74        "icon-theme" = settings."gtk-icon-theme-name" or null;
 75        "cursor-theme" = settings."gtk-cursor-theme-name" or null;
 76        "cursor-size" = settings."gtk-cursor-theme-size" or null;
 77      };
 78
 79      environment.sessionVariables = lib.optionalAttrs (theme != null) {
 80        GTK2_RC_FILES = "${config.xdg.config.directory}/gtk-2.0/gtkrc";
 81        GTK_THEME = theme.name;
 82      };
 83    };
 84  };
 85
 86  den.aspects.desktop.aesthetic.gtk.themes = {
 87    catppuccin = {
 88      hjem = {pkgs, ...}: let
 89        adw-color-catppuccin-mocha-mauve = pkgs.fetchurl {
 90          url = "https://github.com/claymorwan/catppuccin/raw/54f7393990e672d3648c1bc8c4cc6d26e6bde852/adw/themes/mocha/catppuccin-mocha-mauve.css";
 91          hash = "sha256-sj36YMvkpRym6FgzQzHuG0K8Nq/t/RHTZpxDdBiQybY=";
 92        };
 93      in {
 94        xdg.config.files = {
 95          "gtk-3.0/settings.ini".value.Settings = {"gtk-application-prefer-dark-theme" = true;};
 96          "gtk-4.0/settings.ini".value.Settings = {"gtk-application-prefer-dark-theme" = true;};
 97          "gtk-3.0/gtk.css".source = adw-color-catppuccin-mocha-mauve;
 98          "gtk-4.0/gtk.css".source = adw-color-catppuccin-mocha-mauve;
 99        };
100
101        dconf.settings."org/gnome/desktop/interface" = {
102          color-scheme = "prefer-dark";
103        };
104      };
105    };
106  };
107}