2010-05-31 00:00:52 +02:00
|
|
|
|
{ config, pkgs, pkgs_i686, ... }:
|
2006-11-28 23:27:56 +01:00
|
|
|
|
|
2009-05-24 20:28:30 +02:00
|
|
|
|
with pkgs.lib;
|
|
|
|
|
|
2009-01-02 17:07:21 +01:00
|
|
|
|
let
|
2006-11-28 23:27:56 +01:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
kernelPackages = config.boot.kernelPackages;
|
2006-11-28 23:27:56 +01:00
|
|
|
|
|
2008-01-04 11:54:33 +01:00
|
|
|
|
# Abbreviations.
|
|
|
|
|
cfg = config.services.xserver;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
xorg = pkgs.xorg;
|
|
|
|
|
|
2008-01-04 11:54:33 +01:00
|
|
|
|
|
2009-11-06 01:59:03 +01:00
|
|
|
|
# Map video driver names to driver packages.
|
2008-10-10 18:45:56 +02:00
|
|
|
|
knownVideoDrivers = {
|
2010-05-18 21:36:11 +02:00
|
|
|
|
ati_unfree = { modules = [ kernelPackages.ati_drivers_x11 ]; driverName = "fglrx"; };
|
2012-03-20 17:29:22 +01:00
|
|
|
|
nouveau = { modules = [ pkgs.xf86_video_nouveau ]; };
|
2009-11-06 01:59:03 +01:00
|
|
|
|
nvidia = { modules = [ kernelPackages.nvidia_x11 ]; };
|
2010-08-25 00:00:18 +02:00
|
|
|
|
nvidiaLegacy173 = { modules = [ kernelPackages.nvidia_x11_legacy173 ]; driverName = "nvidia"; };
|
2012-12-13 11:36:18 +01:00
|
|
|
|
nvidiaLegacy304 = { modules = [ kernelPackages.nvidia_x11_legacy304 ]; driverName = "nvidia"; };
|
2009-11-06 01:59:03 +01:00
|
|
|
|
unichrome = { modules = [ pkgs.xorgVideoUnichrome ]; };
|
2009-11-06 10:22:00 +01:00
|
|
|
|
virtualbox = { modules = [ kernelPackages.virtualboxGuestAdditions ]; driverName = "vboxvideo"; };
|
2008-10-10 18:45:56 +02:00
|
|
|
|
};
|
|
|
|
|
|
2009-11-06 01:59:03 +01:00
|
|
|
|
driverNames =
|
|
|
|
|
optional (cfg.videoDriver != null) cfg.videoDriver ++ cfg.videoDrivers;
|
2007-03-06 01:07:00 +01:00
|
|
|
|
|
2009-11-06 01:59:03 +01:00
|
|
|
|
drivers = flip map driverNames
|
2009-11-06 10:22:00 +01:00
|
|
|
|
(name: { inherit name; driverName = name; } //
|
2012-03-20 00:57:26 +01:00
|
|
|
|
attrByPath [name] (if (hasAttr ("xf86video" + name) xorg) then { modules = [(getAttr ("xf86video" + name) xorg) ]; } else throw "unknown video driver `${name}'") knownVideoDrivers);
|
2008-01-04 11:54:33 +01:00
|
|
|
|
|
2008-08-27 12:00:49 +02:00
|
|
|
|
fontsForXServer =
|
2009-09-10 14:37:33 +02:00
|
|
|
|
config.fonts.fonts ++
|
2008-08-27 12:00:49 +02:00
|
|
|
|
# We don't want these fonts in fonts.conf, because then modern,
|
|
|
|
|
# fontconfig-based applications will get horrible bitmapped
|
|
|
|
|
# Helvetica fonts. It's better to get a substitution (like Nimbus
|
|
|
|
|
# Sans) than that horror. But we do need the Adobe fonts for some
|
|
|
|
|
# old non-fontconfig applications. (Possibly this could be done
|
|
|
|
|
# better using a fontconfig rule.)
|
|
|
|
|
[ pkgs.xorg.fontadobe100dpi
|
|
|
|
|
pkgs.xorg.fontadobe75dpi
|
|
|
|
|
];
|
2009-06-26 01:29:49 +02:00
|
|
|
|
|
2013-01-24 13:06:32 +01:00
|
|
|
|
|
2013-01-10 00:31:08 +01:00
|
|
|
|
# Just enumerate all heads without discarding XRandR output information.
|
|
|
|
|
xrandrHeads = let
|
|
|
|
|
mkHead = num: output: {
|
|
|
|
|
name = "multihead${toString num}";
|
|
|
|
|
inherit output;
|
|
|
|
|
};
|
|
|
|
|
in imap mkHead cfg.xrandrHeads;
|
|
|
|
|
|
|
|
|
|
xrandrDeviceSection = flip concatMapStrings xrandrHeads (h: ''
|
|
|
|
|
Option "monitor-${h.output}" "${h.name}"
|
|
|
|
|
'');
|
|
|
|
|
|
|
|
|
|
# Here we chain every monitor from the left to right, so we have:
|
|
|
|
|
# m4 right of m3 right of m2 right of m1 .----.----.----.----.
|
|
|
|
|
# Which will end up in reverse ----------> | m1 | m2 | m3 | m4 |
|
|
|
|
|
# `----^----^----^----'
|
|
|
|
|
xrandrMonitorSections = let
|
|
|
|
|
mkMonitor = previous: current: previous ++ singleton {
|
|
|
|
|
inherit (current) name;
|
|
|
|
|
value = ''
|
|
|
|
|
Section "Monitor"
|
|
|
|
|
Identifier "${current.name}"
|
|
|
|
|
${optionalString (previous != []) ''
|
|
|
|
|
Option "RightOf" "${(head previous).name}"
|
|
|
|
|
''}
|
|
|
|
|
EndSection
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
monitors = foldl mkMonitor [] xrandrHeads;
|
|
|
|
|
in concatMapStrings (getAttr "value") monitors;
|
2009-06-26 01:29:49 +02:00
|
|
|
|
|
2013-01-24 13:06:32 +01:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
configFile = pkgs.stdenv.mkDerivation {
|
2006-11-28 23:27:56 +01:00
|
|
|
|
name = "xserver.conf";
|
2009-09-10 14:37:33 +02:00
|
|
|
|
|
|
|
|
|
xfs = optionalString (cfg.useXFS != false)
|
2008-01-04 11:28:12 +01:00
|
|
|
|
''FontPath "${toString cfg.useXFS}"'';
|
2007-12-25 13:16:38 +01:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
inherit (cfg) config;
|
|
|
|
|
|
|
|
|
|
buildCommand =
|
|
|
|
|
''
|
|
|
|
|
echo 'Section "Files"' >> $out
|
|
|
|
|
echo $xfs >> $out
|
|
|
|
|
|
|
|
|
|
for i in ${toString fontsForXServer}; do
|
|
|
|
|
if test "''${i:0:''${#NIX_STORE}}" == "$NIX_STORE"; then
|
|
|
|
|
for j in $(find $i -name fonts.dir); do
|
|
|
|
|
echo " FontPath \"$(dirname $j)\"" >> $out
|
|
|
|
|
done
|
|
|
|
|
fi
|
|
|
|
|
done
|
2011-09-14 20:20:50 +02:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
for i in $(find ${toString cfg.modules} -type d); do
|
|
|
|
|
if test $(echo $i/*.so* | wc -w) -ne 0; then
|
|
|
|
|
echo " ModulePath \"$i\"" >> $out
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
echo 'EndSection' >> $out
|
2011-09-14 20:20:50 +02:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
echo "$config" >> $out
|
|
|
|
|
''; # */
|
2006-11-28 23:27:56 +01:00
|
|
|
|
};
|
|
|
|
|
|
2009-01-02 17:07:21 +01:00
|
|
|
|
in
|
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
{
|
2009-05-15 09:51:51 +02:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
imports =
|
|
|
|
|
[ ./display-managers/default.nix
|
|
|
|
|
./window-managers/default.nix
|
|
|
|
|
./desktop-managers/default.nix
|
|
|
|
|
];
|
2009-05-15 09:51:51 +02:00
|
|
|
|
|
2009-01-02 17:07:21 +01:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
###### interface
|
2011-09-14 20:20:50 +02:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
options = {
|
2011-09-14 20:20:50 +02:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
services.xserver = {
|
|
|
|
|
|
|
|
|
|
enable = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.bool;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = false;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to enable the X server.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-25 16:49:08 +01:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
autorun = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.bool;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = true;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to start the X server automatically.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-02 17:07:21 +01:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
exportConfiguration = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.bool;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = false;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to symlink the X server configuration under
|
|
|
|
|
<filename>/etc/X11/xorg.conf</filename>.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-02 17:07:21 +01:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
enableTCP = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.bool;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = false;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to allow the X server to accept TCP connections.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-02 17:07:39 +01:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
modules = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.listOf types.path;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = [];
|
2010-04-15 17:46:38 +02:00
|
|
|
|
example = [ pkgs.xf86_input_wacom ];
|
2009-09-10 14:37:33 +02:00
|
|
|
|
description = "Packages to be added to the module search path of the X server.";
|
|
|
|
|
};
|
2009-01-02 17:07:21 +01:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
resolutions = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.listOf types.attrs;
|
2009-11-06 01:59:03 +01:00
|
|
|
|
default = [];
|
2010-08-09 22:10:16 +02:00
|
|
|
|
example = [ { x = 1600; y = 1200; } { x = 1024; y = 786; } ];
|
2009-09-10 14:37:33 +02:00
|
|
|
|
description = ''
|
2009-11-06 01:59:03 +01:00
|
|
|
|
The screen resolutions for the X server. The first element
|
|
|
|
|
is the default resolution. If this list is empty, the X
|
|
|
|
|
server will automatically configure the resolution.
|
2009-09-10 14:37:33 +02:00
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-02 17:07:21 +01:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
videoDriver = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.nullOr types.str;
|
2009-11-06 01:59:03 +01:00
|
|
|
|
default = null;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
example = "i810";
|
|
|
|
|
description = ''
|
2009-11-06 01:59:03 +01:00
|
|
|
|
The name of the video driver for your graphics card. This
|
|
|
|
|
option is obsolete; please set the
|
|
|
|
|
<option>videoDrivers</option> instead.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
videoDrivers = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.listOf types.str;
|
2013-03-01 18:05:00 +01:00
|
|
|
|
# !!! We'd like "nv" here, but it segfaults the X server.
|
2013-03-01 02:53:08 +01:00
|
|
|
|
default = [ "ati" "cirrus" "intel" "vesa" "vmware" ];
|
2009-11-06 01:59:03 +01:00
|
|
|
|
example = [ "vesa" ];
|
|
|
|
|
description = ''
|
|
|
|
|
The names of the video drivers that the X server should
|
|
|
|
|
support. The X server will try all of the drivers listed
|
|
|
|
|
here until it finds one that supports your video card.
|
2009-09-10 14:37:33 +02:00
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-02 17:07:21 +01:00
|
|
|
|
|
2013-01-30 20:22:40 +01:00
|
|
|
|
vaapiDrivers = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.listOf types.path;
|
2013-02-04 15:48:28 +01:00
|
|
|
|
default = [ ];
|
2013-01-30 20:22:40 +01:00
|
|
|
|
example = "[ pkgs.vaapiIntel pkgs.vaapiVdpau ]";
|
|
|
|
|
description = ''
|
2013-02-04 15:48:28 +01:00
|
|
|
|
Packages providing libva acceleration drivers.
|
2013-01-30 20:22:40 +01:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
driSupport = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.bool;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = true;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to enable accelerated OpenGL rendering through the
|
|
|
|
|
Direct Rendering Interface (DRI).
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-06-26 00:08:03 +02:00
|
|
|
|
|
2010-05-31 00:00:52 +02:00
|
|
|
|
driSupport32Bit = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.bool;
|
2010-05-31 00:00:52 +02:00
|
|
|
|
default = false;
|
|
|
|
|
description = ''
|
|
|
|
|
On 64-bit systems, whether to support Direct Rendering for
|
|
|
|
|
32-bit applications (such as Wine). This is currently only
|
2013-02-19 18:28:25 +01:00
|
|
|
|
supported for the <literal>nvidia</literal> driver and for
|
|
|
|
|
<literal>mesa</literal>.
|
2010-05-31 00:00:52 +02:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2013-10-18 23:40:45 +02:00
|
|
|
|
s3tcSupport = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.bool;
|
2013-10-18 23:40:45 +02:00
|
|
|
|
default = false;
|
|
|
|
|
description = ''
|
2013-10-21 18:10:37 +02:00
|
|
|
|
Make S3TC(S3 Texture Compression) via libtxc_dxtn available
|
|
|
|
|
to OpenGL drivers. It is essential for many games to work
|
|
|
|
|
with FOSS GPU drivers.
|
|
|
|
|
|
|
|
|
|
Using this library may require a patent license depending on your location.
|
2013-10-18 23:40:45 +02:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-11-22 01:40:53 +01:00
|
|
|
|
startOpenSSHAgent = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.bool;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = true;
|
|
|
|
|
description = ''
|
2009-11-22 01:40:53 +01:00
|
|
|
|
Whether to start the OpenSSH agent when you log in. The OpenSSH agent
|
2009-09-10 14:37:33 +02:00
|
|
|
|
remembers private keys for you so that you don't have to type in
|
|
|
|
|
passphrases every time you make an SSH connection. Use
|
|
|
|
|
<command>ssh-add</command> to add a key to the agent.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-02 17:07:21 +01:00
|
|
|
|
|
2009-11-21 23:14:01 +01:00
|
|
|
|
startGnuPGAgent = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.bool;
|
2009-11-22 15:34:53 +01:00
|
|
|
|
default = false;
|
2009-11-21 23:14:01 +01:00
|
|
|
|
description = ''
|
|
|
|
|
Whether to start the GnuPG agent when you log in. The GnuPG agent
|
|
|
|
|
remembers private keys for you so that you don't have to type in
|
|
|
|
|
passphrases every time you make an SSH connection or sign/encrypt
|
|
|
|
|
data. Use <command>ssh-add</command> to add a key to the agent.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
layout = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.str;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = "us";
|
|
|
|
|
description = ''
|
|
|
|
|
Keyboard layout.
|
|
|
|
|
'';
|
2009-01-25 16:49:08 +01:00
|
|
|
|
};
|
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
xkbModel = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.str;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = "pc104";
|
|
|
|
|
example = "presario";
|
|
|
|
|
description = ''
|
|
|
|
|
Keyboard model.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-06-26 01:29:49 +02:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
xkbOptions = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.str;
|
2010-08-10 14:37:39 +02:00
|
|
|
|
default = "terminate:ctrl_alt_bksp";
|
2009-09-10 14:37:33 +02:00
|
|
|
|
example = "grp:caps_toggle, grp_led:scroll";
|
|
|
|
|
description = ''
|
|
|
|
|
X keyboard options; layout switching goes here.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-25 16:49:08 +01:00
|
|
|
|
|
2011-12-31 00:26:11 +01:00
|
|
|
|
xkbVariant = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.str;
|
2011-12-31 00:26:11 +01:00
|
|
|
|
default = "";
|
|
|
|
|
example = "colemak";
|
|
|
|
|
description = ''
|
|
|
|
|
X keyboard variant.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
config = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.lines;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
description = ''
|
|
|
|
|
The contents of the configuration file of the X server
|
|
|
|
|
(<filename>xorg.conf</filename>).
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-06-03 10:14:54 +02:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
deviceSection = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.lines;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = "";
|
|
|
|
|
example = "VideoRAM 131072";
|
|
|
|
|
description = "Contents of the first Device section of the X server configuration file.";
|
|
|
|
|
};
|
2009-01-25 16:49:08 +01:00
|
|
|
|
|
2010-05-08 19:18:22 +02:00
|
|
|
|
screenSection = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.lines;
|
2010-05-08 19:18:22 +02:00
|
|
|
|
default = "";
|
|
|
|
|
example = ''
|
|
|
|
|
Option "RandRRotation" "on"
|
|
|
|
|
'';
|
|
|
|
|
description = "Contents of the first Screen section of the X server configuration file.";
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
monitorSection = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.lines;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = "";
|
|
|
|
|
example = "HorizSync 28-49";
|
|
|
|
|
description = "Contents of the first Monitor section of the X server configuration file.";
|
|
|
|
|
};
|
2009-04-08 15:41:33 +02:00
|
|
|
|
|
2013-01-10 00:31:08 +01:00
|
|
|
|
xrandrHeads = mkOption {
|
|
|
|
|
default = [];
|
|
|
|
|
example = [ "HDMI-0" "DVI-0" ];
|
|
|
|
|
type = with types; listOf string;
|
|
|
|
|
description = ''
|
|
|
|
|
Simple multiple monitor configuration, just specify a list of XRandR
|
|
|
|
|
outputs which will be mapped from left to right in the order of the
|
|
|
|
|
list.
|
|
|
|
|
|
|
|
|
|
Be careful using this option with multiple graphic adapters or with
|
|
|
|
|
drivers that have poor support for XRandR, unexpected things might
|
|
|
|
|
happen with those.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2013-11-04 15:45:05 +01:00
|
|
|
|
serverFlagsSection = mkOption {
|
|
|
|
|
default = "";
|
|
|
|
|
example =
|
|
|
|
|
''
|
|
|
|
|
Option "BlankTime" "0"
|
|
|
|
|
Option "StandbyTime" "0"
|
|
|
|
|
Option "SuspendTime" "0"
|
|
|
|
|
Option "OffTime" "0"
|
|
|
|
|
'';
|
|
|
|
|
description = "Contents of the ServerFlags section of the X server configuration file.";
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
moduleSection = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.lines;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = "";
|
|
|
|
|
example =
|
|
|
|
|
''
|
|
|
|
|
SubSection "extmod"
|
|
|
|
|
EndSubsection
|
|
|
|
|
'';
|
|
|
|
|
description = "Contents of the Module section of the X server configuration file.";
|
|
|
|
|
};
|
2009-04-08 15:41:33 +02:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
serverLayoutSection = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.lines;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = "";
|
|
|
|
|
example =
|
|
|
|
|
''
|
|
|
|
|
Option "AIGLX" "true"
|
|
|
|
|
'';
|
|
|
|
|
description = "Contents of the ServerLayout section of the X server configuration file.";
|
|
|
|
|
};
|
2009-01-25 16:49:08 +01:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
extraDisplaySettings = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.lines;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = "";
|
|
|
|
|
example = "Virtual 2048 2048";
|
|
|
|
|
description = "Lines to be added to every Display subsection of the Screen section.";
|
|
|
|
|
};
|
2009-01-25 16:49:08 +01:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
defaultDepth = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.int;
|
2009-11-06 01:59:03 +01:00
|
|
|
|
default = 0;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
example = 8;
|
|
|
|
|
description = "Default colour depth.";
|
|
|
|
|
};
|
2009-01-25 16:49:08 +01:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
useXFS = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
# FIXME: what's the type of this option?
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = false;
|
|
|
|
|
example = "unix/:7100";
|
|
|
|
|
description = "Determines how to connect to the X Font Server.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
tty = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.int;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = 7;
|
|
|
|
|
description = "Virtual console for the X server.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
display = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.int;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = 0;
|
|
|
|
|
description = "Display number for the X server.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
virtualScreen = mkOption {
|
2013-10-30 17:37:45 +01:00
|
|
|
|
type = types.nullOr types.attrs;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
default = null;
|
|
|
|
|
example = { x = 2048; y = 2048; };
|
|
|
|
|
description = ''
|
|
|
|
|
Virtual screen size for Xrandr.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2011-09-14 20:20:50 +02:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2013-05-16 17:23:31 +02:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
###### implementation
|
2009-11-21 23:14:01 +01:00
|
|
|
|
|
2013-10-30 18:30:23 +01:00
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
|
|
|
|
|
|
assertions =
|
|
|
|
|
[ { assertion = !(cfg.startOpenSSHAgent && cfg.startGnuPGAgent);
|
|
|
|
|
message =
|
|
|
|
|
''
|
|
|
|
|
The OpenSSH agent and GnuPG agent cannot be started both.
|
|
|
|
|
Choose between `startOpenSSHAgent' and `startGnuPGAgent'.
|
|
|
|
|
'';
|
|
|
|
|
}
|
|
|
|
|
{ assertion = config.security.polkit.enable;
|
|
|
|
|
message = "X11 requires Polkit to be enabled (‘security.polkit.enable = true’).";
|
|
|
|
|
}
|
|
|
|
|
];
|
2009-09-10 14:37:33 +02:00
|
|
|
|
|
|
|
|
|
boot.extraModulePackages =
|
2011-09-14 20:20:50 +02:00
|
|
|
|
optional (elem "nvidia" driverNames) kernelPackages.nvidia_x11 ++
|
2010-08-25 00:00:18 +02:00
|
|
|
|
optional (elem "nvidiaLegacy173" driverNames) kernelPackages.nvidia_x11_legacy173 ++
|
2012-12-13 11:36:18 +01:00
|
|
|
|
optional (elem "nvidiaLegacy304" driverNames) kernelPackages.nvidia_x11_legacy304 ++
|
2010-05-18 21:36:11 +02:00
|
|
|
|
optional (elem "virtualbox" driverNames) kernelPackages.virtualboxGuestAdditions ++
|
|
|
|
|
optional (elem "ati_unfree" driverNames) kernelPackages.ati_drivers_x11;
|
2009-09-10 14:37:33 +02:00
|
|
|
|
|
2013-08-09 18:45:45 +02:00
|
|
|
|
boot.blacklistedKernelModules =
|
|
|
|
|
optionals (elem "nvidia" driverNames) [ "nouveau" "nvidiafb" ];
|
|
|
|
|
|
2013-09-23 23:03:21 +02:00
|
|
|
|
environment.variables.LD_LIBRARY_PATH =
|
2013-10-18 23:40:45 +02:00
|
|
|
|
[ "/run/opengl-driver/lib" "/run/opengl-driver-32/lib" ]
|
|
|
|
|
++ pkgs.lib.optional cfg.s3tcSupport "${pkgs.libtxc_dxtn}/lib"
|
|
|
|
|
++ pkgs.lib.optional (cfg.s3tcSupport && cfg.driSupport32Bit) "${pkgs_i686.libtxc_dxtn}/lib";
|
2013-09-18 05:18:34 +02:00
|
|
|
|
|
2012-10-07 17:24:42 +02:00
|
|
|
|
environment.etc =
|
2013-08-09 18:45:45 +02:00
|
|
|
|
(optionals cfg.exportConfiguration
|
|
|
|
|
[ { source = "${configFile}";
|
|
|
|
|
target = "X11/xorg.conf";
|
|
|
|
|
}
|
|
|
|
|
# -xkbdir command line option does not seems to be passed to xkbcomp.
|
|
|
|
|
{ source = "${pkgs.xkeyboard_config}/etc/X11/xkb";
|
|
|
|
|
target = "X11/xkb";
|
|
|
|
|
}
|
|
|
|
|
])
|
|
|
|
|
++ (optionals (elem "ati_unfree" driverNames) [
|
|
|
|
|
|
|
|
|
|
# according toiive on #ati you don't need the pcs, it is like registry... keeps old stuff to make your
|
|
|
|
|
# life harder ;) Still it seems to be required
|
|
|
|
|
{ source = "${kernelPackages.ati_drivers_x11}/etc/ati";
|
|
|
|
|
target = "ati";
|
|
|
|
|
}
|
2013-09-24 20:28:52 +02:00
|
|
|
|
])
|
|
|
|
|
++ (optionals (elem "nvidia" driverNames) [
|
|
|
|
|
|
|
|
|
|
{ source = "${kernelPackages.nvidia_x11}/lib/vendors/nvidia.icd";
|
|
|
|
|
target = "OpenCL/vendors/nvidia.icd";
|
|
|
|
|
}
|
2013-08-09 18:45:45 +02:00
|
|
|
|
]);
|
2011-09-14 20:20:50 +02:00
|
|
|
|
|
2013-10-30 17:52:35 +01:00
|
|
|
|
environment.systemPackages =
|
2009-09-10 14:37:33 +02:00
|
|
|
|
[ xorg.xorgserver
|
|
|
|
|
xorg.xrandr
|
|
|
|
|
xorg.xrdb
|
|
|
|
|
xorg.setxkbmap
|
|
|
|
|
xorg.iceauth # required for KDE applications (it's called by dcopserver)
|
2010-02-10 14:22:38 +01:00
|
|
|
|
xorg.xlsclients
|
|
|
|
|
xorg.xset
|
2009-09-10 14:37:33 +02:00
|
|
|
|
xorg.xsetroot
|
2013-04-27 03:30:40 +02:00
|
|
|
|
xorg.xinput
|
2009-09-13 15:26:35 +02:00
|
|
|
|
xorg.xprop
|
2010-02-10 14:22:38 +01:00
|
|
|
|
pkgs.xterm
|
2012-05-15 04:49:47 +02:00
|
|
|
|
pkgs.xdg_utils
|
2009-09-10 14:37:33 +02:00
|
|
|
|
]
|
2009-11-06 01:59:03 +01:00
|
|
|
|
++ optional (elem "nvidia" driverNames) kernelPackages.nvidia_x11
|
2010-08-25 00:00:18 +02:00
|
|
|
|
++ optional (elem "nvidiaLegacy173" driverNames) kernelPackages.nvidia_x11_legacy173
|
2012-12-13 11:36:18 +01:00
|
|
|
|
++ optional (elem "nvidiaLegacy304" driverNames) kernelPackages.nvidia_x11_legacy304
|
2010-05-18 21:36:11 +02:00
|
|
|
|
++ optional (elem "virtualbox" driverNames) xorg.xrefresh
|
|
|
|
|
++ optional (elem "ati_unfree" driverNames) kernelPackages.ati_drivers_x11;
|
2011-09-14 20:20:50 +02:00
|
|
|
|
|
2010-08-09 20:04:55 +02:00
|
|
|
|
environment.pathsToLink =
|
|
|
|
|
[ "/etc/xdg" "/share/xdg" "/share/applications" "/share/icons" "/share/pixmaps" ];
|
2011-03-30 19:52:34 +02:00
|
|
|
|
|
2013-01-16 12:33:18 +01:00
|
|
|
|
systemd.defaultUnit = mkIf cfg.autorun "graphical.target";
|
2012-06-19 20:51:04 +02:00
|
|
|
|
|
2013-01-16 12:33:18 +01:00
|
|
|
|
systemd.services."display-manager" =
|
2013-01-10 13:59:41 +01:00
|
|
|
|
{ description = "X11 Server";
|
|
|
|
|
|
|
|
|
|
after = [ "systemd-udev-settle.service" "local-fs.target" ];
|
2011-09-14 20:20:50 +02:00
|
|
|
|
|
2012-08-17 19:14:42 +02:00
|
|
|
|
restartIfChanged = false;
|
2012-03-18 03:10:39 +01:00
|
|
|
|
|
|
|
|
|
environment =
|
2009-09-10 14:37:33 +02:00
|
|
|
|
{ FONTCONFIG_FILE = "/etc/fonts/fonts.conf"; # !!! cleanup
|
|
|
|
|
XKB_BINDIR = "${xorg.xkbcomp}/bin"; # Needed for the Xkb extension.
|
2013-05-16 17:23:31 +02:00
|
|
|
|
XORG_DRI_DRIVER_PATH = "/run/opengl-driver/lib/dri"; # !!! Depends on the driver selected at runtime.
|
2009-11-06 01:59:03 +01:00
|
|
|
|
} // optionalAttrs (elem "nvidia" driverNames) {
|
2009-09-10 14:37:33 +02:00
|
|
|
|
LD_LIBRARY_PATH = "${xorg.libX11}/lib:${xorg.libXext}/lib:${kernelPackages.nvidia_x11}/lib";
|
2010-08-25 00:00:18 +02:00
|
|
|
|
} // optionalAttrs (elem "nvidiaLegacy173" driverNames) {
|
|
|
|
|
LD_LIBRARY_PATH = "${xorg.libX11}/lib:${xorg.libXext}/lib:${kernelPackages.nvidia_x11_legacy173}/lib";
|
2012-12-13 11:36:18 +01:00
|
|
|
|
} // optionalAttrs (elem "nvidiaLegacy304" driverNames) {
|
|
|
|
|
LD_LIBRARY_PATH = "${xorg.libX11}/lib:${xorg.libXext}/lib:${kernelPackages.nvidia_x11_legacy304}/lib";
|
2010-05-18 21:36:11 +02:00
|
|
|
|
} // optionalAttrs (elem "ati_unfree" driverNames) {
|
|
|
|
|
LD_LIBRARY_PATH = "${xorg.libX11}/lib:${xorg.libXext}/lib:${kernelPackages.ati_drivers_x11}/lib:${kernelPackages.ati_drivers_x11}/X11R6/lib64/modules/linux";
|
2013-05-16 17:23:31 +02:00
|
|
|
|
#XORG_DRI_DRIVER_PATH = "${kernelPackages.ati_drivers_x11}/lib/dri"; # is ignored because ati drivers ship their own unpatched libglx.so !
|
2009-09-10 14:37:33 +02:00
|
|
|
|
} // cfg.displayManager.job.environment;
|
|
|
|
|
|
|
|
|
|
preStart =
|
|
|
|
|
''
|
2013-05-16 23:52:17 +02:00
|
|
|
|
rm -f /run/opengl-driver{,-32}
|
|
|
|
|
${optionalString (!cfg.driSupport32Bit) "ln -sf opengl-driver /run/opengl-driver-32"}
|
|
|
|
|
|
2009-11-06 01:59:03 +01:00
|
|
|
|
${# !!! The OpenGL driver depends on what's detected at runtime.
|
2010-05-31 00:00:52 +02:00
|
|
|
|
if elem "nvidia" driverNames then
|
|
|
|
|
''
|
2012-07-16 17:32:26 +02:00
|
|
|
|
ln -sf ${kernelPackages.nvidia_x11} /run/opengl-driver
|
2013-05-16 17:23:31 +02:00
|
|
|
|
${optionalString cfg.driSupport32Bit
|
2014-01-05 19:15:03 +01:00
|
|
|
|
"ln -sf ${pkgs_i686.linuxPackages.nvidia_x11.override { libsOnly = true; kernel = null; } } /run/opengl-driver-32"}
|
2010-05-31 00:00:52 +02:00
|
|
|
|
''
|
2010-08-25 00:00:18 +02:00
|
|
|
|
else if elem "nvidiaLegacy173" driverNames then
|
2012-07-16 17:32:26 +02:00
|
|
|
|
"ln -sf ${kernelPackages.nvidia_x11_legacy173} /run/opengl-driver"
|
2012-12-13 11:36:18 +01:00
|
|
|
|
else if elem "nvidiaLegacy304" driverNames then
|
2013-01-16 22:49:21 +01:00
|
|
|
|
''
|
|
|
|
|
ln -sf ${kernelPackages.nvidia_x11_legacy304} /run/opengl-driver
|
2013-05-16 17:23:31 +02:00
|
|
|
|
${optionalString cfg.driSupport32Bit
|
2014-01-05 19:15:03 +01:00
|
|
|
|
"ln -sf ${pkgs_i686.linuxPackages.nvidia_x11_legacy304.override { libsOnly = true; kernel = null; } } /run/opengl-driver-32"}
|
2013-01-16 22:49:21 +01:00
|
|
|
|
''
|
2012-10-07 17:24:42 +02:00
|
|
|
|
else if elem "ati_unfree" driverNames then
|
|
|
|
|
"ln -sf ${kernelPackages.ati_drivers_x11} /run/opengl-driver"
|
2013-02-19 18:28:25 +01:00
|
|
|
|
else
|
|
|
|
|
''
|
2013-05-16 17:23:31 +02:00
|
|
|
|
${optionalString cfg.driSupport "ln -sf ${pkgs.mesa_drivers} /run/opengl-driver"}
|
|
|
|
|
${optionalString cfg.driSupport32Bit
|
|
|
|
|
"ln -sf ${pkgs_i686.mesa_drivers} /run/opengl-driver-32"}
|
2013-02-19 18:28:25 +01:00
|
|
|
|
''
|
2010-05-31 00:00:52 +02:00
|
|
|
|
}
|
2009-09-10 14:37:33 +02:00
|
|
|
|
|
2009-09-10 17:49:16 +02:00
|
|
|
|
${cfg.displayManager.job.preStart}
|
2009-09-10 14:37:33 +02:00
|
|
|
|
|
|
|
|
|
rm -f /tmp/.X0-lock
|
|
|
|
|
'';
|
|
|
|
|
|
2009-09-13 17:03:07 +02:00
|
|
|
|
script = "${cfg.displayManager.job.execCmd}";
|
2013-10-15 13:15:33 +02:00
|
|
|
|
|
|
|
|
|
serviceConfig = {
|
|
|
|
|
Restart = "always";
|
|
|
|
|
RestartSec = "200ms";
|
|
|
|
|
};
|
2009-09-10 14:37:33 +02:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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.enableTCP) "-nolisten tcp";
|
|
|
|
|
|
2009-11-06 01:59:03 +01:00
|
|
|
|
services.xserver.modules =
|
|
|
|
|
concatLists (catAttrs "modules" drivers) ++
|
|
|
|
|
[ xorg.xorgserver
|
|
|
|
|
xorg.xf86inputevdev
|
|
|
|
|
];
|
2011-09-14 20:20:50 +02:00
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
services.xserver.config =
|
|
|
|
|
''
|
|
|
|
|
Section "ServerFlags"
|
|
|
|
|
Option "AllowMouseOpenFail" "on"
|
2013-11-04 15:45:05 +01:00
|
|
|
|
${cfg.serverFlagsSection}
|
2009-09-10 14:37:33 +02:00
|
|
|
|
EndSection
|
|
|
|
|
|
|
|
|
|
Section "Module"
|
|
|
|
|
${cfg.moduleSection}
|
|
|
|
|
EndSection
|
|
|
|
|
|
|
|
|
|
Section "Monitor"
|
2009-11-06 01:59:03 +01:00
|
|
|
|
Identifier "Monitor[0]"
|
2009-09-10 14:37:33 +02:00
|
|
|
|
${cfg.monitorSection}
|
|
|
|
|
EndSection
|
|
|
|
|
|
2010-08-02 21:06:42 +02:00
|
|
|
|
Section "InputClass"
|
2010-08-10 16:13:57 +02:00
|
|
|
|
Identifier "Keyboard catchall"
|
2010-08-02 21:06:42 +02:00
|
|
|
|
MatchIsKeyboard "on"
|
|
|
|
|
Option "XkbRules" "base"
|
|
|
|
|
Option "XkbModel" "${cfg.xkbModel}"
|
|
|
|
|
Option "XkbLayout" "${cfg.layout}"
|
|
|
|
|
Option "XkbOptions" "${cfg.xkbOptions}"
|
2011-12-31 00:26:11 +01:00
|
|
|
|
Option "XkbVariant" "${cfg.xkbVariant}"
|
2010-08-02 21:06:42 +02:00
|
|
|
|
EndSection
|
|
|
|
|
|
2009-09-10 14:37:33 +02:00
|
|
|
|
Section "ServerLayout"
|
2009-11-06 01:59:03 +01:00
|
|
|
|
Identifier "Layout[all]"
|
2009-09-10 14:37:33 +02:00
|
|
|
|
${cfg.serverLayoutSection}
|
2009-11-06 01:59:03 +01:00
|
|
|
|
# Reference the Screen sections for each driver. This will
|
|
|
|
|
# cause the X server to try each in turn.
|
|
|
|
|
${flip concatMapStrings drivers (d: ''
|
|
|
|
|
Screen "Screen-${d.name}[0]"
|
|
|
|
|
'')}
|
2009-09-10 14:37:33 +02:00
|
|
|
|
EndSection
|
|
|
|
|
|
2009-11-06 01:59:03 +01:00
|
|
|
|
# For each supported driver, add a "Device" and "Screen"
|
|
|
|
|
# section.
|
|
|
|
|
${flip concatMapStrings drivers (driver: ''
|
2011-09-14 20:20:50 +02:00
|
|
|
|
|
2009-11-06 01:59:03 +01:00
|
|
|
|
Section "Device"
|
|
|
|
|
Identifier "Device-${driver.name}[0]"
|
2009-11-06 10:22:00 +01:00
|
|
|
|
Driver "${driver.driverName}"
|
2009-11-06 01:59:03 +01:00
|
|
|
|
${cfg.deviceSection}
|
2013-01-10 00:31:08 +01:00
|
|
|
|
${xrandrDeviceSection}
|
2009-11-06 01:59:03 +01:00
|
|
|
|
EndSection
|
|
|
|
|
|
|
|
|
|
Section "Screen"
|
|
|
|
|
Identifier "Screen-${driver.name}[0]"
|
|
|
|
|
Device "Device-${driver.name}[0]"
|
2010-08-09 22:10:16 +02:00
|
|
|
|
${optionalString (cfg.monitorSection != "") ''
|
|
|
|
|
Monitor "Monitor[0]"
|
|
|
|
|
''}
|
2009-11-06 01:59:03 +01:00
|
|
|
|
|
2010-05-08 19:18:22 +02:00
|
|
|
|
${cfg.screenSection}
|
|
|
|
|
|
2009-11-06 01:59:03 +01:00
|
|
|
|
${optionalString (cfg.defaultDepth != 0) ''
|
|
|
|
|
DefaultDepth ${toString cfg.defaultDepth}
|
|
|
|
|
''}
|
|
|
|
|
|
|
|
|
|
${optionalString (driver.name == "nvidia") ''
|
|
|
|
|
Option "RandRRotation" "on"
|
|
|
|
|
''}
|
|
|
|
|
|
|
|
|
|
${optionalString
|
2010-08-09 22:10:16 +02:00
|
|
|
|
(driver.name != "virtualbox" &&
|
|
|
|
|
(cfg.resolutions != [] ||
|
|
|
|
|
cfg.extraDisplaySettings != "" ||
|
|
|
|
|
cfg.virtualScreen != null))
|
|
|
|
|
(let
|
2009-11-06 01:59:03 +01:00
|
|
|
|
f = depth:
|
|
|
|
|
''
|
|
|
|
|
SubSection "Display"
|
|
|
|
|
Depth ${toString depth}
|
|
|
|
|
${optionalString (cfg.resolutions != [])
|
|
|
|
|
"Modes ${concatMapStrings (res: ''"${toString res.x}x${toString res.y}"'') cfg.resolutions}"}
|
|
|
|
|
${cfg.extraDisplaySettings}
|
|
|
|
|
${optionalString (cfg.virtualScreen != null)
|
|
|
|
|
"Virtual ${toString cfg.virtualScreen.x} ${toString cfg.virtualScreen.y}"}
|
|
|
|
|
EndSubSection
|
|
|
|
|
'';
|
|
|
|
|
in concatMapStrings f [8 16 24]
|
|
|
|
|
)}
|
2011-09-14 20:20:50 +02:00
|
|
|
|
|
2009-11-06 01:59:03 +01:00
|
|
|
|
EndSection
|
|
|
|
|
'')}
|
2013-01-09 22:19:58 +01:00
|
|
|
|
|
2013-01-10 00:31:08 +01:00
|
|
|
|
${xrandrMonitorSections}
|
2009-09-10 14:37:33 +02:00
|
|
|
|
'';
|
|
|
|
|
|
2013-10-30 18:30:23 +01:00
|
|
|
|
};
|
2009-09-10 14:37:33 +02:00
|
|
|
|
|
2006-11-28 23:27:56 +01:00
|
|
|
|
}
|
2013-05-16 17:23:31 +02:00
|
|
|
|
|