nixos/dconf: refractor

remove `with lib;`
profiles option now accepts packages in addition to paths.
profiles option is no longer internal.
cfgDir definition has been inlined.
pulled GIO_EXTRA_MODULES inside mkif.
removed pointless comments with section headings.
defined profiles are now turned into package, allowing to simplify the db update logic.
This commit is contained in:
linsui 2023-06-14 16:22:17 +08:00 committed by linsui
parent da614d98e9
commit cce75fa51e

View file

@ -1,55 +1,50 @@
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
with lib;
let let
cfg = config.programs.dconf; cfg = config.programs.dconf;
cfgDir = pkgs.symlinkJoin {
name = "dconf-system-config"; # Generate dconf profile
paths = map (x: "${x}/etc/dconf") cfg.packages; mkDconfProfile = name: value:
postBuild = '' pkgs.runCommand "dconf-profile" { } ''
mkdir -p $out/profile mkdir -p $out/etc/dconf/profile/
mkdir -p $out/db cp ${value} $out/etc/dconf/profile/${name}
'' + (
concatStringsSep "\n" (
mapAttrsToList (
name: path: ''
ln -s ${path} $out/profile/${name}
''
) cfg.profiles
)
) + ''
${pkgs.dconf}/bin/dconf update $out/db
''; '';
};
in in
{ {
###### interface
options = { options = {
programs.dconf = { programs.dconf = {
enable = mkEnableOption (lib.mdDoc "dconf"); enable = lib.mkEnableOption (lib.mdDoc "dconf");
profiles = mkOption { profiles = lib.mkOption {
type = types.attrsOf types.path; type = with lib.types; attrsOf (oneOf [
default = {}; path
description = lib.mdDoc "Set of dconf profile files, installed at {file}`/etc/dconf/profiles/«name»`."; package
internal = true; ]);
description = lib.mdDoc "Attrset of dconf profiles.";
}; };
packages = mkOption { packages = lib.mkOption {
type = types.listOf types.package; type = lib.types.listOf lib.types.package;
default = []; default = [ ];
description = lib.mdDoc "A list of packages which provide dconf profiles and databases in {file}`/etc/dconf`."; description = lib.mdDoc "A list of packages which provide dconf profiles and databases in {file}`/etc/dconf`.";
}; };
}; };
}; };
###### implementation config = lib.mkIf (cfg.profiles != { } || cfg.enable) {
programs.dconf.packages = lib.mapAttrsToList mkDconfProfile cfg.profiles;
config = mkIf (cfg.profiles != {} || cfg.enable) { environment.etc.dconf = lib.mkIf (cfg.packages != [ ]) {
environment.etc.dconf = mkIf (cfg.profiles != {} || cfg.packages != []) { source = pkgs.symlinkJoin {
source = cfgDir; name = "dconf-system-config";
paths = map (x: "${x}/etc/dconf") cfg.packages;
nativeBuildInputs = [ (lib.getBin pkgs.dconf) ];
postBuild = ''
if test -d $out/db; then
dconf update $out/db
fi
'';
};
}; };
services.dbus.packages = [ pkgs.dconf ]; services.dbus.packages = [ pkgs.dconf ];
@ -59,8 +54,9 @@ in
# For dconf executable # For dconf executable
environment.systemPackages = [ pkgs.dconf ]; environment.systemPackages = [ pkgs.dconf ];
# Needed for unwrapped applications environment.sessionVariables = lib.mkIf cfg.enable {
environment.sessionVariables.GIO_EXTRA_MODULES = mkIf cfg.enable [ "${pkgs.dconf.lib}/lib/gio/modules" ]; # Needed for unwrapped applications
GIO_EXTRA_MODULES = [ "${pkgs.dconf.lib}/lib/gio/modules" ];
};
}; };
} }