nixos/displayManager: deprecate separate options for default wm/dm
The upstream session files display managers use have no concept of sessions being composed from desktop manager and window manager. To be able to set upstream session files as default session, we need a single option. Having two different ways to set default session would be confusing, though, so we decided to deprecate the old method. We also created separate script for each session, just like we already had a separate desktop file for each one, and started using displayManager.sessionPackages mechanism to make the session handling more uniform.
This commit is contained in:
parent
53ef29c138
commit
8dc5ff7dcf
|
@ -83,8 +83,7 @@
|
||||||
desktop environment. If you wanted no desktop environment and i3 as your your
|
desktop environment. If you wanted no desktop environment and i3 as your your
|
||||||
window manager, you'd define:
|
window manager, you'd define:
|
||||||
<programlisting>
|
<programlisting>
|
||||||
<xref linkend="opt-services.xserver.desktopManager.default"/> = "none";
|
<xref linkend="opt-services.xserver.displayManager.defaultSession"/> = "none+i3";
|
||||||
<xref linkend="opt-services.xserver.windowManager.default"/> = "i3";
|
|
||||||
</programlisting>
|
</programlisting>
|
||||||
And, finally, to enable auto-login for a user <literal>johndoe</literal>:
|
And, finally, to enable auto-login for a user <literal>johndoe</literal>:
|
||||||
<programlisting>
|
<programlisting>
|
||||||
|
|
|
@ -7,9 +7,8 @@
|
||||||
<para>
|
<para>
|
||||||
To enable the Xfce Desktop Environment, set
|
To enable the Xfce Desktop Environment, set
|
||||||
<programlisting>
|
<programlisting>
|
||||||
<link linkend="opt-services.xserver.desktopManager.default">services.xserver.desktopManager</link> = {
|
<xref linkend="opt-services.xserver.desktopManager.xfce.enable" /> = true;
|
||||||
<link linkend="opt-services.xserver.desktopManager.xfce.enable">xfce.enable</link> = true;
|
<xref linkend="opt-services.xserver.displayManager.defaultSession" /> = "xfce";
|
||||||
<link linkend="opt-services.xserver.desktopManager.default">default</link> = "xfce";
|
|
||||||
};
|
};
|
||||||
</programlisting>
|
</programlisting>
|
||||||
</para>
|
</para>
|
||||||
|
|
|
@ -55,6 +55,19 @@
|
||||||
and adding a <option>--all</option> option which prints all options and their values.
|
and adding a <option>--all</option> option which prints all options and their values.
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<option>services.xserver.desktopManager.default</option> and <option>services.xserver.windowManager.default</option> options were replaced by a single <xref linkend="opt-services.xserver.displayManager.defaultSession"/> option to improve support for upstream session files. If you used something like:
|
||||||
|
<programlisting>
|
||||||
|
services.xserver.desktopManager.default = "xfce";
|
||||||
|
services.xserver.windowManager.default = "icewm";
|
||||||
|
</programlisting>
|
||||||
|
you should change it to:
|
||||||
|
<programlisting>
|
||||||
|
services.xserver.displayManager.defaultSession = "xfce+icewm";
|
||||||
|
</programlisting>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|
|
@ -262,9 +262,8 @@ in rec {
|
||||||
virtualisation.memorySize = 1024;
|
virtualisation.memorySize = 1024;
|
||||||
services.xserver.enable = true;
|
services.xserver.enable = true;
|
||||||
services.xserver.displayManager.auto.enable = true;
|
services.xserver.displayManager.auto.enable = true;
|
||||||
services.xserver.windowManager.default = "icewm";
|
services.xserver.displayManager.defaultSession = "none+icewm";
|
||||||
services.xserver.windowManager.icewm.enable = true;
|
services.xserver.windowManager.icewm.enable = true;
|
||||||
services.xserver.desktopManager.default = "none";
|
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
runInMachine ({
|
runInMachine ({
|
||||||
|
|
|
@ -249,9 +249,8 @@ in rec {
|
||||||
virtualisation.memorySize = 1024;
|
virtualisation.memorySize = 1024;
|
||||||
services.xserver.enable = true;
|
services.xserver.enable = true;
|
||||||
services.xserver.displayManager.auto.enable = true;
|
services.xserver.displayManager.auto.enable = true;
|
||||||
services.xserver.windowManager.default = "icewm";
|
services.xserver.displayManager.defaultSession = "none+icewm";
|
||||||
services.xserver.windowManager.icewm.enable = true;
|
services.xserver.windowManager.icewm.enable = true;
|
||||||
services.xserver.desktopManager.default = "none";
|
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
runInMachine ({
|
runInMachine ({
|
||||||
|
|
|
@ -86,22 +86,13 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
default = mkOption {
|
default = mkOption {
|
||||||
type = types.str;
|
type = types.nullOr types.str;
|
||||||
default = "";
|
default = null;
|
||||||
example = "none";
|
example = "none";
|
||||||
description = "Default desktop manager loaded if none have been chosen.";
|
description = ''
|
||||||
apply = defaultDM:
|
<emphasis role="strong">Deprecated</emphasis>, please use <xref linkend="opt-services.xserver.displayManager.defaultSession"/> instead.
|
||||||
if defaultDM == "" && cfg.session.list != [] then
|
|
||||||
(head cfg.session.list).name
|
Default desktop manager loaded if none have been chosen.
|
||||||
else if any (w: w.name == defaultDM) cfg.session.list then
|
|
||||||
defaultDM
|
|
||||||
else
|
|
||||||
throw ''
|
|
||||||
Default desktop manager (${defaultDM}) not found.
|
|
||||||
Probably you want to change
|
|
||||||
services.xserver.desktopManager.default = "${defaultDM}";
|
|
||||||
to one of
|
|
||||||
${concatMapStringsSep "\n " (w: "services.xserver.desktopManager.default = \"${w.name}\";") cfg.session.list}
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,8 @@ in
|
||||||
|
|
||||||
services.xserver.displayManager.lightdm.greeters.pantheon.enable = mkDefault true;
|
services.xserver.displayManager.lightdm.greeters.pantheon.enable = mkDefault true;
|
||||||
|
|
||||||
|
# Without this, Elementary LightDM greeter will pre-select non-existent `default` session
|
||||||
|
# https://github.com/elementary/greeter/issues/368
|
||||||
services.xserver.displayManager.defaultSession = "pantheon";
|
services.xserver.displayManager.defaultSession = "pantheon";
|
||||||
|
|
||||||
services.xserver.displayManager.sessionCommands = ''
|
services.xserver.displayManager.sessionCommands = ''
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
{ accountsservice
|
||||||
|
, glib
|
||||||
|
, gobject-introspection
|
||||||
|
, python3
|
||||||
|
, wrapGAppsHook
|
||||||
|
}:
|
||||||
|
|
||||||
|
python3.pkgs.buildPythonApplication {
|
||||||
|
name = "set-session";
|
||||||
|
|
||||||
|
format = "other";
|
||||||
|
|
||||||
|
src = ./set-session.py;
|
||||||
|
|
||||||
|
dontUnpack = true;
|
||||||
|
|
||||||
|
strictDeps = false;
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
wrapGAppsHook
|
||||||
|
gobject-introspection
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
accountsservice
|
||||||
|
glib
|
||||||
|
];
|
||||||
|
|
||||||
|
propagatedBuildInputs = with python3.pkgs; [
|
||||||
|
pygobject3
|
||||||
|
ordered-set
|
||||||
|
];
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
cp $src $out/bin/set-session
|
||||||
|
chmod +x $out/bin/set-session
|
||||||
|
'';
|
||||||
|
}
|
|
@ -27,16 +27,7 @@ let
|
||||||
Xft.hintstyle: hintslight
|
Xft.hintstyle: hintslight
|
||||||
'';
|
'';
|
||||||
|
|
||||||
mkCases = session:
|
# file provided by services.xserver.displayManager.sessionData.wrapper
|
||||||
concatStrings (
|
|
||||||
mapAttrsToList (name: starts: ''
|
|
||||||
(${name})
|
|
||||||
${concatMapStringsSep "\n " (n: n.start) starts}
|
|
||||||
;;
|
|
||||||
'') (lib.groupBy (n: n.name) session)
|
|
||||||
);
|
|
||||||
|
|
||||||
# file provided by services.xserver.displayManager.session.wrapper
|
|
||||||
xsessionWrapper = pkgs.writeScript "xsession-wrapper"
|
xsessionWrapper = pkgs.writeScript "xsession-wrapper"
|
||||||
''
|
''
|
||||||
#! ${pkgs.bash}/bin/bash
|
#! ${pkgs.bash}/bin/bash
|
||||||
|
@ -116,79 +107,19 @@ let
|
||||||
# Run the supplied session command. Remove any double quotes with eval.
|
# Run the supplied session command. Remove any double quotes with eval.
|
||||||
eval exec "$@"
|
eval exec "$@"
|
||||||
else
|
else
|
||||||
# Fall back to the default window/desktopManager
|
# TODO: Do we need this? Should not the session always exist?
|
||||||
exec ${cfg.displayManager.session.script}
|
echo "error: unknown session $1" 1>&2
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# file provided by services.xserver.displayManager.session.script
|
installedSessions = pkgs.runCommand "desktops"
|
||||||
xsession = wm: dm: pkgs.writeScript "xsession"
|
|
||||||
''
|
|
||||||
#! ${pkgs.bash}/bin/bash
|
|
||||||
|
|
||||||
# Legacy session script used to construct .desktop files from
|
|
||||||
# `services.xserver.displayManager.session` entries. Called from
|
|
||||||
# `sessionWrapper`.
|
|
||||||
|
|
||||||
# Expected parameters:
|
|
||||||
# $1 = <desktop-manager>+<window-manager>
|
|
||||||
|
|
||||||
# The first argument of this script is the session type.
|
|
||||||
sessionType="$1"
|
|
||||||
if [ "$sessionType" = default ]; then sessionType=""; fi
|
|
||||||
|
|
||||||
# The session type is "<desktop-manager>+<window-manager>", so
|
|
||||||
# extract those (see:
|
|
||||||
# http://wiki.bash-hackers.org/syntax/pe#substring_removal).
|
|
||||||
windowManager="''${sessionType##*+}"
|
|
||||||
: ''${windowManager:=${cfg.windowManager.default}}
|
|
||||||
desktopManager="''${sessionType%%+*}"
|
|
||||||
: ''${desktopManager:=${cfg.desktopManager.default}}
|
|
||||||
|
|
||||||
# Start the window manager.
|
|
||||||
case "$windowManager" in
|
|
||||||
${mkCases wm}
|
|
||||||
(*) echo "$0: Window manager '$windowManager' not found.";;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Start the desktop manager.
|
|
||||||
case "$desktopManager" in
|
|
||||||
${mkCases dm}
|
|
||||||
(*) echo "$0: Desktop manager '$desktopManager' not found.";;
|
|
||||||
esac
|
|
||||||
|
|
||||||
${optionalString cfg.updateDbusEnvironment ''
|
|
||||||
${lib.getBin pkgs.dbus}/bin/dbus-update-activation-environment --systemd --all
|
|
||||||
''}
|
|
||||||
|
|
||||||
test -n "$waitPID" && wait "$waitPID"
|
|
||||||
|
|
||||||
${config.systemd.package}/bin/systemctl --user stop graphical-session.target
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Desktop Entry Specification:
|
|
||||||
# - https://standards.freedesktop.org/desktop-entry-spec/latest/
|
|
||||||
# - https://standards.freedesktop.org/desktop-entry-spec/latest/ar01s06.html
|
|
||||||
mkDesktops = names: pkgs.runCommand "desktops"
|
|
||||||
{ # trivial derivation
|
{ # trivial derivation
|
||||||
preferLocalBuild = true;
|
preferLocalBuild = true;
|
||||||
allowSubstitutes = false;
|
allowSubstitutes = false;
|
||||||
}
|
}
|
||||||
''
|
''
|
||||||
mkdir -p "$out/share/xsessions"
|
mkdir -p "$out/share/"{xsessions,wayland-sessions}
|
||||||
${concatMapStrings (n: ''
|
|
||||||
cat - > "$out/share/xsessions/${n}.desktop" << EODESKTOP
|
|
||||||
[Desktop Entry]
|
|
||||||
Version=1.0
|
|
||||||
Type=XSession
|
|
||||||
TryExec=${cfg.displayManager.session.script}
|
|
||||||
Exec=${cfg.displayManager.session.script} "${n}"
|
|
||||||
Name=${n}
|
|
||||||
Comment=
|
|
||||||
EODESKTOP
|
|
||||||
'') names}
|
|
||||||
|
|
||||||
${concatMapStrings (pkg: ''
|
${concatMapStrings (pkg: ''
|
||||||
for n in ${concatStringsSep " " pkg.providedSessions}; do
|
for n in ${concatStringsSep " " pkg.providedSessions}; do
|
||||||
|
@ -204,12 +135,16 @@ let
|
||||||
${xorg.lndir}/bin/lndir ${pkg}/share/xsessions $out/share/xsessions
|
${xorg.lndir}/bin/lndir ${pkg}/share/xsessions $out/share/xsessions
|
||||||
fi
|
fi
|
||||||
if test -d ${pkg}/share/wayland-sessions; then
|
if test -d ${pkg}/share/wayland-sessions; then
|
||||||
mkdir -p "$out/share/wayland-sessions"
|
|
||||||
${xorg.lndir}/bin/lndir ${pkg}/share/wayland-sessions $out/share/wayland-sessions
|
${xorg.lndir}/bin/lndir ${pkg}/share/wayland-sessions $out/share/wayland-sessions
|
||||||
fi
|
fi
|
||||||
'') cfg.displayManager.sessionPackages}
|
'') cfg.displayManager.sessionPackages}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
dmDefault = cfg.desktopManager.default;
|
||||||
|
wmDefault = cfg.windowManager.default;
|
||||||
|
|
||||||
|
defaultSessionFromLegacyOptions = concatStringsSep "+" (filter (s: s != null) ([ dmDefault ] ++ optional (wmDefault != "none") wmDefault));
|
||||||
|
|
||||||
in
|
in
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -315,47 +250,48 @@ in
|
||||||
inside the display manager with the desktop manager name
|
inside the display manager with the desktop manager name
|
||||||
followed by the window manager name.
|
followed by the window manager name.
|
||||||
'';
|
'';
|
||||||
apply = list: rec {
|
};
|
||||||
wm = filter (s: s.manage == "window") list;
|
|
||||||
dm = filter (s: s.manage == "desktop") list;
|
sessionData = mkOption {
|
||||||
names = flip concatMap dm
|
description = "Data exported for display managers’ convenience";
|
||||||
(d: map (w: d.name + optionalString (w.name != "none") ("+" + w.name))
|
internal = true;
|
||||||
(filter (w: d.name != "none" || w.name != "none") wm));
|
default = {};
|
||||||
desktops = mkDesktops names;
|
apply = val: {
|
||||||
script = xsession wm dm;
|
|
||||||
wrapper = xsessionWrapper;
|
wrapper = xsessionWrapper;
|
||||||
|
desktops = installedSessions;
|
||||||
|
sessionNames = concatMap (p: p.providedSessions) cfg.displayManager.sessionPackages;
|
||||||
|
# We do not want to force users to set defaultSession when they have only single DE.
|
||||||
|
autologinSession =
|
||||||
|
if cfg.displayManager.defaultSession != null then
|
||||||
|
cfg.displayManager.defaultSession
|
||||||
|
else if cfg.displayManager.sessionData.sessionNames != [] then
|
||||||
|
head cfg.displayManager.sessionData.sessionNames
|
||||||
|
else
|
||||||
|
null;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
defaultSession = mkOption {
|
defaultSession = mkOption {
|
||||||
type = with types; str // {
|
type = with types; nullOr str // {
|
||||||
description = "session name";
|
description = "session name";
|
||||||
check = d: let
|
check = d:
|
||||||
sessionNames = cfg.displayManager.session.names ++
|
assertMsg (d != null -> (str.check d && elem d cfg.displayManager.sessionData.sessionNames)) ''
|
||||||
(concatMap (p: p.providedSessions) cfg.displayManager.sessionPackages);
|
|
||||||
in
|
|
||||||
assertMsg (str.check d && (d == "none" || (elem d sessionNames))) ''
|
|
||||||
Default graphical session, '${d}', not found.
|
Default graphical session, '${d}', not found.
|
||||||
Valid names for 'services.xserver.displayManager.defaultSession' are:
|
Valid names for 'services.xserver.displayManager.defaultSession' are:
|
||||||
${concatStringsSep "\n " sessionNames}
|
${concatStringsSep "\n " cfg.displayManager.sessionData.sessionNames}
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
default = let
|
default =
|
||||||
dmDefault = cfg.desktopManager.default;
|
if dmDefault != null || wmDefault != null then
|
||||||
wmDefault = cfg.windowManager.default;
|
defaultSessionFromLegacyOptions
|
||||||
defaultPackage =
|
|
||||||
if cfg.displayManager.sessionPackages != [] then
|
|
||||||
(head (head cfg.displayManager.sessionPackages).providedSessions)
|
|
||||||
else
|
else
|
||||||
null;
|
null;
|
||||||
defaultDmWm = dmDefault + optionalString (wmDefault != "none") ("+" + wmDefault);
|
|
||||||
in
|
|
||||||
if defaultDmWm == "none" && isString defaultPackage then
|
|
||||||
defaultPackage
|
|
||||||
else
|
|
||||||
defaultDmWm;
|
|
||||||
example = "gnome";
|
example = "gnome";
|
||||||
description = "Default graphical session (only effective for LightDM and SDDM).";
|
description = ''
|
||||||
|
Graphical session to pre-select in the session chooser (only effective for GDM and LightDM).
|
||||||
|
|
||||||
|
On GDM, LightDM and SDDM, it will also be used as a session for auto-login.
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
job = {
|
job = {
|
||||||
|
@ -406,6 +342,27 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
|
assertions = [
|
||||||
|
{
|
||||||
|
assertion = cfg.desktopManager.default != null || cfg.windowManager.default != null -> cfg.displayManager.defaultSession == defaultSessionFromLegacyOptions;
|
||||||
|
message = "You cannot use both services.xserver.displayManager.defaultSession option and legacy options (services.xserver.desktopManager.default and services.xserver.windowManager.default).";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
warnings =
|
||||||
|
mkIf (dmDefault != null || wmDefault != null) [
|
||||||
|
''
|
||||||
|
The following options are deprecated:
|
||||||
|
${concatStringsSep "\n " (map ({c, t}: t) (filter ({c, t}: c != null) [
|
||||||
|
{ c = dmDefault; t = "- services.xserver.desktopManager.default"; }
|
||||||
|
{ c = wmDefault; t = "- services.xserver.windowManager.default"; }
|
||||||
|
]))}
|
||||||
|
Please use
|
||||||
|
services.xserver.displayManager.defaultSession = "${concatStringsSep "+" (filter (s: s != null) [ dmDefault wmDefault ])}";
|
||||||
|
instead.
|
||||||
|
''
|
||||||
|
];
|
||||||
|
|
||||||
services.xserver.displayManager.xserverBin = "${xorg.xorgserver.out}/bin/X";
|
services.xserver.displayManager.xserverBin = "${xorg.xorgserver.out}/bin/X";
|
||||||
|
|
||||||
systemd.user.targets.graphical-session = {
|
systemd.user.targets.graphical-session = {
|
||||||
|
@ -414,6 +371,67 @@ in
|
||||||
StopWhenUnneeded = false;
|
StopWhenUnneeded = false;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Create desktop files and scripts for starting sessions for WMs/DMs
|
||||||
|
# that do not have upstream session files (those defined using services.{display,desktop,window}Manager.session options).
|
||||||
|
services.xserver.displayManager.sessionPackages =
|
||||||
|
let
|
||||||
|
dms = filter (s: s.manage == "desktop") cfg.displayManager.session;
|
||||||
|
wms = filter (s: s.manage == "window") cfg.displayManager.session;
|
||||||
|
|
||||||
|
# Script responsible for starting the window manager and the desktop manager.
|
||||||
|
xsession = wm: dm: pkgs.writeScript "xsession" ''
|
||||||
|
#! ${pkgs.bash}/bin/bash
|
||||||
|
|
||||||
|
# Legacy session script used to construct .desktop files from
|
||||||
|
# `services.xserver.displayManager.session` entries. Called from
|
||||||
|
# `sessionWrapper`.
|
||||||
|
|
||||||
|
# Start the window manager.
|
||||||
|
${wm.start}
|
||||||
|
|
||||||
|
# Start the desktop manager.
|
||||||
|
${dm.start}
|
||||||
|
|
||||||
|
${optionalString cfg.updateDbusEnvironment ''
|
||||||
|
${lib.getBin pkgs.dbus}/bin/dbus-update-activation-environment --systemd --all
|
||||||
|
''}
|
||||||
|
|
||||||
|
test -n "$waitPID" && wait "$waitPID"
|
||||||
|
|
||||||
|
${config.systemd.package}/bin/systemctl --user stop graphical-session.target
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
# We will generate every possible pair of WM and DM.
|
||||||
|
concatLists (
|
||||||
|
crossLists
|
||||||
|
(dm: wm: let
|
||||||
|
sessionName = "${dm.name}${optionalString (wm.name != "none") ("+" + wm.name)}";
|
||||||
|
script = xsession dm wm;
|
||||||
|
in
|
||||||
|
optional (dm.name != "none" || wm.name != "none")
|
||||||
|
(pkgs.writeTextFile {
|
||||||
|
name = "${sessionName}-xsession";
|
||||||
|
destination = "/share/xsessions/${sessionName}.desktop";
|
||||||
|
# Desktop Entry Specification:
|
||||||
|
# - https://standards.freedesktop.org/desktop-entry-spec/latest/
|
||||||
|
# - https://standards.freedesktop.org/desktop-entry-spec/latest/ar01s06.html
|
||||||
|
text = ''
|
||||||
|
[Desktop Entry]
|
||||||
|
Version=1.0
|
||||||
|
Type=XSession
|
||||||
|
TryExec=${script}
|
||||||
|
Exec=${script}
|
||||||
|
Name=${sessionName}
|
||||||
|
'';
|
||||||
|
} // {
|
||||||
|
providedSessions = [ sessionName ];
|
||||||
|
})
|
||||||
|
)
|
||||||
|
[dms wms]
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
|
@ -421,6 +439,7 @@ in
|
||||||
"The option is no longer necessary because all display managers have already delegated lid management to systemd.")
|
"The option is no longer necessary because all display managers have already delegated lid management to systemd.")
|
||||||
(mkRenamedOptionModule [ "services" "xserver" "displayManager" "job" "logsXsession" ] [ "services" "xserver" "displayManager" "job" "logToFile" ])
|
(mkRenamedOptionModule [ "services" "xserver" "displayManager" "job" "logsXsession" ] [ "services" "xserver" "displayManager" "job" "logToFile" ])
|
||||||
(mkRenamedOptionModule [ "services" "xserver" "displayManager" "logToJournal" ] [ "services" "xserver" "displayManager" "job" "logToJournal" ])
|
(mkRenamedOptionModule [ "services" "xserver" "displayManager" "logToJournal" ] [ "services" "xserver" "displayManager" "job" "logToJournal" ])
|
||||||
|
(mkRenamedOptionModule [ "services" "xserver" "displayManager" "extraSessionFilesPackages" ] [ "services" "xserver" "displayManager" "sessionPackages" ])
|
||||||
];
|
];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,44 +31,9 @@ let
|
||||||
load-module module-position-event-sounds
|
load-module module-position-event-sounds
|
||||||
'';
|
'';
|
||||||
|
|
||||||
dmDefault = config.services.xserver.desktopManager.default;
|
defaultSessionName = config.services.xserver.displayManager.defaultSession;
|
||||||
wmDefault = config.services.xserver.windowManager.default;
|
|
||||||
hasDefaultUserSession = dmDefault != "none" || wmDefault != "none";
|
|
||||||
defaultSessionName = dmDefault + optionalString (wmDefault != "none") ("+" + wmDefault);
|
|
||||||
|
|
||||||
setSessionScript = pkgs.python3.pkgs.buildPythonApplication {
|
|
||||||
name = "set-session";
|
|
||||||
|
|
||||||
format = "other";
|
|
||||||
|
|
||||||
src = ./set-session.py;
|
|
||||||
|
|
||||||
dontUnpack = true;
|
|
||||||
|
|
||||||
strictDeps = false;
|
|
||||||
|
|
||||||
nativeBuildInputs = with pkgs; [
|
|
||||||
wrapGAppsHook
|
|
||||||
gobject-introspection
|
|
||||||
];
|
|
||||||
|
|
||||||
buildInputs = with pkgs; [
|
|
||||||
accountsservice
|
|
||||||
glib
|
|
||||||
];
|
|
||||||
|
|
||||||
propagatedBuildInputs = with pkgs.python3.pkgs; [
|
|
||||||
pygobject3
|
|
||||||
ordered-set
|
|
||||||
];
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
mkdir -p $out/bin
|
|
||||||
cp $src $out/bin/set-session
|
|
||||||
chmod +x $out/bin/set-session
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
|
setSessionScript = pkgs.callPackage ./account-service-util.nix { };
|
||||||
in
|
in
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -186,7 +151,7 @@ in
|
||||||
environment = {
|
environment = {
|
||||||
GDM_X_SERVER_EXTRA_ARGS = toString
|
GDM_X_SERVER_EXTRA_ARGS = toString
|
||||||
(filter (arg: arg != "-terminate") cfg.xserverArgs);
|
(filter (arg: arg != "-terminate") cfg.xserverArgs);
|
||||||
XDG_DATA_DIRS = "${cfg.session.desktops}/share/";
|
XDG_DATA_DIRS = "${cfg.sessionData.desktops}/share/";
|
||||||
} // optionalAttrs (xSessionWrapper != null) {
|
} // optionalAttrs (xSessionWrapper != null) {
|
||||||
# Make GDM use this wrapper before running the session, which runs the
|
# Make GDM use this wrapper before running the session, which runs the
|
||||||
# configured setupCommands. This relies on a patched GDM which supports
|
# configured setupCommands. This relies on a patched GDM which supports
|
||||||
|
@ -204,16 +169,19 @@ in
|
||||||
cat - > /run/gdm/.config/gnome-initial-setup-done <<- EOF
|
cat - > /run/gdm/.config/gnome-initial-setup-done <<- EOF
|
||||||
yes
|
yes
|
||||||
EOF
|
EOF
|
||||||
''
|
'' + optionalString (defaultSessionName != null) ''
|
||||||
# TODO: Make setSessionScript aware of previously used sessions
|
# Set default session in session chooser to a specified values – basically ignore session history.
|
||||||
# + optionalString hasDefaultUserSession ''
|
${setSessionScript}/bin/set-session ${cfg.sessionData.autologinSession}
|
||||||
# ${setSessionScript}/bin/set-session ${defaultSessionName}
|
'';
|
||||||
# ''
|
|
||||||
;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
systemd.services.display-manager.wants = [
|
||||||
# Because sd_login_monitor_new requires /run/systemd/machines
|
# Because sd_login_monitor_new requires /run/systemd/machines
|
||||||
systemd.services.display-manager.wants = [ "systemd-machined.service" ];
|
"systemd-machined.service"
|
||||||
|
# setSessionScript wants AccountsService
|
||||||
|
"accounts-daemon.service"
|
||||||
|
];
|
||||||
|
|
||||||
systemd.services.display-manager.after = [
|
systemd.services.display-manager.after = [
|
||||||
"rc-local.service"
|
"rc-local.service"
|
||||||
"systemd-machined.service"
|
"systemd-machined.service"
|
||||||
|
@ -329,7 +297,7 @@ in
|
||||||
${optionalString cfg.gdm.debug "Enable=true"}
|
${optionalString cfg.gdm.debug "Enable=true"}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
environment.etc."gdm/Xsession".source = config.services.xserver.displayManager.session.wrapper;
|
environment.etc."gdm/Xsession".source = config.services.xserver.displayManager.sessionData.wrapper;
|
||||||
|
|
||||||
# GDM LFS PAM modules, adapted somehow to NixOS
|
# GDM LFS PAM modules, adapted somehow to NixOS
|
||||||
security.pam.services = {
|
security.pam.services = {
|
||||||
|
|
|
@ -53,9 +53,8 @@ in
|
||||||
Whether to enable lightdm-mini-greeter as the lightdm greeter.
|
Whether to enable lightdm-mini-greeter as the lightdm greeter.
|
||||||
|
|
||||||
Note that this greeter starts only the default X session.
|
Note that this greeter starts only the default X session.
|
||||||
You can configure the default X session by
|
You can configure the default X session using
|
||||||
<option>services.xserver.desktopManager.default</option> and
|
<xref linkend="opt-services.xserver.displayManager.defaultSession"/>.
|
||||||
<option>services.xserver.windowManager.default</option>.
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,9 @@ let
|
||||||
dmcfg = xcfg.displayManager;
|
dmcfg = xcfg.displayManager;
|
||||||
xEnv = config.systemd.services.display-manager.environment;
|
xEnv = config.systemd.services.display-manager.environment;
|
||||||
cfg = dmcfg.lightdm;
|
cfg = dmcfg.lightdm;
|
||||||
|
sessionData = dmcfg.sessionData;
|
||||||
|
|
||||||
defaultSessionName = dmcfg.defaultSession;
|
setSessionScript = pkgs.callPackage ./account-service-util.nix { };
|
||||||
hasDefaultUserSession = defaultSessionName != "none";
|
|
||||||
|
|
||||||
inherit (pkgs) lightdm writeScript writeText;
|
inherit (pkgs) lightdm writeScript writeText;
|
||||||
|
|
||||||
|
@ -44,22 +44,19 @@ let
|
||||||
greeter-user = ${config.users.users.lightdm.name}
|
greeter-user = ${config.users.users.lightdm.name}
|
||||||
greeters-directory = ${cfg.greeter.package}
|
greeters-directory = ${cfg.greeter.package}
|
||||||
''}
|
''}
|
||||||
sessions-directory = ${dmcfg.session.desktops}/share/xsessions:${dmcfg.session.desktops}/share/wayland-sessions
|
sessions-directory = ${dmcfg.sessionData.desktops}/share/xsessions:${dmcfg.sessionData.desktops}/share/wayland-sessions
|
||||||
${cfg.extraConfig}
|
${cfg.extraConfig}
|
||||||
|
|
||||||
[Seat:*]
|
[Seat:*]
|
||||||
xserver-command = ${xserverWrapper}
|
xserver-command = ${xserverWrapper}
|
||||||
session-wrapper = ${dmcfg.session.wrapper}
|
session-wrapper = ${dmcfg.sessionData.wrapper}
|
||||||
${optionalString cfg.greeter.enable ''
|
${optionalString cfg.greeter.enable ''
|
||||||
greeter-session = ${cfg.greeter.name}
|
greeter-session = ${cfg.greeter.name}
|
||||||
''}
|
''}
|
||||||
${optionalString cfg.autoLogin.enable ''
|
${optionalString cfg.autoLogin.enable ''
|
||||||
autologin-user = ${cfg.autoLogin.user}
|
autologin-user = ${cfg.autoLogin.user}
|
||||||
autologin-user-timeout = ${toString cfg.autoLogin.timeout}
|
autologin-user-timeout = ${toString cfg.autoLogin.timeout}
|
||||||
autologin-session = ${defaultSessionName}
|
autologin-session = ${sessionData.autologinSession}
|
||||||
''}
|
|
||||||
${optionalString hasDefaultUserSession ''
|
|
||||||
user-session=${defaultSessionName}
|
|
||||||
''}
|
''}
|
||||||
${optionalString (dmcfg.setupCommands != "") ''
|
${optionalString (dmcfg.setupCommands != "") ''
|
||||||
display-setup-script=${pkgs.writeScript "lightdm-display-setup" ''
|
display-setup-script=${pkgs.writeScript "lightdm-display-setup" ''
|
||||||
|
@ -197,11 +194,9 @@ in
|
||||||
LightDM auto-login requires services.xserver.displayManager.lightdm.autoLogin.user to be set
|
LightDM auto-login requires services.xserver.displayManager.lightdm.autoLogin.user to be set
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
{ assertion = cfg.autoLogin.enable -> hasDefaultUserSession;
|
{ assertion = cfg.autoLogin.enable -> sessionData.autologinSession != null;
|
||||||
message = ''
|
message = ''
|
||||||
LightDM auto-login requires that services.xserver.desktopManager.default and
|
LightDM auto-login requires that services.xserver.displayManager.defaultSession is set.
|
||||||
services.xserver.windowManager.default are set to valid values. The current
|
|
||||||
default session: ${defaultSessionName} is not valid.
|
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
{ assertion = !cfg.greeter.enable -> (cfg.autoLogin.enable && cfg.autoLogin.timeout == 0);
|
{ assertion = !cfg.greeter.enable -> (cfg.autoLogin.enable && cfg.autoLogin.timeout == 0);
|
||||||
|
@ -212,6 +207,20 @@ 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.xserver.displayManager.job.preStart = optionalString (!cfg.autoLogin.enable && dmcfg.defaultSession != null) ''
|
||||||
|
${setSessionScript}/bin/set-session ${dmcfg.defaultSession}
|
||||||
|
'';
|
||||||
|
|
||||||
|
# setSessionScript needs session-files in XDG_DATA_DIRS
|
||||||
|
services.xserver.displayManager.job.environment.XDG_DATA_DIRS = "${dmcfg.sessionData.desktops}/share/";
|
||||||
|
|
||||||
|
# setSessionScript wants AccountsService
|
||||||
|
systemd.services.display-manager.wants = [
|
||||||
|
"accounts-daemon.service"
|
||||||
|
];
|
||||||
|
|
||||||
# lightdm relaunches itself via just `lightdm`, so needs to be on the PATH
|
# lightdm relaunches itself via just `lightdm`, so needs to be on the PATH
|
||||||
services.xserver.displayManager.job.execCmd = ''
|
services.xserver.displayManager.job.execCmd = ''
|
||||||
export PATH=${lightdm}/sbin:$PATH
|
export PATH=${lightdm}/sbin:$PATH
|
||||||
|
|
|
@ -50,8 +50,8 @@ let
|
||||||
MinimumVT=${toString (if xcfg.tty != null then xcfg.tty else 7)}
|
MinimumVT=${toString (if xcfg.tty != null then xcfg.tty else 7)}
|
||||||
ServerPath=${xserverWrapper}
|
ServerPath=${xserverWrapper}
|
||||||
XephyrPath=${pkgs.xorg.xorgserver.out}/bin/Xephyr
|
XephyrPath=${pkgs.xorg.xorgserver.out}/bin/Xephyr
|
||||||
SessionCommand=${dmcfg.session.wrapper}
|
SessionCommand=${dmcfg.sessionData.wrapper}
|
||||||
SessionDir=${dmcfg.session.desktops}/share/xsessions
|
SessionDir=${dmcfg.sessionData.desktops}/share/xsessions
|
||||||
XauthPath=${pkgs.xorg.xauth}/bin/xauth
|
XauthPath=${pkgs.xorg.xauth}/bin/xauth
|
||||||
DisplayCommand=${Xsetup}
|
DisplayCommand=${Xsetup}
|
||||||
DisplayStopCommand=${Xstop}
|
DisplayStopCommand=${Xstop}
|
||||||
|
@ -59,19 +59,19 @@ let
|
||||||
|
|
||||||
[Wayland]
|
[Wayland]
|
||||||
EnableHidpi=${if cfg.enableHidpi then "true" else "false"}
|
EnableHidpi=${if cfg.enableHidpi then "true" else "false"}
|
||||||
SessionDir=${dmcfg.session.desktops}/share/wayland-sessions
|
SessionDir=${dmcfg.sessionData.desktops}/share/wayland-sessions
|
||||||
|
|
||||||
${optionalString cfg.autoLogin.enable ''
|
${optionalString cfg.autoLogin.enable ''
|
||||||
[Autologin]
|
[Autologin]
|
||||||
User=${cfg.autoLogin.user}
|
User=${cfg.autoLogin.user}
|
||||||
Session=${defaultSessionName}.desktop
|
Session=${autoLoginSessionName}.desktop
|
||||||
Relogin=${boolToString cfg.autoLogin.relogin}
|
Relogin=${boolToString cfg.autoLogin.relogin}
|
||||||
''}
|
''}
|
||||||
|
|
||||||
${cfg.extraConfig}
|
${cfg.extraConfig}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
defaultSessionName = dmcfg.defaultSession;
|
autoLoginSessionName = dmcfg.sessionData.autologinSession;
|
||||||
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
@ -206,11 +206,9 @@ in
|
||||||
SDDM auto-login requires services.xserver.displayManager.sddm.autoLogin.user to be set
|
SDDM auto-login requires services.xserver.displayManager.sddm.autoLogin.user to be set
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
{ assertion = cfg.autoLogin.enable -> defaultSessionName != "none";
|
{ assertion = cfg.autoLogin.enable -> autoLoginSessionName != null;
|
||||||
message = ''
|
message = ''
|
||||||
SDDM auto-login requires that services.xserver.desktopManager.default and
|
SDDM auto-login requires that services.xserver.displayManager.defaultSession is set.
|
||||||
services.xserver.windowManager.default are set to valid values. The current
|
|
||||||
default session: ${defaultSessionName} is not valid.
|
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
|
@ -59,15 +59,14 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
default = mkOption {
|
default = mkOption {
|
||||||
type = types.str;
|
type = types.nullOr types.str;
|
||||||
default = "none";
|
default = null;
|
||||||
example = "wmii";
|
example = "wmii";
|
||||||
description = "Default window manager loaded if none have been chosen.";
|
description = ''
|
||||||
apply = defaultWM:
|
<emphasis role="strong">Deprecated</emphasis>, please use <xref linkend="opt-services.xserver.displayManager.defaultSession"/> instead.
|
||||||
if any (w: w.name == defaultWM) cfg.session then
|
|
||||||
defaultWM
|
Default window manager loaded if none have been chosen.
|
||||||
else
|
'';
|
||||||
throw "Default window manager (${defaultWM}) not found.";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
|
{ lib, ... }:
|
||||||
|
|
||||||
{ services.xserver.enable = true;
|
{ services.xserver.enable = true;
|
||||||
|
|
||||||
# Automatically log in.
|
# Automatically log in.
|
||||||
services.xserver.displayManager.auto.enable = true;
|
services.xserver.displayManager.auto.enable = true;
|
||||||
|
|
||||||
# Use IceWM as the window manager.
|
# Use IceWM as the window manager.
|
||||||
services.xserver.windowManager.default = "icewm";
|
|
||||||
services.xserver.windowManager.icewm.enable = true;
|
|
||||||
|
|
||||||
# Don't use a desktop manager.
|
# Don't use a desktop manager.
|
||||||
services.xserver.desktopManager.default = "none";
|
services.xserver.displayManager.defaultSession = lib.mkDefault "none+icewm";
|
||||||
|
services.xserver.windowManager.icewm.enable = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ import ./make-test-python.nix ({ pkgs, ...} : {
|
||||||
machine = { lib, ... }: {
|
machine = { lib, ... }: {
|
||||||
imports = [ ./common/x11.nix ./common/user-account.nix ];
|
imports = [ ./common/x11.nix ./common/user-account.nix ];
|
||||||
services.xserver.displayManager.auto.user = "alice";
|
services.xserver.displayManager.auto.user = "alice";
|
||||||
services.xserver.windowManager.default = lib.mkForce "i3";
|
services.xserver.displayManager.defaultSession = lib.mkForce "none+i3";
|
||||||
services.xserver.windowManager.i3.enable = true;
|
services.xserver.windowManager.i3.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,8 @@ import ./make-test-python.nix ({ pkgs, ...} : {
|
||||||
imports = [ ./common/user-account.nix ];
|
imports = [ ./common/user-account.nix ];
|
||||||
services.xserver.enable = true;
|
services.xserver.enable = true;
|
||||||
services.xserver.displayManager.lightdm.enable = true;
|
services.xserver.displayManager.lightdm.enable = true;
|
||||||
services.xserver.windowManager.default = "icewm";
|
services.xserver.displayManager.defaultSession = "none+icewm";
|
||||||
services.xserver.windowManager.icewm.enable = true;
|
services.xserver.windowManager.icewm.enable = true;
|
||||||
services.xserver.desktopManager.default = "none";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enableOCR = true;
|
enableOCR = true;
|
||||||
|
|
|
@ -12,8 +12,8 @@ import ./make-test-python.nix ({ pkgs, ...} :
|
||||||
imports = [ ./common/user-account.nix ];
|
imports = [ ./common/user-account.nix ];
|
||||||
services.xserver.enable = true;
|
services.xserver.enable = true;
|
||||||
services.xserver.displayManager.sddm.enable = true;
|
services.xserver.displayManager.sddm.enable = true;
|
||||||
|
services.xserver.displayManager.defaultSession = "plasma5";
|
||||||
services.xserver.desktopManager.plasma5.enable = true;
|
services.xserver.desktopManager.plasma5.enable = true;
|
||||||
services.xserver.desktopManager.default = "plasma5";
|
|
||||||
services.xserver.displayManager.sddm.autoLogin = {
|
services.xserver.displayManager.sddm.autoLogin = {
|
||||||
enable = true;
|
enable = true;
|
||||||
user = "alice";
|
user = "alice";
|
||||||
|
|
|
@ -16,9 +16,8 @@ let
|
||||||
imports = [ ./common/user-account.nix ];
|
imports = [ ./common/user-account.nix ];
|
||||||
services.xserver.enable = true;
|
services.xserver.enable = true;
|
||||||
services.xserver.displayManager.sddm.enable = true;
|
services.xserver.displayManager.sddm.enable = true;
|
||||||
services.xserver.windowManager.default = "icewm";
|
services.xserver.displayManager.defaultSession = "none+icewm";
|
||||||
services.xserver.windowManager.icewm.enable = true;
|
services.xserver.windowManager.icewm.enable = true;
|
||||||
services.xserver.desktopManager.default = "none";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enableOCR = true;
|
enableOCR = true;
|
||||||
|
@ -52,9 +51,8 @@ let
|
||||||
user = "alice";
|
user = "alice";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
services.xserver.windowManager.default = "icewm";
|
services.xserver.displayManager.defaultSession = "none+icewm";
|
||||||
services.xserver.windowManager.icewm.enable = true;
|
services.xserver.windowManager.icewm.enable = true;
|
||||||
services.xserver.desktopManager.default = "none";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
testScript = { nodes, ... }: let
|
testScript = { nodes, ... }: let
|
||||||
|
|
|
@ -4,10 +4,10 @@ import ./make-test-python.nix ({ pkgs, ...} : {
|
||||||
maintainers = [ nequissimus ];
|
maintainers = [ nequissimus ];
|
||||||
};
|
};
|
||||||
|
|
||||||
machine = { lib, pkgs, ... }: {
|
machine = { pkgs, ... }: {
|
||||||
imports = [ ./common/x11.nix ./common/user-account.nix ];
|
imports = [ ./common/x11.nix ./common/user-account.nix ];
|
||||||
services.xserver.displayManager.auto.user = "alice";
|
services.xserver.displayManager.auto.user = "alice";
|
||||||
services.xserver.windowManager.default = lib.mkForce "xmonad";
|
services.xserver.displayManager.defaultSession = "none+xmonad";
|
||||||
services.xserver.windowManager.xmonad = {
|
services.xserver.windowManager.xmonad = {
|
||||||
enable = true;
|
enable = true;
|
||||||
enableContribAndExtras = true;
|
enableContribAndExtras = true;
|
||||||
|
|
Loading…
Reference in New Issue