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/gtk.nix b/modules/misc/gtk.nix index 930823ff..c88ee4c0 100644 --- a/modules/misc/gtk.nix +++ b/modules/misc/gtk.nix @@ -8,8 +8,6 @@ let cfg2 = config.gtk.gtk2; cfg3 = config.gtk.gtk3; - dag = config.lib.dag; - toGtk3Ini = generators.toINI { mkKeyValue = key: value: let @@ -29,16 +27,6 @@ let in "${n} = ${v'}"; - toDconfIni = generators.toINI { - mkKeyValue = key: value: - let - tweakVal = v: - if isString v then "'${v}'" - else toString v; - in - "${key}=${tweakVal value}"; - }; - fontType = types.submodule { options = { package = mkOption { @@ -88,6 +76,12 @@ in { meta.maintainers = [ maintainers.rycee ]; + imports = [ + (mkRemovedOptionModule ["gtk" "gtk3" "waylandSupport"] '' + This options is not longer needed and can be removed. + '') + ]; + options = { gtk = { enable = mkEnableOption "GTK 2/3 configuration"; @@ -112,63 +106,36 @@ in description = "The GTK+2/3 theme to use."; }; - gtk2 = mkOption { - description = "Options specific to GTK+ 2"; - default = {}; - type = types.submodule { - options = { - extraConfig = mkOption { - type = types.lines; - default = ""; - example = "gtk-can-change-accels = 1"; - description = '' - Extra configuration lines to add verbatim to - ~/.gtkrc-2.0. - ''; - }; - }; + gtk2 = { + extraConfig = mkOption { + type = types.lines; + default = ""; + example = "gtk-can-change-accels = 1"; + description = '' + Extra configuration lines to add verbatim to + ~/.gtkrc-2.0. + ''; }; }; - gtk3 = mkOption { - description = "Options specific to GTK+ 3"; - default = {}; - type = types.submodule { - options = { - extraConfig = mkOption { - type = types.attrs; - default = {}; - example = { gtk-cursor-blink = false; gtk-recent-files-limit = 20; }; - description = '' - Extra configuration options to add to - ~/.config/gtk-3.0/settings.ini. - ''; - }; + gtk3 = { + extraConfig = mkOption { + type = types.attrs; + default = {}; + example = { gtk-cursor-blink = false; gtk-recent-files-limit = 20; }; + description = '' + Extra configuration options to add to + ~/.config/gtk-3.0/settings.ini. + ''; + }; - extraCss = mkOption { - type = types.lines; - default = ""; - description = '' - Extra configuration lines to add verbatim to - ~/.config/gtk-3.0/gtk.css. - ''; - }; - - waylandSupport = mkOption { - type = types.bool; - default = false; - description = '' - Support GSettings provider (dconf) in addition to - GtkSettings (INI file). This is needed for Wayland. - - Note, on NixOS the following line must be in the - system configuration: - - services.dbus.packages = [ pkgs.gnome3.dconf ]; - - ''; - }; - }; + extraCss = mkOption { + type = types.lines; + default = ""; + description = '' + Extra configuration lines to add verbatim to + ~/.config/gtk-3.0/gtk.css. + ''; }; }; }; @@ -200,7 +167,6 @@ in optional (opt != null && opt.package != null) opt.package; in { - home.packages = optionalPackage cfg.font ++ optionalPackage cfg.theme @@ -216,22 +182,7 @@ in xdg.configFile."gtk-3.0/gtk.css".text = cfg3.extraCss; - home.activation = mkIf cfg3.waylandSupport { - gtk3 = dag.entryAfter ["installPackages"] ( - let - iniText = toDconfIni { "/" = dconfIni; }; - iniFile = pkgs.writeText "gtk3.ini" iniText; - dconfPath = "/org/gnome/desktop/interface/"; - in - '' - if [[ -v DRY_RUN ]]; then - echo ${pkgs.gnome3.dconf}/bin/dconf load ${dconfPath} "<" ${iniFile} - else - ${pkgs.gnome3.dconf}/bin/dconf load ${dconfPath} < ${iniFile} - fi - '' - ); - }; + dconf.settings."org/gnome/desktop/interface" = dconfIni; } ); } diff --git a/modules/misc/news.nix b/modules/misc/news.nix index 95948551..344f569c 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 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 { }) diff --git a/modules/programs/gnome-terminal.nix b/modules/programs/gnome-terminal.nix index fa379464..afe12849 100644 --- a/modules/programs/gnome-terminal.nix +++ b/modules/programs/gnome-terminal.nix @@ -6,8 +6,6 @@ let cfg = config.programs.gnome-terminal; - dag = config.lib.dag; - profileColorsSubModule = types.submodule ( { ... }: { options = { @@ -91,19 +89,6 @@ let } ); - toDconfIni = generators.toINI { mkKeyValue = mkIniKeyValue; }; - - mkIniKeyValue = key: value: - let - tweakVal = v: - if isString v then "'${v}'" - else if isList v then "[" + concatStringsSep "," (map tweakVal v) + "]" - else if isBool v && v then "true" - else if isBool v && !v then "false" - else toString v; - in - "${key}=${tweakVal value}"; - buildProfileSet = pcfg: { visible-name = pcfg.visibleName; @@ -136,25 +121,6 @@ let ) ); - buildIniSet = cfg: - { - "/" = { - default-show-menubar = cfg.showMenubar; - schema-version = 3; - }; - } - // - { - "profiles:" = { - default = head (attrNames (filterAttrs (n: v: v.default) cfg.profile)); - list = attrNames cfg.profile; - }; - } - // - mapAttrs' (name: value: - nameValuePair ("profiles:/:${name}") (buildProfileSet value) - ) cfg.profile; - in { @@ -181,20 +147,23 @@ in config = mkIf cfg.enable { home.packages = [ pkgs.gnome3.gnome_terminal ]; - # The dconf service needs to be installed and prepared. - home.activation.gnomeTerminal = dag.entryAfter ["installPackages"] ( + dconf.settings = let - iniText = toDconfIni (buildIniSet cfg); - iniFile = pkgs.writeText "gnome-terminal.ini" iniText; - dconfPath = "/org/gnome/terminal/legacy/"; + dconfPath = "org/gnome/terminal/legacy"; in - '' - if [[ -v DRY_RUN ]]; then - echo ${pkgs.gnome3.dconf}/bin/dconf load ${dconfPath} "<" ${iniFile} - else - ${pkgs.gnome3.dconf}/bin/dconf load ${dconfPath} < ${iniFile} - fi - '' - ); + { + "${dconfPath}" = { + default-show-menubar = cfg.showMenubar; + schema-version = 3; + }; + + "${dconfPath}/profiles:" = { + default = head (attrNames (filterAttrs (n: v: v.default) cfg.profile)); + list = attrNames cfg.profile; + }; + } + // mapAttrs' (n: v: + nameValuePair ("${dconfPath}/profiles:/:${n}") (buildProfileSet v) + ) cfg.profile; }; }