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 1a6b09df2633..8c5db066ac44 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
@@ -1798,6 +1798,15 @@
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.
+
+
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 de1251104188..d29b7f70fffd 100644
--- a/nixos/doc/manual/release-notes/rl-2205.section.md
+++ b/nixos/doc/manual/release-notes/rl-2205.section.md
@@ -656,6 +656,11 @@ 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.
+
- 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/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 cb68ef685300..477091b94e44 100644
--- a/nixos/tests/all-tests.nix
+++ b/nixos/tests/all-tests.nix
@@ -591,6 +591,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")
+ '';
+})