nixpkgs/nixos/modules/services/x11/display-managers/lightdm.nix
Eelco Dolstra 29027fd1e1 Rewrite ‘with pkgs.lib’ -> ‘with lib’
Using pkgs.lib on the spine of module evaluation is problematic
because the pkgs argument depends on the result of module
evaluation. To prevent an infinite recursion, pkgs and some of the
modules are evaluated twice, which is inefficient. Using ‘with lib’
prevents this problem.
2014-04-14 16:26:48 +02:00

121 lines
3.4 KiB
Nix

{ config, lib, pkgs, ... }:
with lib;
let
dmcfg = config.services.xserver.displayManager;
xEnv = config.systemd.services."display-manager".environment;
cfg = dmcfg.lightdm;
inherit (pkgs) stdenv lightdm writeScript writeText;
# lightdm runs with clearenv(), but we need a few things in the enviornment for X to startup
xserverWrapper = writeScript "xserver-wrapper"
''
#! /bin/sh
${concatMapStrings (n: "export ${n}=\"${getAttr n xEnv}\"\n") (attrNames xEnv)}
exec ${dmcfg.xserverBin} ${dmcfg.xserverArgs}
'';
# The default greeter provided with this expression is the GTK greeter.
# Again, we need a few things in the environment for the greeter to run with
# fonts/icons.
wrappedGtkGreeter = stdenv.mkDerivation {
name = "lightdm-gtk-greeter";
buildInputs = [ pkgs.makeWrapper ];
buildCommand = ''
ensureDir $out/gtk-3.0/
# This wrapper ensures that we actually get fonts
makeWrapper ${pkgs.lightdm_gtk_greeter}/sbin/lightdm-gtk-greeter \
$out/greeter \
--set XDG_DATA_DIRS ${pkgs.gnome2.gnome_icon_theme}/share \
--set FONTCONFIG_FILE /etc/fonts/fonts.conf \
--set XDG_CONFIG_HOME $out/
# We need this to ensure that it actually tries to find icons from gnome-icon-theme
cat - > $out/gtk-3.0/settings.ini << EOF
[Settings]
gtk-icon-theme-name=gnome
EOF
cat - > $out/lightdm-gtk-greeter.desktop << EOF
[Desktop Entry]
Name=LightDM Greeter
Comment=This runs the LightDM Greeter
Exec=$out/greeter
Type=Application
EOF
'';
};
lightdmConf = writeText "lightdm.conf"
''
[LightDM]
greeter-user = ${config.users.extraUsers.lightdm.name}
greeters-directory = ${cfg.greeter.package}
sessions-directory = ${dmcfg.session.desktops}
[SeatDefaults]
xserver-command = ${xserverWrapper}
session-wrapper = ${dmcfg.session.script}
greeter-session = ${cfg.greeter.name}
'';
in
{
options = {
services.xserver.displayManager.lightdm = {
enable = mkOption {
default = false;
description = ''
Whether to enable lightdm as the display manager.
'';
};
greeter = mkOption {
description = ''
The LightDM greeter to login via. The package should be a directory
containing a .desktop file matching the name in the 'name' option.
'';
default = {
name = "lightdm-gtk-greeter";
package = wrappedGtkGreeter;
};
};
};
};
config = mkIf cfg.enable {
services.xserver.displayManager.slim.enable = false;
services.xserver.displayManager.job = {
logsXsession = true;
# lightdm relaunches itself via just `lightdm`, so needs to be on the PATH
execCmd = ''
export PATH=${lightdm}/sbin:$PATH
${lightdm}/sbin/lightdm --log-dir=/var/log --run-dir=/run --config=${lightdmConf}
'';
};
services.dbus.enable = true;
services.dbus.packages = [ lightdm ];
security.pam.services.lightdm = { allowNullPassword = true; startSession = true; };
security.pam.services.lightdm-greeter = { allowNullPassword = true; startSession = true; };
users.extraUsers.lightdm = {
createHome = true;
home = "/var/lib/lightdm";
group = "lightdm";
uid = config.ids.uids.lightdm;
};
users.extraGroups.lightdm.gid = config.ids.gids.lightdm;
};
}