diff --git a/modules/misc/dconf.nix b/modules/misc/dconf.nix new file mode 100644 index 000000000..8c28fe9cd --- /dev/null +++ b/modules/misc/dconf.nix @@ -0,0 +1,83 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + cfg = config.dconf; + dag = config.lib.dag; + + toDconfIni = generators.toINI { mkKeyValue = mkIniKeyValue; }; + + mkIniKeyValue = key: value: + let + tweakVal = v: + if isString v then "'${v}'" + else if isList v then "[" + concatMapStringsSep "," tweakVal v + "]" + else if isBool v then (if v then "true" else "false") + else toString v; + in + "${key}=${tweakVal value}"; + + primitive = with types; either bool (either int str); + +in + +{ + meta.maintainers = [ maintainers.gnidorah maintainers.rycee ]; + + options = { + dconf = { + enable = mkOption { + type = types.bool; + default = true; + visible = false; + description = '' + Whether to enable dconf settings. + ''; + }; + + settings = mkOption { + type = with types; + attrsOf (attrsOf (either primitive (listOf primitive))); + default = {}; + example = literalExample '' + { + "org/gnome/calculator" = { + button-mode = "programming"; + show-thousands = true; + base = 10; + word-size = 64; + }; + } + ''; + description = '' + Settings to write to the dconf configuration system. + ''; + }; + }; + }; + + config = mkIf (cfg.enable && cfg.settings != {}) { + home.activation.dconfSettings = dag.entryAfter ["installPackages"] ( + let + iniFile = pkgs.writeText "hm-dconf.ini" (toDconfIni cfg.settings); + in + '' + if [[ -v DBUS_SESSION_BUS_ADDRESS ]]; then + DCONF_DBUS_RUN_SESSION="" + else + DCONF_DBUS_RUN_SESSION="${pkgs.dbus}/bin/dbus-run-session" + fi + + if [[ -v DRY_RUN ]]; then + echo $DCONF_DBUS_RUN_SESSION ${pkgs.gnome3.dconf}/bin/dconf load / "<" ${iniFile} + else + $DCONF_DBUS_RUN_SESSION ${pkgs.gnome3.dconf}/bin/dconf load / < ${iniFile} + fi + + unset DCONF_DBUS_RUN_SESSION + '' + ); + }; +} diff --git a/modules/misc/news.nix b/modules/misc/news.nix index 959485513..344f569cf 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -904,6 +904,13 @@ in A new module is available: 'programs.jq'. ''; } + + { + time = "2018-12-24T16:26:16+00:00"; + message = '' + A new module is available: 'dconf'. + ''; + } ]; }; } diff --git a/modules/modules.nix b/modules/modules.nix index aa9c4583a..45ab16a36 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -25,6 +25,7 @@ let (loadModule ./files.nix { }) (loadModule ./home-environment.nix { }) (loadModule ./manual.nix { }) + (loadModule ./misc/dconf.nix { }) (loadModule ./misc/fontconfig.nix { }) (loadModule ./misc/gtk.nix { }) (loadModule ./misc/lib.nix { })