diff --git a/nixos/modules/i18n/input-method/ibus.nix b/nixos/modules/i18n/input-method/ibus.nix
index b4746b21b653..cf24ecf58631 100644
--- a/nixos/modules/i18n/input-method/ibus.nix
+++ b/nixos/modules/i18n/input-method/ibus.nix
@@ -64,7 +64,7 @@ in
# Without dconf enabled it is impossible to use IBus
programs.dconf.enable = true;
- programs.dconf.profiles.ibus = "${ibusPackage}/etc/dconf/profile/ibus";
+ programs.dconf.packages = [ ibusPackage ];
services.dbus.packages = [
ibusAutostart
diff --git a/nixos/modules/programs/dconf.nix b/nixos/modules/programs/dconf.nix
index 6702e8efd1cb..ec85cb9d18c9 100644
--- a/nixos/modules/programs/dconf.nix
+++ b/nixos/modules/programs/dconf.nix
@@ -4,13 +4,24 @@ with lib;
let
cfg = config.programs.dconf;
-
- mkDconfProfile = name: path:
- {
- name = "dconf/profile/${name}";
- value.source = path;
- };
-
+ cfgDir = pkgs.symlinkJoin {
+ name = "dconf-system-config";
+ paths = map (x: "${x}/etc/dconf") cfg.packages;
+ postBuild = ''
+ mkdir -p $out/profile
+ mkdir -p $out/db
+ '' + (
+ concatStringsSep "\n" (
+ mapAttrsToList (
+ name: path: ''
+ ln -s ${path} $out/profile/${name}
+ ''
+ ) cfg.profiles
+ )
+ ) + ''
+ ${pkgs.dconf}/bin/dconf update $out/db
+ '';
+ };
in
{
###### interface
@@ -22,18 +33,24 @@ in
profiles = mkOption {
type = types.attrsOf types.path;
default = {};
- description = "Set of dconf profile files.";
+ description = "Set of dconf profile files, installed at /etc/dconf/profiles/name.";
internal = true;
};
+ packages = mkOption {
+ type = types.listOf types.package;
+ default = [];
+ description = "A list of packages which provide dconf profiles and databases in /etc/dconf.";
+ };
};
};
###### implementation
config = mkIf (cfg.profiles != {} || cfg.enable) {
- environment.etc = optionalAttrs (cfg.profiles != {})
- (mapAttrs' mkDconfProfile cfg.profiles);
+ environment.etc.dconf = mkIf (cfg.profiles != {} || cfg.packages != []) {
+ source = cfgDir;
+ };
services.dbus.packages = [ pkgs.dconf ];
diff --git a/nixos/tests/installed-tests/ibus.nix b/nixos/tests/installed-tests/ibus.nix
index af54b612b507..a4bc2a7d7de0 100644
--- a/nixos/tests/installed-tests/ibus.nix
+++ b/nixos/tests/installed-tests/ibus.nix
@@ -5,16 +5,12 @@ makeInstalledTest {
testConfig = {
i18n.inputMethod.enabled = "ibus";
+ systemd.user.services.ibus-daemon = {
+ serviceConfig.ExecStart = "${pkgs.ibus}/bin/ibus-daemon --xim --verbose";
+ wantedBy = [ "graphical-session.target" ];
+ partOf = [ "graphical-session.target" ];
+ };
};
- preTestScript = ''
- # ibus has ibus-desktop-testing-runner but it tries to manage desktop session so we just spawn ibus-daemon ourselves
- machine.succeed("ibus-daemon --daemonize --verbose")
- '';
-
withX11 = true;
-
- # TODO: ibus-daemon is currently crashing or something
- # maybe make ibus systemd service that auto-restarts?
- meta.broken = true;
}
diff --git a/pkgs/tools/inputmethods/ibus/default.nix b/pkgs/tools/inputmethods/ibus/default.nix
index 644fd5eef3b2..238e133495c9 100644
--- a/pkgs/tools/inputmethods/ibus/default.nix
+++ b/pkgs/tools/inputmethods/ibus/default.nix
@@ -16,6 +16,7 @@
, gtk2
, gtk3
, gtk-doc
+, runCommand
, isocodes
, cldr-emoji-annotation
, unicode-character-database
@@ -47,6 +48,14 @@ let
makeWrapper ${glib.dev}/bin/glib-mkenums $out/bin/glib-mkenums --unset PYTHONPATH
'';
};
+ # make-dconf-override-db.sh needs to execute dbus-launch in the sandbox,
+ # it will fail to read /etc/dbus-1/session.conf unless we add this flag
+ dbus-launch = runCommand "sandbox-dbus-launch" {
+ nativeBuildInputs = [ makeWrapper ];
+ } ''
+ makeWrapper ${dbus}/bin/dbus-launch $out/bin/dbus-launch \
+ --add-flags --config-file=${dbus.daemon}/share/dbus-1/session.conf
+ '';
in
stdenv.mkDerivation rec {
@@ -71,7 +80,7 @@ stdenv.mkDerivation rec {
outputs = [ "out" "dev" "installedTests" ];
postPatch = ''
- echo \#!${runtimeShell} > data/dconf/make-dconf-override-db.sh
+ patchShebangs --build data/dconf/make-dconf-override-db.sh
cp ${buildPackages.gtk-doc}/share/gtk-doc/data/gtk-doc.make .
'';
@@ -105,6 +114,7 @@ stdenv.mkDerivation rec {
python3BuildEnv
vala
wrapGAppsHook
+ dbus-launch
];
propagatedBuildInputs = [