1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 cfg = config.programs.dconf;
7 cfgDir = pkgs.symlinkJoin {
8 name = "dconf-system-config";
9 paths = map (x: "${x}/etc/dconf") cfg.packages;
10 postBuild = ''
11 mkdir -p $out/profile
12 mkdir -p $out/db
13 '' + (
14 concatStringsSep "\n" (
15 mapAttrsToList (
16 name: path: ''
17 ln -s ${path} $out/profile/${name}
18 ''
19 ) cfg.profiles
20 )
21 ) + ''
22 ${pkgs.dconf}/bin/dconf update $out/db
23 '';
24 };
25in
26{
27 ###### interface
28
29 options = {
30 programs.dconf = {
31 enable = mkEnableOption (lib.mdDoc "dconf");
32
33 profiles = mkOption {
34 type = types.attrsOf types.path;
35 default = {};
36 description = lib.mdDoc "Set of dconf profile files, installed at {file}`/etc/dconf/profiles/«name»`.";
37 internal = true;
38 };
39
40 packages = mkOption {
41 type = types.listOf types.package;
42 default = [];
43 description = lib.mdDoc "A list of packages which provide dconf profiles and databases in {file}`/etc/dconf`.";
44 };
45 };
46 };
47
48 ###### implementation
49
50 config = mkIf (cfg.profiles != {} || cfg.enable) {
51 environment.etc.dconf = mkIf (cfg.profiles != {} || cfg.packages != []) {
52 source = cfgDir;
53 };
54
55 services.dbus.packages = [ pkgs.dconf ];
56
57 systemd.packages = [ pkgs.dconf ];
58
59 # For dconf executable
60 environment.systemPackages = [ pkgs.dconf ];
61
62 # Needed for unwrapped applications
63 environment.sessionVariables.GIO_EXTRA_MODULES = mkIf cfg.enable [ "${pkgs.dconf.lib}/lib/gio/modules" ];
64 };
65
66}