Eelco Dolstra 6920f43f1c Refactoring of the X server module:
* Modularised the xorg.conf generation.  For instance, the Wacom and
  Synaptics support has been moved into separate modules.  The
  contents of xorg.conf is defined by the option
  services.xserver.config, and various other options for specific
  sections (e.g. services.xserver.serverLayoutSection).

* displayManager.job.env: made this an attribute set.

* tcpEnable -> enableTCP for naming consistency.

* defaultDepth can be set to 0 to leave it undefined (needed for the
  vmware driver).

* Removed some options that seem obsolete or are now the default
  (e.g. RenderAccel, AllowGLXWithComposite).

* Removed services.xserver.package.  This can now be done using
  nixpkgs.config.packageOverrides.

svn path=/nixos/trunk/; revision=17004
2009-09-10 12:37:33 +00:00

184 lines
4.8 KiB
Nix

{pkgs, config, ...}:
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
source /etc/profile
exec > $HOME/.Xerrors 2>&1
### Load X defaults.
if test -e ~/.Xdefaults; then
${xorg.xrdb}/bin/xrdb -merge ~/.Xdefaults
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 ""}
### Allow user to override system-wide configuration
if test -f ~/.xsession; then
source ~/.xsession;
fi
# this script expect to have as first argument the following input
# "desktop-manager + window-manager".
arg="$1"
# extract the window manager.
windowManager="''${arg##* + }"
: ''${windowManager:=${cfg.windowManager.default}}
# extract the desktop manager.
desktopManager="''${arg% + *}"
: ''${desktopManager:=${cfg.desktopManager.default}}
# used to restart the xserver.
waitPID=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}
'';
in
{
# list of display managers.
require = [
./kdm.nix
./slim.nix
];
services = {
xserver = {
displayManager = {
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.
";
};
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;
};
};
};
};
}