119 lines
3.5 KiB
Nix
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
|
|
'';
|
|
}
|
|
);
|
|
};
|
|
};
|
|
}
|