* Cleaned up the display manager module a bit.

svn path=/nixos/trunk/; revision=17012
This commit is contained in:
Eelco Dolstra 2009-09-10 15:49:16 +00:00
parent 22693ae44e
commit 0156cfbe9e
3 changed files with 163 additions and 158 deletions

View File

@ -1,183 +1,190 @@
{pkgs, config, ...}:
# This module declares the options to define a *display manager*, the
# program responsible for handling X logins (such as xdm, kdm, gdb, or
# SLiM). The display manager allows the user to select a *session
# type*. When the user logs in, the display manager starts the
# *session script* ("xsession" below) to launch the selected session
# type. The session type defines two things: the *desktop manager*
# (e.g., KDE, Gnome or a plain xterm), and optionally the *window
# manager* (e.g. kwin or twm).
{ config, pkgs, ... }:
with pkgs.lib;
let
inherit (pkgs.lib) mkOption mergeOneOption optionals filter concatMap concatMapStrings;
cfg = config.services.xserver;
xorg = pkgs.xorg;
# file provided by services.xserver.displayManager.session.script
xsession = wm: dm: pkgs.writeScript "xsession" ''
#!/bin/sh
xsession = wm: dm: pkgs.writeScript "xsession"
''
#! /bin/sh
exec > $HOME/.xsession-errors 2>&1
source /etc/profile
source /etc/profile
exec > $HOME/.Xerrors 2>&1
### Load X defaults.
if test -e ~/.Xdefaults; then
${xorg.xrdb}/bin/xrdb -merge ~/.Xdefaults
fi
${optionalString cfg.startSSHAgent ''
### Start the SSH agent.
export SSH_ASKPASS=${pkgs.x11_ssh_askpass}/libexec/x11-ssh-askpass
eval $(${pkgs.openssh}/bin/ssh-agent)
''}
### Load X defaults.
if test -e ~/.Xdefaults; then
${xorg.xrdb}/bin/xrdb -merge ~/.Xdefaults
fi
### Allow user to override system-wide configuration
if test -f ~/.xsession; then
source ~/.xsession
fi
${if cfg.startSSHAgent then ''
### Start the SSH agent.
export SSH_ASKPASS=${pkgs.x11_ssh_askpass}/libexec/x11-ssh-askpass
eval $(${pkgs.openssh}/bin/ssh-agent)
'' else ""}
# The first argument of this script is the session type
sessionType="$1"
### Allow user to override system-wide configuration
if test -f ~/.xsession; then
source ~/.xsession;
fi
# The session type "<desktop-manager> + <window-manager>", so
# extract those.
windowManager="''${arg##* + }"
: ''${windowManager:=${cfg.windowManager.default}}
desktopManager="''${arg% + *}"
: ''${desktopManager:=${cfg.desktopManager.default}}
# this script expect to have as first argument the following input
# "desktop-manager + window-manager".
arg="$1"
# Start the window manager.
case $windowManager in
${concatMapStrings (s: ''
(${s.name})
${s.start}
;;
'') wm}
(*) echo "$0: Window manager '$windowManager' not found.";;
esac
# extract the window manager.
windowManager="''${arg##* + }"
: ''${windowManager:=${cfg.windowManager.default}}
# extract the desktop manager.
desktopManager="''${arg% + *}"
: ''${desktopManager:=${cfg.desktopManager.default}}
# Start the desktop manager.
case $desktopManager in
${concatMapStrings (s: ''
(${s.name})
${s.start}
;;
'') dm}
(*) echo "$0: Desktop manager '$desktopManager' not found.";;
esac
# used to restart the xserver.
waitPID=0
test -n "$waitPID" && wait "$waitPID"
exit 0
'';
# handle window manager starts.
case $windowManager in
${concatMapStrings (s: "
(${s.name})
${s.start}
;;
") wm}
(*) echo "$0: Window manager '$windowManager' not found.";;
esac
# handle desktop manager starts.
case $desktopManager in
${concatMapStrings (s: "
(${s.name})
${s.start}
;;
") dm}
(*) echo "$0: Desktop manager '$desktopManager' not found.";;
esac
test "$waitPID" != 0 && wait "$waitPID"
exit
'';
mkDesktops = names: pkgs.runCommand "desktops" {} ''
ensureDir $out
${concatMapStrings (n: ''
cat - > "$out/${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}
'';
mkDesktops = names: pkgs.runCommand "desktops" {}
''
ensureDir $out
${concatMapStrings (n: ''
cat - > "$out/${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}
'';
in
{
# list of display managers.
require = [
./kdm.nix
./slim.nix
];
services = {
xserver = {
displayManager = {
imports = [ ./kdm.nix ./slim.nix ];
xauthBin = mkOption {
default = "${xorg.xauth}/bin/xauth";
description = "
Path to the xauth binary used by display managers.
";
};
xserverBin = mkOption {
default = "${xorg.xorgserver}/bin/X";
description = "
Path to the xserver binary used by display managers.
";
};
options = {
xserverArgs = mkOption {
default = [];
example = [
"-ac"
"-logverbose"
"-nolisten tcp"
];
description = "
List of arguments which have to be pass to when
the display manager start the xserver.
";
apply = toString;
};
session = mkOption {
default = [];
example = [
{
manage = "desktop";
name = "xterm";
start = "
${pkgs.xterm}/bin/xterm -ls &
waitPID=$!
";
}
];
description = ''
List of session supported with the command used to start each
session. Each session script can set the
<varname>waitPID</varname> shell variable to make this script
waiting until the end of the user session. Each script is used
to define either a windows manager or a desktop manager. These
can be differentiated by setting the attribute
<varname>manage</varname> either to <literal>"window"</literal>
or <literal>"desktop"</literal>.
The list of desktop manager and window manager should appear
inside the display manager with the desktop 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;
names = concatMap (d: map (w: d.name + " + " + w.name) wm) dm;
desktops = mkDesktops names;
script = xsession wm dm;
};
};
job = mkOption {
default = {};
example = {
preStart = ''
rm -f /var/log/slim.log
'';
environment = { SLIM_CFGFILE = /etc/slim.conf; };
execCmd = "${pkgs.slim}/bin/slim";
};
description = "
List of arguments which have to be pass to when
the display manager start the xserver.
";
merge = mergeOneOption;
};
services.xserver.displayManager = {
xauthBin = mkOption {
default = "${xorg.xauth}/bin/xauth";
description = "Path to the <command>xauth</command> program used by display managers.";
};
xserverBin = mkOption {
default = "${xorg.xorgserver}/bin/X";
description = "Path to the X server used by display managers.";
};
xserverArgs = mkOption {
default = [];
example = [ "-ac" "-logverbose" "-nolisten tcp" ];
description = "List of arguments for the X server.";
apply = toString;
};
session = mkOption {
default = [];
example = [
{
manage = "desktop";
name = "xterm";
start = "
${pkgs.xterm}/bin/xterm -ls &
waitPID=$!
";
}
];
description = ''
List of sessions supported with the command used to start each
session. Each session script can set the
<varname>waitPID</varname> shell variable to make this script
wait until the end of the user session. Each script is used
to define either a windows manager or a desktop manager. These
can be differentiated by setting the attribute
<varname>manage</varname> either to <literal>"window"</literal>
or <literal>"desktop"</literal>.
The list of desktop manager and window manager should appear
inside the display manager with the desktop 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;
names = concatMap (d: map (w: d.name + " + " + w.name) wm) dm;
desktops = mkDesktops names;
script = xsession wm dm;
};
};
job = mkOption {
default = {};
type = types.optionSet;
merge = mergeOneOption;
description = "This option defines how to start the display manager.";
options = {
preStart = mkOption {
default = "";
example = "rm -f /var/log/my-display-manager.log";
description = "Script executed before the display manager is started.";
};
execCmd = mkOption {
example = "${pkgs.slim}/bin/slim";
description = "Command to start the display manager.";
};
environment = mkOption {
default = {};
example = { SLIM_CFGFILE = /etc/slim.conf; };
description = "Additional environment variables needed by the display manager.";
};
};
};
};
};
}

View File

@ -73,9 +73,7 @@ in
config = mkIf cfg.enable {
services.xserver.displayManager.job =
{ beforeScript = "";
environment = {};
execCmd = "${kdebase_workspace}/bin/kdm -config ${kdmrc}";
{ execCmd = "${kdebase_workspace}/bin/kdm -config ${kdmrc}";
};
security.pam.services = [ { name = "kde"; localLogin = true; ckHack = true; } ];

View File

@ -378,7 +378,7 @@ in
else ""
}
${cfg.displayManager.job.beforeScript}
${cfg.displayManager.job.preStart}
rm -f /tmp/.X0-lock
'';