mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-13 17:23:08 +00:00
* Cleaned up the display manager module a bit.
svn path=/nixos/trunk/; revision=17012
This commit is contained in:
parent
22693ae44e
commit
0156cfbe9e
@ -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.";
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -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; } ];
|
||||
|
@ -378,7 +378,7 @@ in
|
||||
else ""
|
||||
}
|
||||
|
||||
${cfg.displayManager.job.beforeScript}
|
||||
${cfg.displayManager.job.preStart}
|
||||
|
||||
rm -f /tmp/.X0-lock
|
||||
'';
|
||||
|
Loading…
Reference in New Issue
Block a user