nixos/gnome & nixos/gdm: move out of x11

Since DEs like KDE Plasma 6, GNOME and COSMIC are not designed to be X11-exclusive, putting them under `services.xserver` is misleading. In particular, GNOME defaults to Wayland these days and X11 support is going to be dropped in near future.

Let’s follow Plasma and move GNOME NixOS options out of `xserver` attribute.

This patch does not include any changes to X11 support itself.

Signed-off-by: John Titor <50095635+JohnRTitor@users.noreply.github.com>
This commit is contained in:
hand7s 2025-05-28 14:27:36 +03:00 committed by GitHub
parent bfbf67f8bb
commit c464c44a42
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 134 additions and 72 deletions

2
.github/labeler.yml vendored
View file

@ -162,7 +162,7 @@
- any-glob-to-any-file:
- doc/languages-frameworks/gnome.section.md
- nixos/modules/services/desktops/gnome/**/*
- nixos/modules/services/x11/desktop-managers/gnome.nix
- nixos/modules/services/desktop-managers/gnome.nix
- nixos/tests/gnome-xorg.nix
- nixos/tests/gnome.nix
- pkgs/desktops/gnome/**/*

View file

@ -29,7 +29,7 @@ Thus you should pick one or more of the following lines:
{
services.xserver.desktopManager.plasma5.enable = true;
services.xserver.desktopManager.xfce.enable = true;
services.xserver.desktopManager.gnome.enable = true;
services.desktopManager.gnome.enable = true;
services.xserver.desktopManager.mate.enable = true;
services.xserver.windowManager.xmonad.enable = true;
services.xserver.windowManager.twm.enable = true;
@ -46,7 +46,7 @@ alternative one by picking one of the following lines:
```nix
{
services.displayManager.sddm.enable = true;
services.xserver.displayManager.gdm.enable = true;
services.displayManager.gdm.enable = true;
}
```

View file

@ -20,7 +20,7 @@ Alongside many enhancements to NixOS modules and general system improvements, th
- GNOME has been updated to version 48.
- `decibels` music player is now installed by default. You can disable it using [](#opt-environment.gnome.excludePackages).
- `gnome-shell-extensions` extension collection (which included GNOME Classic extensions, Apps Menu, and User Themes, among others) are no longer installed by default. You can install them again with [](#opt-services.xserver.desktopManager.gnome.sessionPath).
- `gnome-shell-extensions` extension collection (which included GNOME Classic extensions, Apps Menu, and User Themes, among others) are no longer installed by default. You can install them again with {option}`services.xserver.desktopManager.gnome.sessionPath`.
- Option [](#opt-services.gnome.core-developer-tools.enable) now also installs `sysprof` and `d-spy`.
- Option `services.gnome.core-utilities.enable` has been renamed to [](#opt-services.gnome.core-apps.enable).
- `cantarell-fonts`, `source-code-pro` and `source-sans` fonts are no longer installed by default. They have been replaced by `adwaita-fonts`.

View file

@ -7,7 +7,7 @@
isoImage.edition = lib.mkDefault "gnome";
services.xserver.desktopManager.gnome = {
services.desktopManager.gnome = {
# Add Firefox and other tools useful for installation to the launcher
favoriteAppsOverride = ''
[org.gnome.shell]
@ -35,7 +35,7 @@
QT_QPA_PLATFORM = "$([[ $XDG_SESSION_TYPE = \"wayland\" ]] && echo \"wayland\")";
};
services.xserver.displayManager.gdm = {
services.displayManager.gdm = {
enable = true;
# autoSuspend makes the machine automatically suspend after inactivity.
# It's possible someone could/try to ssh'd into the machine and obviously

View file

@ -7,7 +7,7 @@
isoImage.edition = lib.mkDefault "gnome";
services.xserver.desktopManager.gnome = {
services.desktopManager.gnome = {
# Add Firefox and other tools useful for installation to the launcher
favoriteAppsOverride = ''
[org.gnome.shell]
@ -16,7 +16,7 @@
enable = true;
};
services.xserver.displayManager.gdm = {
services.displayManager.gdm = {
enable = true;
# autoSuspend makes the machine automatically suspend after inactivity.
# It's possible someone could/try to ssh'd into the machine and obviously

View file

@ -589,6 +589,7 @@
./services/development/zammad.nix
./services/display-managers/cosmic-greeter.nix
./services/display-managers/default.nix
./services/display-managers/gdm.nix
./services/display-managers/greetd.nix
./services/display-managers/ly.nix
./services/display-managers/sddm.nix
@ -1706,7 +1707,6 @@
./services/x11/colord.nix
./services/x11/desktop-managers/default.nix
./services/x11/display-managers/default.nix
./services/x11/display-managers/gdm.nix
./services/x11/display-managers/lightdm.nix
./services/x11/display-managers/slim.nix
./services/x11/display-managers/startx.nix

View file

@ -27,7 +27,7 @@
services.dbus.packages = [ pkgs.gpaste ];
systemd.packages = [ pkgs.gpaste ];
# gnome-control-center crashes in Keyboard Shortcuts pane without the GSettings schemas.
services.xserver.desktopManager.gnome.sessionPath = [ pkgs.gpaste ];
services.desktopManager.gnome.sessionPath = [ pkgs.gpaste ];
# gpaste-reloaded applet doesn't work without the typelib
services.xserver.desktopManager.cinnamon.sessionPath = [ pkgs.gpaste ];
};

View file

@ -28,7 +28,7 @@ in
nautilus-open-any-terminal
];
environment.sessionVariables = lib.mkIf (!config.services.xserver.desktopManager.gnome.enable) {
environment.sessionVariables = lib.mkIf (!config.services.desktopManager.gnome.enable) {
NAUTILUS_4_EXTENSION_DIR = "${pkgs.nautilus-python}/lib/nautilus/extensions-4";
};

View file

@ -33,7 +33,7 @@
# Support GNOME desktop environment if it's enabled on the system.
gnomeXdgDesktopPortalSupport =
prev.gnomeXdgDesktopPortalSupport or config.services.xserver.desktopManager.gnome.enable;
prev.gnomeXdgDesktopPortalSupport or config.services.desktopManager.gnome.enable;
# Support Hyprland desktop for Wayland if it's enabled on the system.
hyprlandXdgDesktopPortalSupport =

View file

@ -10,8 +10,8 @@ To enable the GNOME desktop use:
```nix
{
services.xserver.desktopManager.gnome.enable = true;
services.xserver.displayManager.gdm.enable = true;
services.desktopManager.gnome.enable = true;
services.displayManager.gdm.enable = true;
}
```
@ -76,17 +76,17 @@ GNOME Flashback provides a desktop environment based on the classic GNOME 2 arch
```nix
{
services.xserver.desktopManager.gnome.flashback.enableMetacity = true;
services.desktopManager.gnome.flashback.enableMetacity = true;
}
```
It is also possible to create custom sessions that replace Metacity with a different window manager using [](#opt-services.xserver.desktopManager.gnome.flashback.customSessions).
It is also possible to create custom sessions that replace Metacity with a different window manager using [](#opt-services.desktopManager.gnome.flashback.customSessions).
The following example uses `xmonad` window manager:
```nix
{
services.xserver.desktopManager.gnome.flashback.customSessions = [
services.desktopManager.gnome.flashback.customSessions = [
{
wmName = "xmonad";
wmLabel = "XMonad";
@ -143,10 +143,10 @@ Overrides really only change the default values for GSettings keys so if you or
:::
You can override the default GSettings values using the
[](#opt-services.xserver.desktopManager.gnome.extraGSettingsOverrides) option.
[](#opt-services.desktopManager.gnome.extraGSettingsOverrides) option.
Take note that whatever packages you want to override GSettings for, you need to add them to
[](#opt-services.xserver.desktopManager.gnome.extraGSettingsOverridePackages).
[](#opt-services.desktopManager.gnome.extraGSettingsOverridePackages).
You can use `dconf-editor` tool to explore which GSettings you can set.
@ -154,7 +154,7 @@ You can use `dconf-editor` tool to explore which GSettings you can set.
```nix
{
services.xserver.desktopManager.gnome = {
services.desktopManager.gnome = {
extraGSettingsOverrides = ''
# Change default background
[org.gnome.desktop.background]

View file

@ -15,7 +15,7 @@ let
literalExpression
;
cfg = config.services.xserver.desktopManager.gnome;
cfg = config.services.desktopManager.gnome;
serviceCfg = config.services.gnome;
# Prioritize nautilus by default when opening directories
@ -78,13 +78,45 @@ let
in
{
meta = {
doc = ./gnome.md;
maintainers = lib.teams.gnome.members;
};
imports = [
(lib.mkRenamedOptionModule
[ "services" "xserver" "desktopManager" "gnome" "enable" ]
[ "services" "desktopManager" "gnome" "enable" ]
)
(lib.mkRenamedOptionModule
[ "services" "xserver" "desktopManager" "gnome" "extraGSettingsOverrides" ]
[ "services" "desktopManager" "gnome" "extraGSettingsOverrides" ]
)
(lib.mkRenamedOptionModule
[ "services" "xserver" "desktopManager" "gnome" "extraGSettingsOverridePackages" ]
[ "services" "desktopManager" "gnome" "extraGSettingsOverridePackages" ]
)
(lib.mkRenamedOptionModule
[ "services" "xserver" "desktopManager" "gnome" "debug" ]
[ "services" "desktopManager" "gnome" "debug" ]
)
(lib.mkRenamedOptionModule
[ "services" "xserver" "desktopManager" "gnome" "sessionPath" ]
[ "services" "desktopManager" "gnome" "sessionPath" ]
)
# flashback options
(lib.mkRenamedOptionModule
[ "services" "xserver" "desktopManager" "gnome" "flashback" "customSessions" ]
[ "services" "desktopManager" "gnome" "flashback" "customSessions" ]
)
(lib.mkRenamedOptionModule
[ "services" "xserver" "desktopManager" "gnome" "flashback" "enableMetacity" ]
[ "services" "desktopManager" "gnome" "flashback" "enableMetacity" ]
)
(lib.mkRenamedOptionModule
[ "services" "xserver" "desktopManager" "gnome" "flashback" "panelModulePackages" ]
[ "services" "desktopManager" "gnome" "flashback" "panelModulePackages" ]
)
(lib.mkRenamedOptionModule
[ "services" "gnome" "core-utilities" "enable" ]
[ "services" "gnome" "core-apps" "enable" ]
@ -101,7 +133,7 @@ in
games.enable = mkEnableOption "GNOME games";
};
services.xserver.desktopManager.gnome = {
services.desktopManager.gnome = {
enable = mkOption {
type = types.bool;
default = false;
@ -213,8 +245,8 @@ in
system.nixos-generate-config.desktopConfiguration = [
''
# Enable the GNOME Desktop Environment.
services.xserver.displayManager.gdm.enable = true;
services.xserver.desktopManager.gnome.enable = true;
services.displayManager.gdm.enable = true;
services.desktopManager.gnome.enable = true;
''
];
@ -333,7 +365,7 @@ in
})
(lib.mkIf serviceCfg.core-shell.enable {
services.xserver.desktopManager.gnome.sessionPath = [
services.desktopManager.gnome.sessionPath = [
pkgs.gnome-shell
];

View file

@ -257,7 +257,7 @@ in
dmConf = config.services.xserver.displayManager;
noDmUsed =
!(
dmConf.gdm.enable || cfg.sddm.enable || dmConf.xpra.enable || dmConf.lightdm.enable || cfg.ly.enable
cfg.gdm.enable || cfg.sddm.enable || dmConf.xpra.enable || dmConf.lightdm.enable || cfg.ly.enable
);
in
lib.mkIf noDmUsed (lib.mkDefault false);

View file

@ -7,19 +7,20 @@
let
cfg = config.services.xserver.displayManager;
cfg = config.services.displayManager.gdm;
gdm = pkgs.gdm;
xdmcfg = config.services.xserver.displayManager;
pamLogin = config.security.pam.services.login;
settingsFormat = pkgs.formats.ini { };
configFile = settingsFormat.generate "custom.conf" cfg.gdm.settings;
configFile = settingsFormat.generate "custom.conf" cfg.settings;
xSessionWrapper =
if (cfg.setupCommands == "") then
if (xdmcfg.setupCommands == "") then
null
else
pkgs.writeScript "gdm-x-session-wrapper" ''
#!${pkgs.bash}/bin/bash
${cfg.setupCommands}
${xdmcfg.setupCommands}
exec "$@"
'';
@ -41,7 +42,7 @@ let
defaultSessionName = config.services.displayManager.defaultSession;
setSessionScript = pkgs.callPackage ./account-service-util.nix { };
setSessionScript = pkgs.callPackage ../x11/display-managers/account-service-util.nix { };
in
{
@ -72,6 +73,35 @@ in
"gdm"
"nvidiaWayland"
] "We defer to GDM whether Wayland should be enabled.")
(lib.mkRenamedOptionModule
[ "services" "xserver" "displayManager" "gdm" "enable" ]
[ "services" "displayManager" "gdm" "enable" ]
)
(lib.mkRenamedOptionModule
[ "services" "xserver" "displayManager" "gdm" "debug" ]
[ "services" "displayManager" "gdm" "debug" ]
)
(lib.mkRenamedOptionModule
[ "services" "xserver" "displayManager" "gdm" "banner" ]
[ "services" "displayManager" "gdm" "banner" ]
)
(lib.mkRenamedOptionModule
[ "services" "xserver" "displayManager" "gdm" "settings" ]
[ "services" "displayManager" "gdm" "settings" ]
)
(lib.mkRenamedOptionModule
[ "services" "xserver" "displayManager" "gdm" "wayland" ]
[ "services" "displayManager" "gdm" "wayland" ]
)
(lib.mkRenamedOptionModule
[ "services" "xserver" "displayManager" "gdm" "autoSuspend" ]
[ "services" "displayManager" "gdm" "autoSuspend" ]
)
(lib.mkRenamedOptionModule
[ "services" "xserver" "displayManager" "gdm" "autoLogin" "delay" ]
[ "services" "displayManager" "gdm" "autoLogin" "delay" ]
)
];
meta = {
@ -82,7 +112,7 @@ in
options = {
services.xserver.displayManager.gdm = {
services.displayManager.gdm = {
enable = lib.mkEnableOption "GDM, the GNOME Display Manager";
@ -145,7 +175,7 @@ in
###### implementation
config = lib.mkIf cfg.gdm.enable {
config = lib.mkIf cfg.enable {
services.xserver.displayManager.lightdm.enable = false;
@ -170,7 +200,7 @@ in
environment =
{
GDM_X_SERVER_EXTRA_ARGS = toString (lib.filter (arg: arg != "-terminate") cfg.xserverArgs);
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
@ -274,7 +304,7 @@ in
systemd.user.services.dbus.wantedBy = [ "default.target" ];
programs.dconf.profiles.gdm.databases =
lib.optionals (!cfg.gdm.autoSuspend) [
lib.optionals (!cfg.autoSuspend) [
{
settings."org/gnome/settings-daemon/plugins/power" = {
sleep-inactive-ac-type = "nothing";
@ -284,11 +314,11 @@ in
};
}
]
++ lib.optionals (cfg.gdm.banner != null) [
++ lib.optionals (cfg.banner != null) [
{
settings."org/gnome/login-screen" = {
banner-message-enable = true;
banner-message-text = cfg.gdm.banner;
banner-message-text = cfg.banner;
};
}
]
@ -297,21 +327,21 @@ in
# Use AutomaticLogin if delay is zero, because it's immediate.
# Otherwise with TimedLogin with zero seconds the prompt is still
# presented and there's a little delay.
services.xserver.displayManager.gdm.settings = {
services.displayManager.gdm.settings = {
daemon = lib.mkMerge [
{ WaylandEnable = cfg.gdm.wayland; }
{ WaylandEnable = cfg.wayland; }
# nested if else didn't work
(lib.mkIf (config.services.displayManager.autoLogin.enable && cfg.gdm.autoLogin.delay != 0) {
(lib.mkIf (config.services.displayManager.autoLogin.enable && cfg.autoLogin.delay != 0) {
TimedLoginEnable = true;
TimedLogin = config.services.displayManager.autoLogin.user;
TimedLoginDelay = cfg.gdm.autoLogin.delay;
TimedLoginDelay = cfg.autoLogin.delay;
})
(lib.mkIf (config.services.displayManager.autoLogin.enable && cfg.gdm.autoLogin.delay == 0) {
(lib.mkIf (config.services.displayManager.autoLogin.enable && cfg.autoLogin.delay == 0) {
AutomaticLoginEnable = true;
AutomaticLogin = config.services.displayManager.autoLogin.user;
})
];
debug = lib.mkIf cfg.gdm.debug {
debug = lib.mkIf cfg.debug {
Enable = true;
};
};

View file

@ -31,7 +31,6 @@ in
./lumina.nix
./lxqt.nix
./enlightenment.nix
./gnome.nix
./retroarch.nix
./kodi.nix
./mate.nix
@ -43,6 +42,7 @@ in
./deepin.nix
../../desktop-managers/lomiri.nix
../../desktop-managers/cosmic.nix
../../desktop-managers/gnome.nix
];
options = {

View file

@ -17,7 +17,7 @@ with lib;
services.xserver.videoDrivers = [ ];
# Enable GDM. Any display manager will do as long as it supports XDMCP.
services.xserver.displayManager.gdm.enable = true;
services.displayManager.gdm.enable = true;
systemd.sockets.terminal-server = {
description = "Terminal Server Socket";

View file

@ -761,7 +761,7 @@ in
dmConf = cfg.displayManager;
default =
!(
dmConf.gdm.enable
config.services.displayManager.gdm.enable
|| config.services.displayManager.sddm.enable
|| dmConf.xpra.enable
|| dmConf.sx.enable

View file

@ -610,8 +610,8 @@ rec {
{ ... }:
{
services.xserver.enable = true;
services.xserver.displayManager.gdm.enable = true;
services.xserver.desktopManager.gnome.enable = true;
services.displayManager.gdm.enable = true;
services.desktopManager.gnome.enable = true;
}
);

View file

@ -34,8 +34,8 @@
};
# Configure Gnome
services.xserver.desktopManager.gnome.enable = true;
services.xserver.desktopManager.gnome.debug = true;
services.desktopManager.gnome.enable = true;
services.desktopManager.gnome.debug = true;
systemd.user.services = {
"org.gnome.Shell@wayland" = {

View file

@ -14,9 +14,9 @@
services.xserver.enable = true;
services.xserver.displayManager = {
gdm.enable = true;
gdm.debug = true;
services.displayManager.gdm = {
enable = true;
debug = true;
};
services.displayManager.autoLogin = {
@ -24,9 +24,9 @@
user = user.name;
};
services.xserver.desktopManager.gnome.enable = true;
services.xserver.desktopManager.gnome.debug = true;
services.xserver.desktopManager.gnome.flashback.enableMetacity = true;
services.desktopManager.gnome.enable = true;
services.desktopManager.gnome.debug = true;
services.desktopManager.gnome.flashback.enableMetacity = true;
services.displayManager.defaultSession = "gnome-flashback-metacity";
};

View file

@ -16,9 +16,9 @@
services.xserver.enable = true;
services.xserver.displayManager = {
gdm.enable = true;
gdm.debug = true;
services.displayManager.gdm = {
enable = true;
debug = true;
};
services.displayManager.autoLogin = {
@ -26,8 +26,8 @@
user = user.name;
};
services.xserver.desktopManager.gnome.enable = true;
services.xserver.desktopManager.gnome.debug = true;
services.desktopManager.gnome.enable = true;
services.desktopManager.gnome.debug = true;
services.displayManager.defaultSession = "gnome-xorg";
systemd.user.services = {

View file

@ -11,9 +11,9 @@
services.xserver.enable = true;
services.xserver.displayManager = {
gdm.enable = true;
gdm.debug = true;
services.displayManager.gdm = {
enable = true;
debug = true;
};
services.displayManager.autoLogin = {
@ -21,8 +21,8 @@
user = "alice";
};
services.xserver.desktopManager.gnome.enable = true;
services.xserver.desktopManager.gnome.debug = true;
services.desktopManager.gnome.enable = true;
services.desktopManager.gnome.debug = true;
systemd.user.services = {
"org.gnome.Shell@wayland" = {

View file

@ -15,8 +15,8 @@
system.nixos-generate-config.desktopConfiguration = [
''
# DESKTOP
services.xserver.displayManager.gdm.enable = true;
services.xserver.desktopManager.gnome.enable = true;
services.displayManager.gdm.enable = true;
services.desktopManager.gnome.enable = true;
''
];
};
@ -40,7 +40,7 @@
# Test if the Perl variable $desktopConfiguration is spliced correctly
machine.succeed(
"grep 'services\\.xserver\\.desktopManager\\.gnome\\.enable = true;' /etc/nixos/configuration.nix"
"grep 'services\\.desktopManager\\.gnome\\.enable = true;' /etc/nixos/configuration.nix"
)
machine.succeed("rm -rf /etc/nixos")

View file

@ -115,7 +115,7 @@ stdenv.mkDerivation (finalAttrs: {
})
# The following patches implement certain environment variables in GDM which are set by
# the gdm configuration module (nixos/modules/services/x11/display-managers/gdm.nix).
# the gdm configuration module (gdm.nix).
./gdm-x-session_extra_args.patch

View file

@ -74,7 +74,7 @@ stdenv.mkDerivation rec {
libcryptui
];
services.xserver.desktopManager.gnome.extraGSettingsOverridePackages = with pkgs; [
services.desktopManager.gnome.extraGSettingsOverridePackages = with pkgs; [
nemo
gcr
libcryptui