diff --git a/modules/misc/dconf.nix b/modules/misc/dconf.nix index 035d2ec35..ce0f1045d 100644 --- a/modules/misc/dconf.nix +++ b/modules/misc/dconf.nix @@ -33,8 +33,7 @@ in options = { dconf = { - enable = lib.mkOption { - type = types.bool; + enable = lib.mkEnableOption "dconf" // { # While technically dconf on darwin could work, our activation step # requires dbus, which only *lightly* supports Darwin in general, and # not at all in the way it's packaged in nixpkgs. Because of this, we @@ -43,14 +42,6 @@ in # re-enabled, unclear whether there's actual value in it though. default = !pkgs.stdenv.hostPlatform.isDarwin; visible = false; - description = '' - Whether to enable dconf settings. - - Note, if you use NixOS then you must add - `programs.dconf.enable = true` - to your system configuration. Otherwise you will see a systemd error - message when your configuration is activated. - ''; }; settings = lib.mkOption { @@ -85,70 +76,76 @@ in }; }; - config = lib.mkIf (cfg.enable && cfg.settings != { }) { - # Make sure the dconf directory exists. - xdg.configFile."dconf/.keep".source = builtins.toFile "keep" ""; + config = lib.mkIf cfg.enable ( + { + home.packages = [ pkgs.dconf ]; + dbus.packages = [ pkgs.dconf ]; + } + // lib.mkIf (cfg.settings != { }) { + # Make sure the dconf directory exists. + xdg.configFile."dconf/.keep".source = builtins.toFile "keep" ""; - home.extraBuilderCommands = '' - mkdir -p $out/state/ - ln -s ${stateDconfKeys} $out/state/${stateDconfKeys.name} - ''; + home.extraBuilderCommands = '' + mkdir -p $out/state/ + ln -s ${stateDconfKeys} $out/state/${stateDconfKeys.name} + ''; - home.activation.dconfSettings = lib.hm.dag.entryAfter [ "installPackages" ] ( - let - iniFile = pkgs.writeText "hm-dconf.ini" (toDconfIni cfg.settings); + home.activation.dconfSettings = lib.hm.dag.entryAfter [ "installPackages" ] ( + let + iniFile = pkgs.writeText "hm-dconf.ini" (toDconfIni cfg.settings); - statePath = "state/${stateDconfKeys.name}"; + statePath = "state/${stateDconfKeys.name}"; - cleanup = pkgs.writeShellScript "dconf-cleanup" '' - set -euo pipefail + cleanup = pkgs.writeShellScript "dconf-cleanup" '' + set -euo pipefail - ${config.lib.bash.initHomeManagerLib} + ${config.lib.bash.initHomeManagerLib} - PATH=${ - lib.makeBinPath [ - pkgs.dconf - pkgs.jq - ] - }''${PATH:+:}$PATH + PATH=${ + lib.makeBinPath [ + pkgs.dconf + pkgs.jq + ] + }''${PATH:+:}$PATH - oldState="$1" - newState="$2" + oldState="$1" + newState="$2" - # Can't do cleanup if we don't know the old state. - if [[ ! -f $oldState ]]; then - exit 0 + # Can't do cleanup if we don't know the old state. + if [[ ! -f $oldState ]]; then + exit 0 + fi + + # Reset all keys that are present in the old generation but not the new + # one. + jq -r -n \ + --slurpfile old "$oldState" \ + --slurpfile new "$newState" \ + '($old[] - $new[])[]' \ + | while read -r key; do + verboseEcho "Resetting dconf key \"$key\"" + run $DCONF_DBUS_RUN_SESSION dconf reset "$key" + done + ''; + in + '' + if [[ -v DBUS_SESSION_BUS_ADDRESS ]]; then + export DCONF_DBUS_RUN_SESSION="" + else + export DCONF_DBUS_RUN_SESSION="${pkgs.dbus}/bin/dbus-run-session --dbus-daemon=${pkgs.dbus}/bin/dbus-daemon" fi - # Reset all keys that are present in the old generation but not the new - # one. - jq -r -n \ - --slurpfile old "$oldState" \ - --slurpfile new "$newState" \ - '($old[] - $new[])[]' \ - | while read -r key; do - verboseEcho "Resetting dconf key \"$key\"" - run $DCONF_DBUS_RUN_SESSION dconf reset "$key" - done - ''; - in - '' - if [[ -v DBUS_SESSION_BUS_ADDRESS ]]; then - export DCONF_DBUS_RUN_SESSION="" - else - export DCONF_DBUS_RUN_SESSION="${pkgs.dbus}/bin/dbus-run-session --dbus-daemon=${pkgs.dbus}/bin/dbus-daemon" - fi + if [[ -v oldGenPath ]]; then + ${cleanup} \ + "$oldGenPath/${statePath}" \ + "$newGenPath/${statePath}" + fi - if [[ -v oldGenPath ]]; then - ${cleanup} \ - "$oldGenPath/${statePath}" \ - "$newGenPath/${statePath}" - fi + run $DCONF_DBUS_RUN_SESSION ${pkgs.dconf}/bin/dconf load / < ${iniFile} - run $DCONF_DBUS_RUN_SESSION ${pkgs.dconf}/bin/dconf load / < ${iniFile} - - unset DCONF_DBUS_RUN_SESSION - '' - ); - }; + unset DCONF_DBUS_RUN_SESSION + '' + ); + } + ); }