diff --git a/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml b/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml
index 650664efcc55..730efa16e8c3 100644
--- a/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml
+++ b/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml
@@ -1852,6 +1852,29 @@
configuration.
+
+
+ The option
+ services.xserver.desktopManager.runXdgAutostartIfNone
+ was added in order to automatically run XDG autostart files
+ for sessions without a desktop manager. This replaces helpers
+ like the dex package.
+
+
+
+
+ When setting
+ i18n.inputMethod.enabled
+ to fcitx5, it no longer creates
+ corresponding systemd user services. It now relies on XDG
+ autostart files to start and work properly in your desktop
+ sessions. If you are using only a window manager without a
+ desktop manager, you need to enable
+ services.xserver.desktopManager.runXdgAutostartIfNone
+ or using the dex package to make
+ fcitx5 work.
+
+
A new module was added for the Envoy reverse proxy, providing
diff --git a/nixos/doc/manual/release-notes/rl-2205.section.md b/nixos/doc/manual/release-notes/rl-2205.section.md
index 1c6011f14721..13c73c4e8096 100644
--- a/nixos/doc/manual/release-notes/rl-2205.section.md
+++ b/nixos/doc/manual/release-notes/rl-2205.section.md
@@ -693,6 +693,17 @@ In addition to numerous new and upgraded packages, this release has the followin
- The `services.stubby` module was converted to a [settings-style](https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md) configuration.
+- The option
+ [services.xserver.desktopManager.runXdgAutostartIfNone](#opt-services.xserver.desktopManager.runXdgAutostartIfNone)
+ was added in order to automatically run XDG autostart files for sessions without a desktop manager.
+ This replaces helpers like the `dex` package.
+
+- When setting [i18n.inputMethod.enabled](#opt-i18n.inputMethod.enabled) to `fcitx5`,
+ it no longer creates corresponding systemd user services.
+ It now relies on XDG autostart files to start and work properly in your desktop sessions.
+ If you are using only a window manager without a desktop manager, you need to enable
+ `services.xserver.desktopManager.runXdgAutostartIfNone` or using the `dex` package to make `fcitx5` work.
+
- A new module was added for the Envoy reverse proxy, providing the options `services.envoy.enable` and `services.envoy.settings`.
- The option `services.duplicati.dataDir` has been added to allow changing the location of duplicati's files.
diff --git a/nixos/modules/i18n/input-method/fcitx5.nix b/nixos/modules/i18n/input-method/fcitx5.nix
index 414aabbbaa73..6fea28e22345 100644
--- a/nixos/modules/i18n/input-method/fcitx5.nix
+++ b/nixos/modules/i18n/input-method/fcitx5.nix
@@ -28,11 +28,5 @@ in {
QT_IM_MODULE = "fcitx";
XMODIFIERS = "@im=fcitx";
};
-
- systemd.user.services.fcitx5-daemon = {
- enable = true;
- script = "${fcitx5Package}/bin/fcitx5";
- wantedBy = [ "graphical-session.target" ];
- };
};
}
diff --git a/nixos/modules/services/x11/desktop-managers/none.nix b/nixos/modules/services/x11/desktop-managers/none.nix
index af7a376ae029..b5e498b67a01 100644
--- a/nixos/modules/services/x11/desktop-managers/none.nix
+++ b/nixos/modules/services/x11/desktop-managers/none.nix
@@ -1,7 +1,46 @@
+{ config, lib, pkgs, ... }:
+with lib;
+let
+ runXdgAutostart = config.services.xserver.desktopManager.runXdgAutostartIfNone;
+in
{
- services.xserver.desktopManager.session =
- [ { name = "none";
- start = "";
- }
- ];
+ options = {
+ services.xserver.desktopManager.runXdgAutostartIfNone = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to run XDG autostart files for sessions without a desktop manager
+ (with only a window manager), these sessions usually don't handle XDG
+ autostart files by default.
+
+ Some services like and
+ use XDG autostart files to start.
+ If this option is not set to true and you are using
+ a window manager without a desktop manager, you need to manually start
+ them or running dex somewhere.
+ '';
+ };
+ };
+
+ config = mkMerge [
+ {
+ services.xserver.desktopManager.session = [
+ {
+ name = "none";
+ start = optionalString runXdgAutostart ''
+ /run/current-system/systemd/bin/systemctl --user start xdg-autostart-if-no-desktop-manager.target
+ '';
+ }
+ ];
+ }
+ (mkIf runXdgAutostart {
+ systemd.user.targets.xdg-autostart-if-no-desktop-manager = {
+ description = "Run XDG autostart files";
+ # From `plasma-workspace`, `share/systemd/user/plasma-workspace@.target`.
+ requires = [ "xdg-desktop-autostart.target" "graphical-session.target" ];
+ before = [ "xdg-desktop-autostart.target" "graphical-session.target" ];
+ bindsTo = [ "graphical-session.target" ];
+ };
+ })
+ ];
}
diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix
index 9848487fd134..50672a27b385 100644
--- a/nixos/tests/all-tests.nix
+++ b/nixos/tests/all-tests.nix
@@ -594,6 +594,7 @@ in
xautolock = handleTest ./xautolock.nix {};
xfce = handleTest ./xfce.nix {};
xmonad = handleTest ./xmonad.nix {};
+ xmonad-xdg-autostart = handleTest ./xmonad-xdg-autostart.nix {};
xrdp = handleTest ./xrdp.nix {};
xss-lock = handleTest ./xss-lock.nix {};
xterm = handleTest ./xterm.nix {};
diff --git a/nixos/tests/xmonad-xdg-autostart.nix b/nixos/tests/xmonad-xdg-autostart.nix
new file mode 100644
index 000000000000..2577a9ce2ea1
--- /dev/null
+++ b/nixos/tests/xmonad-xdg-autostart.nix
@@ -0,0 +1,35 @@
+import ./make-test-python.nix ({ lib, ... }: {
+ name = "xmonad-xdg-autostart";
+ meta.maintainers = with lib.maintainers; [ oxalica ];
+
+ nodes.machine = { pkgs, config, ... }: {
+ imports = [ ./common/x11.nix ./common/user-account.nix ];
+ test-support.displayManager.auto.user = "alice";
+ services.xserver.displayManager.defaultSession = "none+xmonad";
+ services.xserver.windowManager.xmonad.enable = true;
+ services.xserver.desktopManager.runXdgAutostartIfNone = true;
+
+ environment.systemPackages = [
+ (pkgs.writeTextFile {
+ name = "test-xdg-autostart";
+ destination = "/etc/xdg/autostart/test-xdg-autostart.desktop";
+ text = ''
+ [Desktop Entry]
+ Name=test-xdg-autoatart
+ Type=Application
+ Terminal=false
+ Exec=${pkgs.coreutils}/bin/touch ${config.users.users.alice.home}/xdg-autostart-executed
+ '';
+ })
+ ];
+ };
+
+ testScript = { nodes, ... }:
+ let
+ user = nodes.machine.config.users.users.alice;
+ in
+ ''
+ machine.wait_for_x()
+ machine.wait_for_file("${user.home}/xdg-autostart-executed")
+ '';
+})