From 0156cfbe9e5ff2514597a7614d8938c9a89c77be Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 10 Sep 2009 15:49:16 +0000 Subject: [PATCH] * Cleaned up the display manager module a bit. svn path=/nixos/trunk/; revision=17012 --- .../services/x11/display-managers/default.nix | 315 +++++++++--------- modules/services/x11/display-managers/kdm.nix | 4 +- modules/services/x11/xserver.nix | 2 +- 3 files changed, 163 insertions(+), 158 deletions(-) diff --git a/modules/services/x11/display-managers/default.nix b/modules/services/x11/display-managers/default.nix index 9e251501e5b7..54ed4dec2186 100644 --- a/modules/services/x11/display-managers/default.nix +++ b/modules/services/x11/display-managers/default.nix @@ -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 " + ", 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 - waitPID 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 - manage either to "window" - or "desktop". - - 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 xauth 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 + waitPID 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 + manage either to "window" + or "desktop". + + 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."; + }; + + }; + + }; + }; + }; + } diff --git a/modules/services/x11/display-managers/kdm.nix b/modules/services/x11/display-managers/kdm.nix index 77093e00f815..d0d30effbf08 100644 --- a/modules/services/x11/display-managers/kdm.nix +++ b/modules/services/x11/display-managers/kdm.nix @@ -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; } ]; diff --git a/modules/services/x11/xserver.nix b/modules/services/x11/xserver.nix index a3fda74ba839..b6fb55a3e99c 100644 --- a/modules/services/x11/xserver.nix +++ b/modules/services/x11/xserver.nix @@ -378,7 +378,7 @@ in else "" } - ${cfg.displayManager.job.beforeScript} + ${cfg.displayManager.job.preStart} rm -f /tmp/.X0-lock '';