nixcfg/modules/nixos/desktop/addons/gtk/default.nix
2024-01-11 10:31:04 +00:00

119 lines
3.5 KiB
Nix

{ options
, config
, lib
, pkgs
, ...
}:
with lib;
with lib.plusultra; let
cfg = config.plusultra.desktop.addons.gtk;
gdmCfg = config.services.xserver.displayManager.gdm;
in
{
options.plusultra.desktop.addons.gtk = with types; {
enable = mkBoolOpt false "Whether to customize GTK and apply themes.";
theme = {
name =
mkOpt str "Nordic-darker"
"The name of the GTK theme to apply.";
pkg = mkOpt package pkgs.nordic "The package to use for the theme.";
};
cursor = {
name =
mkOpt str "Bibata-Modern-Ice"
"The name of the cursor theme to apply.";
pkg = mkOpt package pkgs.plusultra.bibata-cursors "The package to use for the cursor theme.";
};
icon = {
name =
mkOpt str "Papirus"
"The name of the icon theme to apply.";
pkg = mkOpt package pkgs.papirus-icon-theme "The package to use for the icon theme.";
};
};
config = mkIf cfg.enable {
environment.systemPackages = [
cfg.icon.pkg
cfg.cursor.pkg
];
environment.sessionVariables = {
XCURSOR_THEME = cfg.cursor.name;
};
plusultra.home.extraOptions = {
gtk = {
enable = true;
theme = {
name = cfg.theme.name;
package = cfg.theme.pkg;
};
cursorTheme = {
name = cfg.cursor.name;
package = cfg.cursor.pkg;
};
iconTheme = {
name = cfg.icon.name;
package = cfg.icon.pkg;
};
};
};
# NOTE: In order to set the cursor theme in GDM we have to specify it in the
# dconf profile. However, the NixOS module doesn't provide an easy way to do this so the relevant
# parts have been extracted from:
# https://github.com/NixOS/nixpkgs/blob/96e18717904dfedcd884541e5a92bf9ff632cf39/nixos/modules/services/x11/display-managers/gdm.nix
#
# NOTE: The GTK and icon themes don't seem to affect recent GDM versions. I've
# left them here as reference for the future.
programs.dconf.profiles = mkIf gdmCfg.enable {
gdm =
let
customDconf = pkgs.writeTextFile {
name = "gdm-dconf";
destination = "/dconf/gdm-custom";
text = ''
${optionalString (!gdmCfg.autoSuspend) ''
[org/gnome/settings-daemon/plugins/power]
sleep-inactive-ac-type='nothing'
sleep-inactive-battery-type='nothing'
sleep-inactive-ac-timeout=0
sleep-inactive-battery-timeout=0
''}
[org/gnome/desktop/interface]
gtk-theme='${cfg.theme.name}'
cursor-theme='${cfg.cursor.name}'
icon-theme='${cfg.icon.name}'
'';
};
customDconfDb = pkgs.stdenv.mkDerivation {
name = "gdm-dconf-db";
buildCommand = ''
${pkgs.dconf}/bin/dconf compile $out ${customDconf}/dconf
'';
};
in
mkForce (
pkgs.stdenv.mkDerivation {
name = "dconf-gdm-profile";
buildCommand = ''
# Check that the GDM profile starts with what we expect.
if [ $(head -n 1 ${pkgs.gnome.gdm}/share/dconf/profile/gdm) != "user-db:user" ]; then
echo "GDM dconf profile changed, please update gtk/default.nix"
exit 1
fi
# Insert our custom DB behind it.
sed '2ifile-db:${customDconfDb}' ${pkgs.gnome.gdm}/share/dconf/profile/gdm > $out
'';
}
);
};
};
}