{ config, pkgs, lib, ... }: with lib; let cfg = config.i18n.inputMethod.ibus; ibusPackage = pkgs.ibus-with-plugins.override { plugins = cfg.engines; }; ibusEngine = types.package // { name = "ibus-engine"; check = x: (lib.types.package.check x) && (attrByPath ["meta" "isIbusEngine"] false x); }; in { disabledModules = [ "i18n/input-method/ibus.nix" ]; imports = [ (mkRenamedOptionModule [ "programs" "ibus" "plugins" ] [ "i18n" "inputMethod" "ibus" "engines" ]) ]; options = { i18n.inputMethod.ibus = { engines = mkOption { type = with types; listOf ibusEngine; default = []; example = literalExpression "with pkgs.ibus-engines; [ mozc hangul ]"; description = let enginesDrv = filterAttrs (const isDerivation) pkgs.ibus-engines; engines = concatStringsSep ", " (map (name: "${name}") (attrNames enginesDrv)); in "Enabled IBus engines. Available engines are: ${engines}."; }; panel = mkOption { type = with types; nullOr path; default = null; example = literalExpression ''"''${pkgs.plasma5Packages.plasma-desktop}/lib/libexec/kimpanel-ibus-panel"''; description = "Replace the IBus panel with another panel."; }; }; }; config = mkIf (config.i18n.inputMethod.enabled == "ibus") { i18n.inputMethod.package = ibusPackage; # Without dconf enabled it is impossible to use IBus programs.dconf.enable = true; programs.dconf.packages = [ ibusPackage ]; environment.variables = { GTK_IM_MODULE = "ibus"; QT_IM_MODULE = "ibus"; XMODIFIERS = "@im=ibus"; }; xdg.portal.extraPortals = mkIf config.xdg.portal.enable [ ibusPackage ]; systemd.user.services.ibus = { description = "Intelligent Input Bus"; documentation = ["man:ibus-daemon(1)"]; after = ["graphical-session-pre.target"]; wantedBy = ["graphical-session.target"]; serviceConfig = { Type = "dbus"; BusName = "org.freedesktop.IBus"; ExecStart = "${ibusPackage}/bin/ibus-daemon --xim ${optionalString (cfg.panel != null) "--panel ${cfg.panel}"}"; ExecReload = "${ibusPackage}/bin/ibus restart"; ExecStop = "${ibusPackage}/bin/ibus exit"; }; }; }; # uses attributes of the linked package meta.buildDocsInSandbox = false; }