* Synced with branches/fix-style @ 13861

svn path=/nixos/branches/modular-nixos/; revision=14946
This commit is contained in:
Nicolas Pierron 2009-04-08 13:37:40 +00:00
commit 9ac25ba853
28 changed files with 1364 additions and 567 deletions

View File

@ -7,6 +7,230 @@
NixOS.</para>
<section>
<title>Extending NixOS</title>
<para>A unique syntax is used to express all system, hardware, computer and
service configurations. This syntax helps for reading and writing new
configuration files. It is coming with some extra strategies defined in
NixPkgs which are used to merge and evaluate all configuration files.</para>
<para>A configuration file is the same as your own computer
configuration.</para>
<example xml:id='conf-syntax'><title>Usual configuration file</title>
<programlisting>
{pkgs, config, ...}: <co xml:id='conf-syntax-1' />
###### interface
let
inherit (pkgs.lib) mkOption; <co xml:id='conf-syntax-2' />
options = { <co xml:id='conf-syntax-3' />
services = {
locate = {
enable = mkOption {
default = false;
example = true;
description = ''
If enabled, NixOS will periodically update the database of
files used by the <command>locate</command> command.
'';
};
period = mkOption {
default = "15 02 * * *";
description = ''
This option defines (in the format used by cron) when the
locate database is updated.
The default is to update at 02:15 (at night) every day.
'';
};
};
};
};
in
###### implementation
let
cfg = config.services.locate; <co xml:id='conf-syntax-4' />
inherit (pkgs.lib) mkIf mkThenElse;
locatedb = "/var/cache/locatedb";
logfile = "/var/log/updatedb";
cmd = "root updatedb --localuser=nobody --output=${locatedb} > ${logfile}";
in
mkIf cfg.enable {<co xml:id='conf-syntax-5' />
require = [ <co xml:id='conf-syntax-6' />
options
# config.services.cron
(import ../../upstart-jobs/cron.nix)
];
services = {
cron = {
systemCronJobs = mkThenElse { <co xml:id='conf-syntax-7' />
thenPart = "${cfg.period} root ${cmd}";
elsePart = "";
};
};
};
}</programlisting>
</example>
<para><xref linkend='conf-syntax' /> shows the <emphasis>configuration
file</emphasis> for the locate service which uses cron to update the
database at some dates which can be defined by the user. This nix
expression is coming
from <filename>upstart-jobs/cron/locate.nix</filename>. It shows a simple
example of a service that can be either distributed on many computer that
are using the same configuration or to shared with the community. This
file is divided in two with the interface and the implementation. Both
the interface and the implementation declare a <emphasis>configuration
set</emphasis>.
<calloutlist>
<callout arearefs='conf-syntax-1'>
<para>This line declares the arguments of the configuration file. You
can omit this line if there is no reference to <varname>pkgs</varname>
and <varname>config</varname> inside the configuration file.</para>
<para>The argument <varname>pkgs</varname> refers to NixPkgs and allow
you to access all attributes contained inside it. In this
example <varname>pkgs</varname> is used to retrieve common functions to
ease the writing of configuration files
like <varname>mkOption</varname>, <varname>mkIf</varname>
and <varname>mkThenElse</varname>.</para>
<para>The argument <varname>config</varname> corresponds to the whole
NixOS configuration. This is a set which is build by merging all
configuration files imported to set up the system. Thus all options
declared are contained inside this variable. In this
example <varname>config</varname> is used to retrieve the status of
the <varname>enable</varname> flag. The important point of this
argument is that it contains either the result of the merge of different
settings or the default value, therefore you cannot assume
that <option>config.services.locate.enable</option> is always false
because it may have been defined in another configuration file.</para>
</callout>
<callout arearefs='conf-syntax-2'>
<para>This line is used to import a function that is useful for
writing this configuration file.</para>
</callout>
<callout arearefs='conf-syntax-3'>
<para>The variable <varname>options</varname> is
a <emphasis>configuration set</emphasis> which is only used to declare
options with the function <varname>mkOption</varname> imported
from <filename>pkgs/lib/default.nix</filename>. Options may contained
any attribute but only the following have a special
meaning: <varname>default</varname>, <varname>example</varname>,
<varname>description</varname>, <varname>merge</varname>
and <varname>apply</varname>.</para>
<para>The <varname>merge</varname> attribute is used to merge all values
defined in all configuration files and this function return a value
which has the same type as the default value. If the merge function is
not defined, then a default function
(<varname>pkgs.lib.mergeDefaultOption</varname>) is used to merge
values. The <varname>merge</varname> attribute is a function which
expect two arguments: the location of the option and the list of values
which have to be merged.</para>
<para>The <varname>apply</varname> attribute is a function used to
process the option. Thus the value return
by <option>config.<replaceable>option</replaceable></option> would be
the result of the <varname>apply</varname> function called with either
the <varname>default</varname> value or the result of
the <varname>merge</varname> function.</para>
</callout>
<callout arearefs='conf-syntax-4'>
<para>This line is a common trick used to reduce the amount of
writing. In this case <varname>cfg</varname> is just a sugar over
<option>config.services.locate</option></para>
</callout>
<callout arearefs='conf-syntax-5'>
<para>This line is used to declare a special <emphasis>IF</emphasis>
statement. If you had put a usual <emphasis>IF</emphasis> statement
here, with the same condition, then you will get an infinite loop. The
reason is that your condition ask for the value of the
option <option>config.services.locate.enable</option> but in order to
get this value you have to evaluate all configuration sets including the
configuration set contained inside your file.</para>
<para>To remove this extra complexity, <varname>mkIf</varname> has been
introduced to get rid of possible infinite loop and to factor your
writing.</para>
</callout>
<callout arearefs='conf-syntax-6'>
<para>The attribute <varname>require</varname> is the only special
option that exists. It is used to embed all option declarations that
are required by your configuration file and it is also used to provide
the options that you are declaring.</para>
<para>This attribute is processed
with <varname>pkgs.lib.uniqFlatten</varname> to collect all
configuration files that are used by your system and it avoid the
insertion of duplicated elements by comparing the configuration set codes.</para>
<para>Currently, the file <filename>configuration.nix</filename>
implicitly embeds <filename>system/options.nix</filename>. If you need
a special configuration file, then you will have to add similar lines
to your computer configuration.</para>
</callout>
<callout arearefs='conf-syntax-7'>
<para>As <varname>mkIf</varname> does not need
any <emphasis>then</emphasis> part or <emphasis>else</emphasis> part,
then you can specify one on each option definition with the
function <varname>mkThenElse</varname>.</para>
<para>To avoid a lot of <varname>mkThenElse</varname> with empty
<emphasis>else</emphasis> part, a sugar has been added to infer the
corresponding <emphasis>empty</emphasis>-value of your option when the
function <varname>mkThenElse</varname> is not used.</para>
<para>If your <emphasis>then</emphasis> part
and <emphasis>else</emphasis> part are identical, then you should use
the function <varname>mkAlways</varname> to ignore the condition.</para>
<para>If you need to add another condition, then you can add <varname>mkIf</varname> to on
the appropriate location. Thus the <emphasis>then</emphasis> part will
only be used if all conditions declared with <varname>mkIf</varname>
are satisfied.</para>
</callout>
</calloutlist>
</para>
</section>
<section>
<title>Building specific parts of NixOS</title>

