From 54fc5f778ba8feb29870cf29ae92fecaac436898 Mon Sep 17 00:00:00 2001 From: Robert Helgesson Date: Sun, 4 Nov 2018 19:51:40 +0100 Subject: [PATCH] dconf: add module This module allows unified configuration of dconf settings. (cherry picked from commit b2cc186d22a664a0e07233b7921320601b1b1016) --- modules/misc/dconf.nix | 83 ++++++++++++++++++++++++++++++++++++++++++ modules/misc/news.nix | 7 ++++ modules/modules.nix | 1 + 3 files changed, 91 insertions(+) create mode 100644 modules/misc/dconf.nix diff --git a/modules/misc/dconf.nix b/modules/misc/dconf.nix new file mode 100644 index 00000000..8c28fe9c --- /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 0c650094..b5ff23a0 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -904,6 +904,13 @@ in A new module is available: 'programs.vscode'. ''; } + + { + time = "2019-01-14T17:37:23+00:00"; + message = '' + A new module is available: 'dconf'. + ''; + } ]; }; } diff --git a/modules/modules.nix b/modules/modules.nix index aa9c4583..45ab16a3 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 { })