{ config, lib, pkgs, ... }: let inherit (lib.modules) mkMerge mkIf; inherit (lib.options) mkEnableOption; cfg = config.modules.theming; inherit (builtins) toString isBool; inherit (lib) boolToString escape generators; toGtk3Ini = generators.toINI { mkKeyValue = key: value: let value' = if isBool value then boolToString value else toString value; in "${escape ["="] key}=${value'}"; }; gtkIni = { gtk-application-prefer-dark-theme = 1; gtk-font-name = "Lexend 11"; gtk-icon-theme-name = "Papirus-Dark"; gtk-xft-antialias = 1; gtk-xft-hinting = 1; gtk-xft-hintstyle = "hintslight"; gtk-xft-rgba = "rgb"; gtk-cursor-theme-name = "BreezeX-RosePine-Linux"; gtk-theme-name = "Gruvbox-Dark"; }; in { options.modules.theming = { qt.enable = mkEnableOption "qt theming"; }; config = mkMerge [ (mkIf cfg.gtk.enable { environment = { systemPackages = builtins.attrValues { inherit (pkgs) rose-pine-cursor; }; etc = { "xdg/gtk-4.0/settings.ini".text = toGtk3Ini { Settings = gtkIni; }; "xdg/gtk-3.0/settings.ini".text = toGtk3Ini { Settings = gtkIni; }; "xdg/gtk-2.0/gtkrc".text = '' gtk-cursor-theme-name = BreezeX-RosePine-Linux gtk-cursor-theme-size = 32 gtk-theme-name = Gruvbox-Dark gtk-icon-theme-name = Papirus-Dark gtk-font-name = Lexend 11 ''; "xdg/Xresources".text = '' Xcursor.size: 32 Xcursor.theme: BreezeX-RosePine-Linux ''; }; }; }) ]; }