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}