From e49259f4897ca2125de90f7b9eff7b431aea5710 Mon Sep 17 00:00:00 2001 From: K900 Date: Wed, 14 Jan 2026 17:31:49 +0300 Subject: [PATCH] nixos/display-managers: move "generic" DM unit to its own option set This is the first step towards deprecating it. --- nixos/modules/module-list.nix | 1 + .../services/display-managers/default.nix | 66 +-------------- .../modules/services/display-managers/gdm.nix | 43 +++++----- .../services/display-managers/generic.nix | 83 +++++++++++++++++++ .../services/display-managers/lemurs.nix | 5 +- .../modules/services/display-managers/ly.nix | 5 +- .../services/display-managers/sddm.nix | 5 +- nixos/modules/services/ttys/getty.nix | 8 +- .../services/x11/display-managers/lightdm.nix | 8 +- .../services/x11/display-managers/xpra.nix | 3 +- nixos/modules/services/x11/xserver.nix | 33 +------- 11 files changed, 134 insertions(+), 126 deletions(-) create mode 100644 nixos/modules/services/display-managers/generic.nix diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index f9adc3f3230f..f0063202b065 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -611,6 +611,7 @@ ./services/display-managers/default.nix ./services/display-managers/dms-greeter.nix ./services/display-managers/gdm.nix + ./services/display-managers/generic.nix ./services/display-managers/greetd.nix ./services/display-managers/lemurs.nix ./services/display-managers/ly.nix diff --git a/nixos/modules/services/display-managers/default.nix b/nixos/modules/services/display-managers/default.nix index 800a10f17d80..90b542ee355d 100644 --- a/nixos/modules/services/display-managers/default.nix +++ b/nixos/modules/services/display-managers/default.nix @@ -40,26 +40,7 @@ in { options = { services.displayManager = { - enable = lib.mkEnableOption "systemd's display-manager service"; - - preStart = lib.mkOption { - type = lib.types.lines; - default = ""; - example = "rm -f /var/log/my-display-manager.log"; - description = "Script executed before the display manager is started."; - }; - - execCmd = lib.mkOption { - type = lib.types.str; - example = lib.literalExpression ''"''${pkgs.lightdm}/bin/lightdm"''; - description = "Command to start the display manager."; - }; - - environment = lib.mkOption { - type = with lib.types; attrsOf unspecified; - default = { }; - description = "Additional environment variables needed by the display manager."; - }; + enable = lib.mkEnableOption "shared display manager integration"; hiddenUsers = lib.mkOption { type = with lib.types; listOf str; @@ -250,50 +231,5 @@ in else null; }; - - # so that the service won't be enabled when only startx is used - systemd.services.display-manager.enable = - let - dmConf = config.services.xserver.displayManager; - noDmUsed = - !( - cfg.gdm.enable - || cfg.sddm.enable - || dmConf.xpra.enable - || dmConf.lightdm.enable - || cfg.ly.enable - || cfg.lemurs.enable - ); - in - lib.mkIf noDmUsed (lib.mkDefault false); - - systemd.services.display-manager = { - description = "Display Manager"; - after = [ - "acpid.service" - "systemd-logind.service" - "systemd-user-sessions.service" - "autovt@tty1.service" - ]; - conflicts = [ - "autovt@tty1.service" - ]; - restartIfChanged = false; - - environment = cfg.environment; - - preStart = cfg.preStart; - script = lib.mkIf (config.systemd.services.display-manager.enable == true) cfg.execCmd; - - # Stop restarting if the display manager stops (crashes) 2 times - # in one minute. Starting X typically takes 3-4s. - startLimitIntervalSec = 30; - startLimitBurst = 3; - serviceConfig = { - Restart = "always"; - RestartSec = "200ms"; - SyslogIdentifier = "display-manager"; - }; - }; }; } diff --git a/nixos/modules/services/display-managers/gdm.nix b/nixos/modules/services/display-managers/gdm.nix index 41f184b94f62..e46c8cf72fe7 100644 --- a/nixos/modules/services/display-managers/gdm.nix +++ b/nixos/modules/services/display-managers/gdm.nix @@ -217,27 +217,30 @@ in # Enable desktop session data enable = true; - environment = { - GDM_X_SERVER_EXTRA_ARGS = toString (lib.filter (arg: arg != "-terminate") xdmcfg.xserverArgs); - XDG_DATA_DIRS = lib.makeSearchPath "share" [ - gdm # for gnome-login.session - config.services.displayManager.sessionData.desktops - pkgs.gnome-control-center # for accessibility icon - pkgs.adwaita-icon-theme - pkgs.hicolor-icon-theme # empty icon theme as a base - ]; - } - // lib.optionalAttrs (xSessionWrapper != null) { - # Make GDM use this wrapper before running the session, which runs the - # configured setupCommands. This relies on a patched GDM which supports - # this environment variable. - GDM_X_SESSION_WRAPPER = "${xSessionWrapper}"; + generic = { + enable = true; + environment = { + GDM_X_SERVER_EXTRA_ARGS = toString (lib.filter (arg: arg != "-terminate") xdmcfg.xserverArgs); + XDG_DATA_DIRS = lib.makeSearchPath "share" [ + gdm # for gnome-login.session + config.services.displayManager.sessionData.desktops + pkgs.gnome-control-center # for accessibility icon + pkgs.adwaita-icon-theme + pkgs.hicolor-icon-theme # empty icon theme as a base + ]; + } + // lib.optionalAttrs (xSessionWrapper != null) { + # Make GDM use this wrapper before running the session, which runs the + # configured setupCommands. This relies on a patched GDM which supports + # this environment variable. + GDM_X_SESSION_WRAPPER = "${xSessionWrapper}"; + }; + execCmd = "exec ${gdm}/bin/gdm"; + preStart = lib.optionalString (defaultSessionName != null) '' + # Set default session in session chooser to a specified values – basically ignore session history. + ${setSessionScript}/bin/set-session ${config.services.displayManager.sessionData.autologinSession} + ''; }; - execCmd = "exec ${gdm}/bin/gdm"; - preStart = lib.optionalString (defaultSessionName != null) '' - # Set default session in session chooser to a specified values – basically ignore session history. - ${setSessionScript}/bin/set-session ${config.services.displayManager.sessionData.autologinSession} - ''; }; systemd.tmpfiles.rules = [ diff --git a/nixos/modules/services/display-managers/generic.nix b/nixos/modules/services/display-managers/generic.nix new file mode 100644 index 000000000000..59daa7f8f8bc --- /dev/null +++ b/nixos/modules/services/display-managers/generic.nix @@ -0,0 +1,83 @@ +{ config, lib, ... }: +let + cfg = config.services.displayManager.generic; +in +{ + imports = [ + (lib.mkRenamedOptionModule + [ "services" "displayManager" "preStart" ] + [ "services" "displayManager" "generic" "preStart" ] + ) + (lib.mkRenamedOptionModule + [ "services" "displayManager" "execCmd" ] + [ "services" "displayManager" "generic" "execCmd" ] + ) + (lib.mkRenamedOptionModule + [ "services" "displayManager" "environment" ] + [ "services" "displayManager" "generic" "environment" ] + ) + ]; + + options = { + services.displayManager.generic = { + enable = lib.mkEnableOption "generic display manager integration - deprecated"; + + preStart = lib.mkOption { + type = lib.types.lines; + default = ""; + example = "rm -f /var/log/my-display-manager.log"; + description = "Script executed before the display manager is started."; + }; + + execCmd = lib.mkOption { + type = lib.types.nullOr lib.types.str; + default = null; + example = lib.literalExpression ''"''${pkgs.lightdm}/bin/lightdm"''; + description = "Command to start the display manager."; + }; + + environment = lib.mkOption { + type = with lib.types; attrsOf unspecified; + default = { }; + description = "Additional environment variables needed by the display manager."; + }; + }; + }; + config = lib.mkIf (cfg.enable || cfg.execCmd != null) { + warnings = [ + (lib.mkIf (!cfg.enable) '' + Enabling display-manager.service implicitly due to `services.displayManager.generic.execCmd` being set; this will be removed eventually. + Please set `services.displayManager.generic.enable` explicitly, or switch your display manager to use upstream systemd units (preferred). + '') + ]; + + systemd.services.display-manager = { + description = "Display Manager"; + after = [ + "acpid.service" + "systemd-logind.service" + "systemd-user-sessions.service" + "autovt@tty1.service" + ]; + conflicts = [ + "autovt@tty1.service" + ]; + restartIfChanged = false; + + environment = cfg.environment; + + preStart = cfg.preStart; + script = cfg.execCmd; + + # Stop restarting if the display manager stops (crashes) 2 times + # in one minute. Starting X typically takes 3-4s. + startLimitIntervalSec = 30; + startLimitBurst = 3; + serviceConfig = { + Restart = "always"; + RestartSec = "200ms"; + SyslogIdentifier = "display-manager"; + }; + }; + }; +} diff --git a/nixos/modules/services/display-managers/lemurs.nix b/nixos/modules/services/display-managers/lemurs.nix index fdf9458b6d5c..6f614e5f74f0 100644 --- a/nixos/modules/services/display-managers/lemurs.nix +++ b/nixos/modules/services/display-managers/lemurs.nix @@ -76,7 +76,10 @@ in }; displayManager = { enable = true; - execCmd = "exec ${lib.getExe cfg.package} --config ${settingsFormat.generate "config.toml" cfg.settings}"; + generic = { + enable = true; + execCmd = "exec ${lib.getExe cfg.package} --config ${settingsFormat.generate "config.toml" cfg.settings}"; + }; # set default settings lemurs.settings = let diff --git a/nixos/modules/services/display-managers/ly.nix b/nixos/modules/services/display-managers/ly.nix index d9505c440a43..2efeaeebcbc1 100644 --- a/nixos/modules/services/display-managers/ly.nix +++ b/nixos/modules/services/display-managers/ly.nix @@ -107,7 +107,10 @@ in displayManager = { enable = true; - execCmd = "exec /run/current-system/sw/bin/ly"; + generic = { + enable = true; + execCmd = "exec /run/current-system/sw/bin/ly"; + }; # Set this here instead of 'defaultConfig' so users get eval # errors when they change it. diff --git a/nixos/modules/services/display-managers/sddm.nix b/nixos/modules/services/display-managers/sddm.nix index af7600ec5f66..2125abbbadce 100644 --- a/nixos/modules/services/display-managers/sddm.nix +++ b/nixos/modules/services/display-managers/sddm.nix @@ -361,7 +361,10 @@ in services.displayManager = { enable = true; - execCmd = "exec /run/current-system/sw/bin/sddm"; + generic = { + enable = true; + execCmd = "exec /run/current-system/sw/bin/sddm"; + }; }; security.pam.services = { diff --git a/nixos/modules/services/ttys/getty.nix b/nixos/modules/services/ttys/getty.nix index 6c9932b15887..01d2858602b6 100644 --- a/nixos/modules/services/ttys/getty.nix +++ b/nixos/modules/services/ttys/getty.nix @@ -151,11 +151,9 @@ in # We can't just rely on 'Conflicts=autovt@tty1.service' because # 'switch-to-configuration switch' will start 'autovt@tty1.service' # and kill the display manager. - systemd.targets.getty.wants = - lib.mkIf (!(config.systemd.services.display-manager.enable or false)) - [ - "autovt@tty1.service" - ]; + systemd.targets.getty.wants = lib.mkIf (!config.services.displayManager.enable) [ + "autovt@tty1.service" + ]; systemd.services."getty@" = { serviceConfig.ExecStart = [ diff --git a/nixos/modules/services/x11/display-managers/lightdm.nix b/nixos/modules/services/x11/display-managers/lightdm.nix index 363bdbbc92cc..1ace9c1b8c1f 100644 --- a/nixos/modules/services/x11/display-managers/lightdm.nix +++ b/nixos/modules/services/x11/display-managers/lightdm.nix @@ -215,22 +215,24 @@ in # Set default session in session chooser to a specified values – basically ignore session history. # Auto-login is already covered by a config value. - services.displayManager.preStart = + services.displayManager.generic.preStart = optionalString (!dmcfg.autoLogin.enable && dmcfg.defaultSession != null) '' ${setSessionScript}/bin/set-session ${dmcfg.defaultSession} ''; # setSessionScript needs session-files in XDG_DATA_DIRS - services.displayManager.environment.XDG_DATA_DIRS = "${dmcfg.sessionData.desktops}/share/"; + services.displayManager.generic.environment.XDG_DATA_DIRS = "${dmcfg.sessionData.desktops}/share/"; # setSessionScript wants AccountsService systemd.services.display-manager.wants = [ "accounts-daemon.service" ]; + services.displayManager.generic.enable = true; + # lightdm relaunches itself via just `lightdm`, so needs to be on the PATH - services.displayManager.execCmd = '' + services.displayManager.generic.execCmd = '' export PATH=${lightdm}/sbin:$PATH exec ${lightdm}/sbin/lightdm ''; diff --git a/nixos/modules/services/x11/display-managers/xpra.nix b/nixos/modules/services/x11/display-managers/xpra.nix index 54cf5733607b..d7d31e6fc428 100644 --- a/nixos/modules/services/x11/display-managers/xpra.nix +++ b/nixos/modules/services/x11/display-managers/xpra.nix @@ -300,7 +300,8 @@ in VideoRam 192000 ''; - services.displayManager.execCmd = '' + services.displayManager.generic.enable = true; + services.displayManager.generic.execCmd = '' ${optionalString (cfg.pulseaudio) "export PULSE_COOKIE=/run/pulse/.config/pulse/cookie"} exec ${pkgs.xpra}/bin/xpra ${ if cfg.desktop == null then "start" else "start-desktop --start=${cfg.desktop}" diff --git a/nixos/modules/services/x11/xserver.nix b/nixos/modules/services/x11/xserver.nix index 33343b5b54fd..25a472095370 100644 --- a/nixos/modules/services/x11/xserver.nix +++ b/nixos/modules/services/x11/xserver.nix @@ -849,35 +849,10 @@ in environment.pathsToLink = [ "/share/X11" ]; - systemd.services.display-manager = { - description = "Display Manager"; - - after = [ - "acpid.service" - "systemd-logind.service" - "systemd-user-sessions.service" - ]; - - restartIfChanged = false; - - environment = config.services.displayManager.environment; - - preStart = '' - ${config.services.displayManager.preStart} - - rm -f /tmp/.X0-lock - ''; - - # Stop restarting if the display manager stops (crashes) 2 times - # in one minute. Starting X typically takes 3-4s. - startLimitIntervalSec = 30; - startLimitBurst = 3; - serviceConfig = { - Restart = "always"; - RestartSec = "200ms"; - SyslogIdentifier = "display-manager"; - }; - }; + # FIXME: what + services.displayManager.generic.preStart = '' + rm -f /tmp/.X0-lock + ''; services.xserver.displayManager.xserverArgs = [ "-config ${configFile}"