View File

@ -4,6 +4,7 @@ use File::Spec;
use File::Basename;
my @requireList = ();
my @kernelModules = ();
my @initrdKernelModules = ();
@ -56,8 +57,6 @@ push @kernelModules, "kvm-amd" if hasCPUFeature "svm";
# modules are auto-detected so we don't need to list them here.
# However, some are needed in the initrd to boot the system.
my $enableIntel2200BGFirmware = "false";
my $enableIntel3945ABGFirmware = "false";
my $videoDriver = "vesa";
sub pciCheck {
@ -97,11 +96,13 @@ sub pciCheck {
# Can't rely on $module here, since the module may not be loaded
# due to missing firmware. Ideally we would check modules.pcimap
# here.
$enableIntel2200BGFirmware = "true" if $vendor eq "0x8086" &&
push @requireList, "(import ./configurations/hardware/network/Intel2200BG.nix)" if
$vendor eq "0x8086" &&
($device eq "0x1043" || $device eq "0x104f" || $device eq "0x4220" ||
$device eq "0x4221" || $device eq "0x4223" || $device eq "0x4224");
$enableIntel3945ABGFirmware = "true" if $vendor eq "0x8086" &&
push @requireList, "(import ./configurations/hardware/network/Intel3945ABG.nix)" if
$vendor eq "0x8086" &&
($device eq "0x4229" || $device eq "0x4230" ||
$device eq "0x4222" || $device eq "0x4227");
@ -197,14 +198,26 @@ sub toNixExpr {
return $res;
}
sub multiLineList {
my $indent = shift;
my $res = "";
foreach my $s (@_) {
$res .= "\n$indent $s";
}
$res .= "\nindent";
return $res;
}
my $initrdKernelModules = toNixExpr(removeDups @initrdKernelModules);
my $kernelModules = toNixExpr(removeDups @kernelModules);
my $requireList = multiLineList(" ", removeDups @requireList);
## This is a generated file. Do not modify!
## Make changes to /etc/nixos/configuration.nix instead.
print <<EOF ;
{
require = [$requireList];
boot = {
initrd = {
extraKernelModules = [ $initrdKernelModules ];
@ -216,12 +229,15 @@ print <<EOF ;
maxJobs = $cpus;
};
# list of file systems which can be mounted.
fileSystems = [
];
# list of swap devices.
swapDevices = [
];
networking = {
enableIntel3945ABGFirmware = $enableIntel3945ABGFirmware;
# Warning: setting this option to `true' requires acceptance of the
# firmware license, see http://ipw2200.sourceforge.net/firmware.php?fid=7.
enableIntel2200BGFirmware = $enableIntel2200BGFirmware;
};
services = {
@ -229,7 +245,7 @@ print <<EOF ;
xserver = {
videoDriver = "$videoDriver";
};
};
}
EOF

164
system/kernel.nix Normal file
View File

@ -0,0 +1,164 @@
{pkgs, config, ...}:
###### interface
let
inherit (pkgs.lib) mkOption;
options = {
boot = {
kernelPackages = mkOption {
default = pkgs.kernelPackages;
example = pkgs.kernelPackages_2_6_25;
description = "
This option allows you to override the Linux kernel used by
NixOS. Since things like external kernel module packages are
tied to the kernel you're using, it also overrides those.
This option is a function that takes Nixpkgs as an argument
(as a convenience), and returns an attribute set containing at
the very least an attribute <varname>kernel</varname>.
Additional attributes may be needed depending on your
configuration. For instance, if you use the NVIDIA X driver,
then it also needs to contain an attribute
<varname>nvidiaDrivers</varname>.
";
};
kernelParams = mkOption {
default = [
"selinux=0"
"apm=on"
"acpi=on"
"vga=0x317"
"console=tty1"
"splash=verbose"
];
description = "
The kernel parameters. If you want to add additional
parameters, it's best to set
<option>boot.extraKernelParams</option>.
";
};
extraKernelParams = mkOption {
default = [
];
example = [
"debugtrace"
];
description = "
Additional user-defined kernel parameters.
";
};
extraModulePackages = mkOption {
default = [];
# !!! example = [pkgs.aufs pkgs.nvidiaDrivers];
description = ''
A list of additional packages supplying kernel modules.
'';
};
kernelModules = mkOption {
default = [];
description = "
The set of kernel modules to be loaded in the second stage of
the boot process. That is, these modules are not included in
the initial ramdisk, so they'd better not be required for
mounting the root file system. Add them to
<option>boot.initrd.extraKernelModules</option> if they are.
";
};
initrd = {
kernelModules = mkOption {
default = [
# Note: most of these (especially the SATA/PATA modules)
# shouldn't be included by default since nixos-hardware-scan
# detects them, but I'm keeping them for now for backwards
# compatibility.
# Some SATA/PATA stuff.
"ahci"
"sata_nv"
"sata_via"
"sata_sis"
"sata_uli"
"ata_piix"
"pata_marvell"
# Standard SCSI stuff.
"sd_mod"
"sr_mod"
# Standard IDE stuff.
"ide_cd"
"ide_disk"
"ide_generic"
# Filesystems.
"ext3"
# Support USB keyboards, in case the boot fails and we only have
# a USB keyboard.
"ehci_hcd"
"ohci_hcd"
"usbhid"
# LVM.
"dm_mod"
];
description = "
The set of kernel modules in the initial ramdisk used during the
boot process. This set must include all modules necessary for
mounting the root device. That is, it should include modules
for the physical device (e.g., SCSI drivers) and for the file
system (e.g., ext3). The set specified here is automatically
closed under the module dependency relation, i.e., all
dependencies of the modules list here are included
automatically. If you want to add additional
modules, it's best to set
<option>boot.initrd.extraKernelModules</option>.
";
};
extraKernelModules = mkOption {
default = [];
description = "
Additional kernel modules for the initial ramdisk. These are
loaded before the modules listed in
<option>boot.initrd.kernelModules</option>, so they take
precedence.
";
};
};
};
};
in
###### implementation
let
kernelPackages = config.boot.kernelPackages;
kernel = kernelPackages.kernel;
in
{
require = [
options
# udev
];
system = {
# include kernel modules.
modulesTree = [ kernel ] ++ config.boot.extraModulePackages;
};
services = {
udev = {
# The Linux kernel >= 2.6.27 provides firmware
addFirmware = [ "${kernel}/lib/firmware" ];
};
};
}

View File

@ -1,33 +1,7 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption;
inherit (builtins) head tail;
obsolete = what: f: name:
if builtins ? trace then
builtins.trace "${name}: Obsolete ${what}." f name
else f name;
obsoleteMerge =
obsolete "option" pkgs.lib.mergeDefaultOption;
# temporary modifications.
# backward here means that expression could either be a value or a
# function which expects to have a pkgs argument.
optionalPkgs = name: x:
if builtins.isFunction x
then obsolete "notation" (name: x pkgs) name
else x;
backwardPkgsFunListMerge = name: list:
pkgs.lib.concatMap (optionalPkgs name) list;
backwardPkgsFunMerge = name: list:
if list != [] && tail list == []
then optionalPkgs name (head list)
else abort "${name}: Defined at least twice.";
inherit (pkgs.lib) mkOption mergeOneOption;
in
{
@ -64,51 +38,6 @@ in
";
};
kernelPackages = mkOption {
default = pkgs.kernelPackages;
example = pkgs.kernelPackages_2_6_25;
merge = backwardPkgsFunMerge;
description = "
This option allows you to override the Linux kernel used by
NixOS. Since things like external kernel module packages are
tied to the kernel you're using, it also overrides those.
This option is a function that takes Nixpkgs as an argument
(as a convenience), and returns an attribute set containing at
the very least an attribute <varname>kernel</varname>.
Additional attributes may be needed depending on your
configuration. For instance, if you use the NVIDIA X driver,
then it also needs to contain an attribute
<varname>nvidiaDrivers</varname>.
";
};
kernelParams = mkOption {
default = [
"selinux=0"
"apm=on"
"acpi=on"
"vga=0x317"
"console=tty1"
"splash=verbose"
];
description = "
The kernel parameters. If you want to add additional
parameters, it's best to set
<option>boot.extraKernelParams</option>.
";
};
extraKernelParams = mkOption {
default = [
];
example = [
"debugtrace"
];
description = "
Additional user-defined kernel parameters.
";
};
hardwareScan = mkOption {
default = true;
description = "
@ -121,89 +50,8 @@ in
";
};
extraModulePackages = mkOption {
default = [];
# !!! example = [pkgs.aufs pkgs.nvidiaDrivers];
description = ''
A list of additional packages supplying kernel modules.
'';
merge = backwardPkgsFunListMerge;
};
kernelModules = mkOption {
default = [];
description = "
The set of kernel modules to be loaded in the second stage of
the boot process. That is, these modules are not included in
the initial ramdisk, so they'd better not be required for
mounting the root file system. Add them to
<option>boot.initrd.extraKernelModules</option> if they are.
";
};
initrd = {
kernelModules = mkOption {
default = [
# Note: most of these (especially the SATA/PATA modules)
# shouldn't be included by default since nixos-hardware-scan
# detects them, but I'm keeping them for now for backwards
# compatibility.
# Some SATA/PATA stuff.
"ahci"
"sata_nv"
"sata_via"
"sata_sis"
"sata_uli"
"ata_piix"
"pata_marvell"
# Standard SCSI stuff.
"sd_mod"
"sr_mod"
# Standard IDE stuff.
"ide_cd"
"ide_disk"
"ide_generic"
# Filesystems.
"ext3"
# Support USB keyboards, in case the boot fails and we only have
# a USB keyboard.
"ehci_hcd"
"ohci_hcd"
"usbhid"
# LVM.
"dm_mod"
];
description = "
The set of kernel modules in the initial ramdisk used during the
boot process. This set must include all modules necessary for
mounting the root device. That is, it should include modules
for the physical device (e.g., SCSI drivers) and for the file
system (e.g., ext3). The set specified here is automatically
closed under the module dependency relation, i.e., all
dependencies of the modules list here are included
automatically. If you want to add additional
modules, it's best to set
<option>boot.initrd.extraKernelModules</option>.
";
};
extraKernelModules = mkOption {
default = [];
description = "
Additional kernel modules for the initial ramdisk. These are
loaded before the modules listed in
<option>boot.initrd.kernelModules</option>, so they take
precedence.
";
};
allowMissing = mkOption {
default = false;
description = ''
@ -295,17 +143,7 @@ in
merge = pkgs.lib.mergeListOption;
# Convert the list of path to only one path.
apply = list: pkgs.aggregateModules (
let
kernelPackages = config.boot.kernelPackages;
kernel = kernelPackages.kernel;
in
[ kernel ]
++ pkgs.lib.optional config.hardware.enableGo7007 kernelPackages.wis_go7007
++ config.boot.extraModulePackages
# should only keep this one, other have to be set by the option owners.
++ list
);
apply = pkgs.aggregateModules;
};
sbin = {
@ -345,21 +183,6 @@ in
};
};
# Hm, this sounds like a catch-all...
hardware = {
enableGo7007 = mkOption {
default = false;
merge = obsoleteMerge;
description = ''
Enable this option to get support for the WIS GO7007SB
multi-format video encoder, which is used in a number of
devices such as the Plextor ConvertX TV402U USB TV device.
'';
};
};
networking = {
@ -411,45 +234,6 @@ in
";
};
enableIntel2200BGFirmware = mkOption {
default = false;
merge = obsoleteMerge;
description = "
Turn on this option if you want firmware for the Intel
PRO/Wireless 2200BG to be loaded automatically. This is
required if you want to use this device. Intel requires you to
accept the license for this firmware, see
<link xlink:href='http://ipw2200.sourceforge.net/firmware.php?fid=7'/>.
";
};
enableIntel3945ABGFirmware = mkOption {
default = false;
merge = obsoleteMerge;
description = "
This option enables automatic loading of the firmware for the Intel
PRO/Wireless 3945ABG.
";
};
enableIntel4965AGNFirmware = mkOption {
default = false;
merge = obsoleteMerge;
description = "
This option enables automatic loading of the firmware for the Intel
PRO/Wireless 4965AGN.
";
};
enableZydasZD1211Firmware = mkOption {
default = false;
merge = obsoleteMerge;
description = "
This option enables automatic loading of the firmware for the Zydas
ZyDAS ZD1211(b) 802.11a/b/g USB WLAN chip.
";
};
localCommands = mkOption {
default = "";
example = "text=anything; echo You can put $text here.";
@ -2346,7 +2130,6 @@ in
extraPackages = mkOption {
default = [];
example = [pkgs.firefox pkgs.thunderbird];
merge = backwardPkgsFunListMerge;
description = "
This option allows you to add additional packages to the system
path. These packages are automatically available to all users,
@ -2363,7 +2146,7 @@ in
nix = mkOption {
default = pkgs.nixUnstable;
example = pkgs.nixCustomFun /root/nix.tar.gz;
merge = backwardPkgsFunMerge;
merge = mergeOneOption;
description = "
Use non-default Nix easily. Be careful, though, not to break everything.
";
@ -2405,6 +2188,7 @@ in
require = [
# boot (is it the right place ?)
(import ../system/kernel.nix)
(import ../boot/boot-stage-2.nix)
(import ../installer/grub.nix)
@ -2435,7 +2219,7 @@ in
(import ../upstart-jobs/hal.nix)
(import ../upstart-jobs/gpm.nix)
(import ../upstart-jobs/nagios/default.nix)
(import ../upstart-jobs/xserver.nix)
(import ../upstart-jobs/xserver/default.nix)
(import ../upstart-jobs/zabbix-agent.nix)
(import ../upstart-jobs/zabbix-server.nix)
(import ../upstart-jobs/disnix.nix)

View File

@ -287,7 +287,7 @@ in
# Set the host name. Don't clear it if it's not configured in the
# NixOS configuration, since it may have been set by dhclient in the
# meantime.
${if config.networking.hostName == "" then
${if config.networking.hostName != "" then
''hostname "${config.networking.hostName}"''
else ''
# dhclient won't do anything if the hostname isn't empty.

View File

@ -11,14 +11,11 @@ rec {
systemPathList
];
noOption = name: values:
abort "${name}: Used without option declaration.";
# Make a configuration object from which we can retrieve option
# values.
config =
pkgs.lib.fixOptionSets
(pkgs.lib.mergeOptionSets noOption)
pkgs.lib.newMergeOptionSets
pkgs configComponents;
optionDeclarations =
@ -158,7 +155,6 @@ rec {
++ pkgs.lib.optional config.networking.defaultMailServer.directDelivery pkgs.ssmtp
++ config.environment.extraPackages
++ pkgs.lib.optional config.fonts.enableFontDir fontDir
++ pkgs.lib.optional config.hardware.enableGo7007 kernelPackages.wis_go7007
# NSS modules need to be in `systemPath' so that (i) the builder
# chroot gets to seem them, and (ii) applications can benefit from

View File

@ -147,16 +147,8 @@ let
inherit modprobe config;
inherit (pkgs) stdenv writeText substituteAll udev procps;
inherit (pkgs.lib) cleanSource;
firmwareDirs =
pkgs.lib.optional config.networking.enableIntel2200BGFirmware pkgs.ipw2200fw
++ pkgs.lib.optional config.networking.enableIntel3945ABGFirmware pkgs.iwlwifi3945ucode
++ pkgs.lib.optional config.networking.enableIntel4965AGNFirmware kernelPackages.iwlwifi4965ucode
++ pkgs.lib.optional config.networking.enableZydasZD1211Firmware pkgs.zd1211fw
++ pkgs.lib.optional config.hardware.enableGo7007 "${kernelPackages.wis_go7007}/firmware"
++ config.services.udev.addFirmware;
extraUdevPkgs =
pkgs.lib.optional config.hardware.enableGo7007 kernelPackages.wis_go7007
++ config.services.udev.addUdevPkgs;
firmwareDirs = config.services.udev.addFirmware;
extraUdevPkgs = config.services.udev.addUdevPkgs;
})
# Makes LVM logical volumes available.

View File

@ -1,5 +1,5 @@
# Disnix server
{config, pkgs}:
{config, pkgs, ...}:
###### interface
let

View File

@ -1,4 +1,4 @@
{pkgs, config}:
{pkgs, config, ...}:
###### interface
let

View File

@ -66,6 +66,7 @@ let
";
};
/*
sessionType = mkOption {
default = "gnome";
example = "xterm";
@ -91,14 +92,6 @@ let
";
};
renderingFlag = mkOption {
default = "";
example = "--indirect-rendering";
description = "
Possibly pass --indierct-rendering to Compiz.
";
};
sessionStarter = mkOption {
example = "${pkgs.xterm}/bin/xterm -ls";
description = "
@ -107,6 +100,7 @@ let
<option>services.xserver.sessionType</option> is empty.
";
};
*/
startSSHAgent = mkOption {
default = true;
@ -118,41 +112,6 @@ let
";
};
slim = {
theme = mkOption {
default = null;
example = pkgs.fetchurl {
url = http://download.berlios.de/slim/slim-wave.tar.gz;
sha256 = "0ndr419i5myzcylvxb89m9grl2xyq6fbnyc3lkd711mzlmnnfxdy";
};
description = "
The theme for the SLiM login manager. If not specified, SLiM's
default theme is used. See <link
xlink:href='http://slim.berlios.de/themes01.php'/> for a
collection of themes.
";
};
defaultUser = mkOption {
default = "";
example = "login";
description = "
The default user to load. If you put a username here you
get it automatically loaded into the username field, and
the focus is placed on the password.
";
};
hideCursor = mkOption {
default = false;
example = true;
description = "
Hide the mouse cursor on the login screen.
";
};
};
isClone = mkOption {
default = true;
example = false;
@ -327,7 +286,6 @@ let
# Abbreviations.
cfg = config.services.xserver;
xorg = cfg.package;
gnome = pkgs.gnome;
stdenv = pkgs.stdenv;
knownVideoDrivers = {
@ -344,25 +302,9 @@ let
# Get a bunch of user settings.
videoDriver = cfg.videoDriver;
resolutions = map (res: ''"${toString res.x}x${toString res.y}"'') (cfg.resolutions);
sessionType = cfg.sessionType;
videoDriverModules = getAttr [ videoDriver ] (throw "unkown video driver : \"${videoDriver}\"") knownVideoDrivers;
sessionCmd =
if sessionType == "" then cfg.sessionStarter else
if sessionType == "xterm" then "${pkgs.xterm}/bin/xterm -ls" else
if sessionType == "gnome" then "${gnome.gnometerminal}/bin/gnome-terminal -ls" else
abort ("unknown session type ${sessionType}");
windowManager =
let wm = cfg.windowManager; in
if wm != "" then wm else
if sessionType == "gnome" then "metacity" else
if sessionType == "kde" then "none" /* started by startkde */ else
"twm";
modules =
getAttr ["modulesFirst"] [] videoDriverModules
@ -518,240 +460,7 @@ let
};
clientScript = pkgs.writeText "xclient" ''
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
### Start a window manager.
${if windowManager == "twm" then ''
${xorg.twm}/bin/twm &
''
else if windowManager == "metacity" then ''
env LD_LIBRARY_PATH=${xorg.libX11}/lib:${xorg.libXext}/lib:/usr/lib/
# !!! Hack: load the schemas for Metacity.
GCONF_CONFIG_SOURCE=xml::~/.gconf ${gnome.GConf}/bin/gconftool-2 \
--makefile-install-rule ${gnome.metacity}/etc/gconf/schemas/*.schemas # */
${gnome.metacity}/bin/metacity &
''
else if windowManager == "kwm" then ''
${pkgs.kdebase}/bin/kwin &
''
else if windowManager == "compiz" then ''
# !!! Hack: load the schemas for Compiz.
GCONF_CONFIG_SOURCE=xml::~/.gconf ${gnome.GConf}/bin/gconftool-2 \
--makefile-install-rule ${pkgs.compiz}/etc/gconf/schemas/*.schemas # */
# !!! Hack: turn on most Compiz modules.
${gnome.GConf}/bin/gconftool-2 -t list --list-type=string \
--set /apps/compiz/general/allscreens/options/active_plugins \
[gconf,png,decoration,wobbly,fade,minimize,move,resize,cube,switcher,rotate,place,scale,water]
# Start Compiz and the GTK-style window decorator.
env LD_LIBRARY_PATH=${xorg.libX11}/lib:${xorg.libXext}/lib:/usr/lib/
${pkgs.compiz}/bin/compiz gconf ${cfg.renderingFlag} &
${pkgs.compiz}/bin/gtk-window-decorator --sync &
''
else if windowManager == "xmonad" then ''
${pkgs.xmonad}/bin/xmonad &
''
else if windowManager == "none" then ''
# The session starter will start the window manager.
''
else abort ("unknown window manager " + windowManager)}
### Show a background image.
# (but not if we're starting a full desktop environment that does it for us)
${if sessionType != "kde" then ''
if test -e $HOME/.background-image; then
${pkgs.feh}/bin/feh --bg-scale $HOME/.background-image
fi
'' else ""}
### Start the session.
${if sessionType == "kde" then ''
# Start KDE.
export KDEDIRS=$HOME/.nix-profile:/nix/var/nix/profiles/default:${pkgs.kdebase}:${pkgs.kdelibs}
export XDG_CONFIG_DIRS=${pkgs.kdebase}/etc/xdg:${pkgs.kdelibs}/etc/xdg
export XDG_DATA_DIRS=${pkgs.kdebase}/share
exec ${pkgs.kdebase}/bin/startkde
'' else ''
# For all other session types, we currently just start a
# terminal of the kind indicated by sessionCmd.
# !!! yes, this means that you 'log out' by killing the X server.
while ${sessionCmd}; do
sleep 1
done
''}
'';
xserverArgs = [
"-ac"
"-logverbose"
"-verbose"
"-terminate"
"-logfile" "/var/log/X.${toString cfg.display}.log"
"-config ${configFile}"
":${toString cfg.display}" "vt${toString cfg.tty}"
"-xkbdir" "${pkgs.xkeyboard_config}/etc/X11/xkb"
] ++ optional (!config.services.xserver.tcpEnable) "-nolisten tcp";
slimConfig = pkgs.writeText "slim.cfg" ''
xauth_path ${xorg.xauth}/bin/xauth
default_xserver ${xorg.xorgserver}/bin/X
xserver_arguments ${toString xserverArgs}
login_cmd exec ${stdenv.bash}/bin/sh ${clientScript}
halt_cmd ${pkgs.upstart}/sbin/shutdown -h now
reboot_cmd ${pkgs.upstart}/sbin/shutdown -r now
${if cfg.slim.defaultUser != "" then "default_user " + cfg.slim.defaultUser else ""}
${if cfg.slim.hideCursor then "hidecursor true" else ""}
'';
# Unpack the SLiM theme, or use the default.
slimThemesDir =
let
unpackedTheme = stdenv.mkDerivation {
name = "slim-theme";
buildCommand = ''
ensureDir $out
cd $out
unpackFile ${cfg.slim.theme}
ln -s * default
'';
};
in if cfg.slim.theme == null then "${pkgs.slim}/share/slim/themes" else unpackedTheme;
nvidiaDrivers = (config.boot.kernelPackages pkgs).nvidiaDrivers;
oldJob = rec {
# Warning the indentation is wrong since here in order to don't produce noise in diffs.
name = "xserver";
extraPath = [
xorg.xrandr
xorg.xrdb
xorg.setxkbmap
xorg.iceauth # required for KDE applications (it's called by dcopserver)
pkgs.feh
]
++ optional (windowManager == "twm") [
xorg.twm
]
++ optional (windowManager == "metacity") [
gnome.metacity
]
++ optional (windowManager == "compiz") [
pkgs.compiz
]
++ optional (sessionType == "xterm") [
pkgs.xterm
]
++ optional (sessionType == "gnome") [
gnome.gnometerminal
gnome.GConf
gnome.gconfeditor
]
++ optional (sessionType == "kde") [
pkgs.kdelibs
pkgs.kdebase
xorg.xset # used by startkde, non-essential
]
++ optional (videoDriver == "nvidia") [
kernelPackages.nvidiaDrivers
];
extraEtc =
optional (sessionType == "kde")
{ source = "${pkgs.xkeyboard_config}/etc/X11/xkb";
target = "X11/xkb";
}
++
optional cfg.exportConfiguration
{ source = "${configFile}";
target = "X11/xorg.conf";
};
job = ''
start on ${if cfg.autorun then "network-interfaces" else "never"}
start script
rm -f /var/run/opengl-driver
${if videoDriver == "nvidia"
then ''
ln -sf ${kernelPackages.nvidiaDrivers} /var/run/opengl-driver
''
else if cfg.driSupport
then "ln -sf ${pkgs.mesa} /var/run/opengl-driver"
else ""
}
rm -f /var/log/slim.log
end script
env SLIM_CFGFILE=${slimConfig}
env SLIM_THEMESDIR=${slimThemesDir}
env FONTCONFIG_FILE=/etc/fonts/fonts.conf # !!! cleanup
env XKB_BINDIR=${xorg.xkbcomp}/bin # Needed for the Xkb extension.
${if videoDriver == "nvidia"
then "env LD_LIBRARY_PATH=${xorg.libX11}/lib:${xorg.libXext}/lib:${kernelPackages.nvidiaDrivers}/lib"
else ""
}
${if videoDriver != "nvidia"
then "env XORG_DRI_DRIVER_PATH=${pkgs.mesa}/lib/modules/dri"
else ""
}
exec ${pkgs.slim}/bin/slim
'';
};
nvidiaDrivers = (config.boot.kernelPackages pkgs).nvidiaDrivers;
in
@ -759,14 +468,19 @@ mkIf cfg.enable {
require = [
options
# services.xserver.*Manager
(import ./displayManager/default.nix)
(import ./windowManager/default.nix)
(import ./desktopManager/default.nix)
# services.extraJobs
(import ../upstart-jobs/default.nix)
(import ../../upstart-jobs/default.nix)
# environment.etc
(import ../etc/default.nix)
(import ../../etc/default.nix)
# fonts.fonts
(import ../system/fonts.nix)
(import ../../system/fonts.nix)
# boot.extraModulePackages
# security.extraSetuidPrograms
@ -779,29 +493,77 @@ mkIf cfg.enable {
];
};
security = {
extraSetuidPrograms = mkIf (cfg.sessionType == "kde") [
"kcheckpass"
environment = {
etc = mkIf cfg.exportConfiguration [
{ source = "${configFile}";
target = "X11/xorg.conf";
}
];
extraPackages = [
xorg.xrandr
xorg.xrdb
xorg.setxkbmap
xorg.iceauth # required for KDE applications (it's called by dcopserver)
]
++ optional (videoDriver == "nvidia") [
kernelPackages.nvidiaDrivers
];
};
environment = {
etc = [
{ source = ../etc/pam.d/kde;
target = "pam.d/kde";
}
{ source = ../etc/pam.d/slim;
target = "pam.d/slim";
}
] ++ oldJob.extraEtc;
extraPackages =
oldJob.extraPath;
};
services = {
xserver = {
displayManager = {
xserverArgs = [
"-ac"
"-logverbose"
"-verbose"
"-terminate"
"-logfile" "/var/log/X.${toString cfg.display}.log"
"-config ${configFile}"
":${toString cfg.display}" "vt${toString cfg.tty}"
"-xkbdir" "${pkgs.xkeyboard_config}/etc/X11/xkb"
] ++ optional (!cfg.tcpEnable) "-nolisten tcp";
};
};
extraJobs = [{
inherit (oldJob) name job;
name = "xserver";
job = ''
start on ${if cfg.autorun then "network-interfaces" else "never"}
start script
rm -f /var/run/opengl-driver
${if videoDriver == "nvidia"
then ''
ln -sf ${kernelPackages.nvidiaDrivers} /var/run/opengl-driver
''
else if cfg.driSupport
then "ln -sf ${pkgs.mesa} /var/run/opengl-driver"
else ""
}
${cfg.displayManager.job.beforeScript}
end script
${cfg.displayManager.job.env}
env FONTCONFIG_FILE=/etc/fonts/fonts.conf # !!! cleanup
env XKB_BINDIR=${xorg.xkbcomp}/bin # Needed for the Xkb extension.
${if videoDriver == "nvidia"
then "env LD_LIBRARY_PATH=${xorg.libX11}/lib:${xorg.libXext}/lib:${kernelPackages.nvidiaDrivers}/lib"
else ""
}
${if videoDriver != "nvidia"
then "env XORG_DRI_DRIVER_PATH=${pkgs.mesa}/lib/modules/dri"
else ""
}
exec ${cfg.displayManager.job.execCmd}
'';
}];
};
}

View File

@ -0,0 +1,73 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption mergeOneOption mkIf filter optionalString any;
cfg = config.services.xserver.desktopManager;
needBGCond = d: ! (d ? bgSupport && d.bgSupport);
in
{
require = [
(import ./kde.nix)
(import ./gnome.nix)
(import ./xterm.nix)
(import ./none.nix)
];
services = {
xserver = {
displayManager = {
session = cfg.session.list;
};
desktopManager = {
session = mkOption {
default = [];
example = [{
name = "kde";
bgSupport = true;
start = "...";
}];
description = "
Internal option used to add some common line to desktop manager
scripts before forwarding the value to the
<varname>displayManager</varname>.
";
apply = list: {
list = map (d: d // {
manage = "desktop";
start = d.start
+ optionalString (needBGCond d) ''
if test -e $HOME/.background-image; then
${pkgs.feh}/bin/feh --bg-scale $HOME/.background-image
fi
'';
}) list;
needBGPackages = [] != filter needBGCond list;
};
};
default = mkOption {
default = "xterm";
example = "none";
description = "
Default desktop manager loaded if none have been chosen.
";
merge = list:
let defaultDM = mergeOneOption list; in
if any (w: w.name == defaultDM) cfg.session.list then
defaultDM
else
throw "Default desktop manager not found.";
};
};
};
};
environment = mkIf cfg.session.needBGPackages {
extraPackages = [ pkgs.feh ];
};
}

View File

@ -0,0 +1,47 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.desktopManager.gnome;
gnome = pkgs.gnome;
options = { services = { xserver = { desktopManager = {
gnome = {
enable = mkOption {
default = false;
example = true;
description = "Enable a gnome terminal as a desktop manager.";
};
};
}; }; }; };
in
mkIf cfg.enable {
require = options;
services = {
xserver = {
desktopManager = {
session = [{
name = "gnome";
start = ''
${gnome.gnometerminal}/bin/gnome-terminal -ls &
waitPID=$!
'';
}];
};
};
};
environment = {
extraPackages = [
gnome.gnometerminal
gnome.GConf
gnome.gconfeditor
];
};
}

View File

@ -0,0 +1,65 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.desktopManager.kde;
xorg = config.services.xserver.package;
options = { services = { xserver = { desktopManager = {
kde = {
enable = mkOption {
default = false;
example = true;
description = "Enable the kde desktop manager.";
};
};
}; }; }; };
in
mkIf cfg.enable {
require = options;
services = {
xserver = {
desktopManager = {
session = [{
name = "kde";
start = ''
# Start KDE.
export KDEDIRS=$HOME/.nix-profile:/nix/var/nix/profiles/default:${pkgs.kdebase}:${pkgs.kdelibs}
export XDG_CONFIG_DIRS=${pkgs.kdebase}/etc/xdg:${pkgs.kdelibs}/etc/xdg
export XDG_DATA_DIRS=${pkgs.kdebase}/share
exec ${pkgs.kdebase}/bin/startkde
'';
}];
};
};
};
security = {
extraSetuidPrograms = [
"kcheckpass"
];
};
environment = {
extraPackages = [
pkgs.kdelibs
pkgs.kdebase
xorg.xset # used by startkde, non-essential
];
etc = [
{ source = ../../../etc/pam.d/kde;
target = "pam.d/kde";
}
{ source = "${pkgs.xkeyboard_config}/etc/X11/xkb";
target = "X11/xkb";
}
];
};
}

View File

@ -0,0 +1,14 @@
{
services = {
xserver = {
desktopManager = {
session = [{
name = "none";
start = "";
}];
};
};
};
}

View File

@ -0,0 +1,44 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.desktopManager.xterm;
options = { services = { xserver = { desktopManager = {
xterm = {
enable = mkOption {
default = false;
example = true;
description = "Enable a xterm terminal as a desktop manager.";
};
};
}; }; }; };
in
mkIf cfg.enable {
require = options;
services = {
xserver = {
desktopManager = {
session = [{
name = "xterm";
start = ''
${pkgs.xterm}/bin/xterm -ls &
waitPID=$!
'';
}];
};
};
};
environment = {
extraPackages = [
pkgs.xterm
];
};
}

View File

@ -0,0 +1,167 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption mergeOneOption optionals filter concatMap concatMapStrings;
cfg = config.services.xserver;
xorg = cfg.package;
# file provided by services.xserver.displayManager.session.script
xsession = wm: dm: pkgs.writeText "xsession" ''
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
'';
in
{
# list of display managers.
require = [
(import ./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;
script = xsession wm dm;
};
};
job = mkOption {
default = {};
example = {
beforeScript = ''
rm -f /var/log/slim.log
'';
env = ''
env 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;
};
};
};
};
}

View File

@ -0,0 +1,112 @@
{pkgs, config, ...}:
###### interface
let
inherit (pkgs.lib) mkOption;
options = { services = { xserver = {
slim = {
theme = mkOption {
default = null;
example = pkgs.fetchurl {
url = http://download.berlios.de/slim/slim-wave.tar.gz;
sha256 = "0ndr419i5myzcylvxb89m9grl2xyq6fbnyc3lkd711mzlmnnfxdy";
};
description = "
The theme for the SLiM login manager. If not specified, SLiM's
default theme is used. See <link
xlink:href='http://slim.berlios.de/themes01.php'/> for a
collection of themes.
";
};
defaultUser = mkOption {
default = "";
example = "login";
description = "
The default user to load. If you put a username here you
get it automatically loaded into the username field, and
the focus is placed on the password.
";
};
hideCursor = mkOption {
default = false;
example = true;
description = "
Hide the mouse cursor on the login screen.
";
};
};
}; /* xserver */ }; /* services */ };
in
###### implementation
let
xcfg = config.services.xserver;
dmcfg = xcfg.displayManager;
cfg = xcfg.slim;
slimConfig = pkgs.writeText "slim.cfg" ''
xauth_path ${dmcfg.xauthBin}
default_xserver ${dmcfg.xserverBin}
xserver_arguments ${dmcfg.xserverArgs}
sessions ${pkgs.lib.concatStringsSep "," dmcfg.session.names}
login_cmd exec ${pkgs.stdenv.bash}/bin/sh ${dmcfg.session.script} "%session"
halt_cmd ${pkgs.upstart}/sbin/shutdown -h now
reboot_cmd ${pkgs.upstart}/sbin/shutdown -r now
${if cfg.defaultUser != "" then "default_user " + cfg.defaultUser else ""}
${if cfg.hideCursor then "hidecursor true" else ""}
'';
# Unpack the SLiM theme, or use the default.
slimThemesDir =
let
unpackedTheme = pkgs.stdenv.mkDerivation {
name = "slim-theme";
buildCommand = ''
ensureDir $out
cd $out
unpackFile ${cfg.theme}
ln -s * default
'';
};
in if cfg.theme == null then "${pkgs.slim}/share/slim/themes" else unpackedTheme;
in
{
require = [
options
];
services = {
xserver = {
displayManager = {
job = {
beforeScript = ''
rm -f /var/log/slim.log
'';
env = ''
env SLIM_CFGFILE=${slimConfig}
env SLIM_THEMESDIR=${slimThemesDir}
'';
execCmd = "${pkgs.slim}/bin/slim";
};
};
};
};
environment = {
etc = [
{ source = ../../../etc/pam.d/slim;
target = "pam.d/slim";
}
];
};
}

View File

@ -0,0 +1,64 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.windowManager.compiz;
xorg = config.services.xserver.package;
gnome = pkgs.gnome;
options = { services = { xserver = { windowManager = {
compiz = {
enable = mkOption {
default = false;
example = true;
description = "Enable the compiz window manager.";
};
renderingFlag = mkOption {
default = "";
example = "--indirect-rendering";
description = "
Possibly pass --indierct-rendering to Compiz.
";
};
};
}; }; }; };
in
mkIf cfg.enable {
require = options;
services = {
xserver = {
windowManager = {
session = [{
name = "compiz";
start = ''
# !!! Hack: load the schemas for Compiz.
GCONF_CONFIG_SOURCE=xml::~/.gconf ${gnome.GConf}/bin/gconftool-2 \
--makefile-install-rule ${pkgs.compiz}/etc/gconf/schemas/*.schemas # */
# !!! Hack: turn on most Compiz modules.
${gnome.GConf}/bin/gconftool-2 -t list --list-type=string \
--set /apps/compiz/general/allscreens/options/active_plugins \
[gconf,png,decoration,wobbly,fade,minimize,move,resize,cube,switcher,rotate,place,scale,water]
# Start Compiz and the GTK-style window decorator.
env LD_LIBRARY_PATH=${xorg.libX11}/lib:${xorg.libXext}/lib:/usr/lib/
${pkgs.compiz}/bin/compiz gconf ${cfg.renderingFlag} &
${pkgs.compiz}/bin/gtk-window-decorator --sync &
'';
}];
};
};
};
environment = {
extraPackages = [ pkgs.compiz ];
};
}

View File

@ -0,0 +1,58 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption mergeOneOption any;
cfg = config.services.xserver.windowManager;
in
{
require = [
(import ./compiz.nix)
(import ./kwm.nix)
(import ./metacity.nix)
(import ./none.nix)
(import ./twm.nix)
(import ./wmii.nix)
(import ./xmonad.nix)
];
services = {
xserver = {
displayManager = {
session = cfg.session;
};
windowManager = {
session = mkOption {
default = [];
example = [{
name = "wmii";
start = "...";
}];
description = "
Internal option used to add some common line to window manager
scripts before forwarding the value to the
<varname>displayManager</varname>.
";
apply = map (d: d // {
manage = "window";
});
};
default = mkOption {
default = "none";
example = "wmii";
description = "
Default window manager loaded if none have been chosen.
";
merge = list:
let defaultWM = mergeOneOption list; in
if any (w: w.name == defaultWM) cfg.session then
defaultWM
else
throw "Default window manager not found.";
};
};
};
};
}

View File

@ -0,0 +1,46 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.windowManager.kwm;
option = { services = { xserver = { windowManager = {
kwm = {
enable = mkOption {
default = false;
example = true;
description = "Enable the kwm window manager.";
};
};
}; }; }; };
in
mkIf cfg.enable {
require = option;
services = {
xserver = {
windowManager = {
session = [{
name = "kwm";
start = "
${pkgs.kdebase}/bin/kwin &
waitPID=$!
";
}];
};
};
};
environment = {
extraPackages = [
pkgs.kdelibs
pkgs.kdebase
];
};
}

View File

@ -0,0 +1,49 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.windowManager.metacity;
xorg = config.services.xserver.package;
gnome = pkgs.gnome;
option = { services = { xserver = { windowManager = {
metacity = {
enable = mkOption {
default = false;
example = true;
description = "Enable the metacity window manager.";
};
};
}; }; }; };
in
mkIf cfg.enable {
require = option;
services = {
xserver = {
windowManager = {
session = [{
name = "metacity";
start = ''
env LD_LIBRARY_PATH=${xorg.libX11}/lib:${xorg.libXext}/lib:/usr/lib/
# !!! Hack: load the schemas for Metacity.
GCONF_CONFIG_SOURCE=xml::~/.gconf ${gnome.GConf}/bin/gconftool-2 \
--makefile-install-rule ${gnome.metacity}/etc/gconf/schemas/*.schemas # */
${gnome.metacity}/bin/metacity &
waitPID=$!
'';
}];
};
};
};
environment = {
extraPackages = [ gnome.metacity ];
};
}

View File

@ -0,0 +1,12 @@
{
services = {
xserver = {
windowManager = {
session = [{
name = "none";
start = "";
}];
};
};
};
}

View File

@ -0,0 +1,44 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.windowManager.twm;
xorg = config.services.xserver.package;
option = { services = { xserver = { windowManager = {
twm = {
enable = mkOption {
default = false;
example = true;
description = "Enable the twm window manager.";
};
};
}; }; }; };
in
mkIf cfg.enable {
require = option;
services = {
xserver = {
windowManager = {
session = [{
name = "twm";
start = "
${xorg.twm}/bin/twm &
waitPID=$!
";
}];
};
};
};
environment = {
extraPackages = [ xorg.twm ];
};
}

View File

@ -0,0 +1,32 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.windowManager.wmii;
in
{
services = {
xserver = {
windowManager = {
wmii = {
enable = mkOption {
default = false;
example = true;
description = "Enable the wmii window manager.";
};
};
session = mkIf cfg.enable [{
name = "wmii";
start = "
${pkgs.wmiiSnap}/bin/wmii &
waitPID=$!
";
}];
};
};
};
}

View File

@ -0,0 +1,32 @@
{pkgs, config, ...}:
let
inherit (pkgs.lib) mkOption mkIf;
cfg = config.services.xserver.windowManager.xmonad;
in
{
services = {
xserver = {
windowManager = {
xmonad = {
enable = mkOption {
default = false;
example = true;
description = "Enable the xmonad window manager.";
};
};
session = mkIf cfg.enable [{
name = "xmonad";
start = "
${pkgs.xmonad}/bin/xmonad &
waitPID=$!
";
}];
};
};
};
}

View File

@ -1,5 +1,5 @@
# Zabbix agent daemon.
{config, pkgs}:
{config, pkgs, ...}:
###### interface
let

View File

@ -1,5 +1,5 @@
# Zabbix server daemon.
{config, pkgs}:
{config, pkgs, ...}:
###### interface
let