2018-07-20 23:56:59 +03:00
|
|
|
|
{ config, lib, pkgs, ... }:
|
2006-11-29 01:27:56 +03:00
|
|
|
|
|
2014-04-14 18:26:48 +04:00
|
|
|
|
with lib;
|
2009-05-24 22:28:30 +04:00
|
|
|
|
|
2009-01-02 19:07:21 +03:00
|
|
|
|
let
|
2006-11-29 01:27:56 +03:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
kernelPackages = config.boot.kernelPackages;
|
2006-11-29 01:27:56 +03:00
|
|
|
|
|
2008-01-04 13:54:33 +03:00
|
|
|
|
# Abbreviations.
|
|
|
|
|
cfg = config.services.xserver;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
xorg = pkgs.xorg;
|
|
|
|
|
|
2008-01-04 13:54:33 +03:00
|
|
|
|
|
2014-04-29 16:16:34 +04:00
|
|
|
|
# Map video driver names to driver packages. FIXME: move into card-specific modules.
|
2008-10-10 20:45:56 +04:00
|
|
|
|
knownVideoDrivers = {
|
2018-11-12 22:29:14 +03:00
|
|
|
|
# Alias so people can keep using "virtualbox" instead of "vboxvideo".
|
|
|
|
|
virtualbox = { modules = [ xorg.xf86videovboxvideo ]; driverName = "vboxvideo"; };
|
2016-08-05 19:29:02 +03:00
|
|
|
|
|
|
|
|
|
# modesetting does not have a xf86videomodesetting package as it is included in xorgserver
|
|
|
|
|
modesetting = {};
|
2008-10-10 20:45:56 +04:00
|
|
|
|
};
|
|
|
|
|
|
2008-08-27 14:00:49 +04:00
|
|
|
|
fontsForXServer =
|
2009-09-10 16:37:33 +04:00
|
|
|
|
config.fonts.fonts ++
|
2008-08-27 14:00:49 +04: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 03:29:49 +04:00
|
|
|
|
|
2017-04-24 12:08:33 +03:00
|
|
|
|
xrandrOptions = {
|
|
|
|
|
output = mkOption {
|
|
|
|
|
type = types.str;
|
|
|
|
|
example = "DVI-0";
|
|
|
|
|
description = ''
|
|
|
|
|
The output name of the monitor, as shown by <citerefentry>
|
|
|
|
|
<refentrytitle>xrandr</refentrytitle>
|
|
|
|
|
<manvolnum>1</manvolnum>
|
|
|
|
|
</citerefentry> invoked without arguments.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
primary = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = false;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether this head is treated as the primary monitor,
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
monitorConfig = mkOption {
|
|
|
|
|
type = types.lines;
|
|
|
|
|
default = "";
|
|
|
|
|
example = ''
|
|
|
|
|
DisplaySize 408 306
|
|
|
|
|
Option "DPMS" "false"
|
|
|
|
|
'';
|
|
|
|
|
description = ''
|
|
|
|
|
Extra lines to append to the <literal>Monitor</literal> section
|
|
|
|
|
verbatim.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
};
|
2013-01-24 16:06:32 +04:00
|
|
|
|
|
2013-01-10 03:31:08 +04:00
|
|
|
|
# Just enumerate all heads without discarding XRandR output information.
|
|
|
|
|
xrandrHeads = let
|
2017-04-24 12:08:33 +03:00
|
|
|
|
mkHead = num: config: {
|
2013-01-10 03:31:08 +04:00
|
|
|
|
name = "multihead${toString num}";
|
2017-04-24 12:08:33 +03:00
|
|
|
|
inherit config;
|
2013-01-10 03:31:08 +04:00
|
|
|
|
};
|
2017-07-05 01:29:23 +03:00
|
|
|
|
in imap1 mkHead cfg.xrandrHeads;
|
2013-01-10 03:31:08 +04:00
|
|
|
|
|
2015-04-18 21:04:03 +03:00
|
|
|
|
xrandrDeviceSection = let
|
|
|
|
|
monitors = flip map xrandrHeads (h: ''
|
2017-04-24 12:08:33 +03:00
|
|
|
|
Option "monitor-${h.config.output}" "${h.name}"
|
2015-04-18 21:04:03 +03:00
|
|
|
|
'');
|
|
|
|
|
# First option is indented through the space in the config but any
|
|
|
|
|
# subsequent options aren't so we need to apply indentation to
|
|
|
|
|
# them here
|
|
|
|
|
monitorsIndented = if length monitors > 1
|
|
|
|
|
then singleton (head monitors) ++ map (m: " " + m) (tail monitors)
|
|
|
|
|
else monitors;
|
|
|
|
|
in concatStrings monitorsIndented;
|
2013-01-10 03:31:08 +04:00
|
|
|
|
|
|
|
|
|
# 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
|
2015-04-18 20:34:28 +03:00
|
|
|
|
mkMonitor = previous: current: singleton {
|
2013-01-10 03:31:08 +04:00
|
|
|
|
inherit (current) name;
|
|
|
|
|
value = ''
|
|
|
|
|
Section "Monitor"
|
|
|
|
|
Identifier "${current.name}"
|
2017-04-24 12:08:33 +03:00
|
|
|
|
${optionalString (current.config.primary) ''
|
2016-03-14 16:00:55 +03:00
|
|
|
|
Option "Primary" "true"
|
|
|
|
|
''}
|
2013-01-10 03:31:08 +04:00
|
|
|
|
${optionalString (previous != []) ''
|
|
|
|
|
Option "RightOf" "${(head previous).name}"
|
|
|
|
|
''}
|
2017-04-24 12:08:33 +03:00
|
|
|
|
${current.config.monitorConfig}
|
2013-01-10 03:31:08 +04:00
|
|
|
|
EndSection
|
|
|
|
|
'';
|
2015-04-18 20:34:28 +03:00
|
|
|
|
} ++ previous;
|
|
|
|
|
monitors = reverseList (foldl mkMonitor [] xrandrHeads);
|
2013-01-10 03:31:08 +04:00
|
|
|
|
in concatMapStrings (getAttr "value") monitors;
|
2009-06-26 03:29:49 +04:00
|
|
|
|
|
2016-09-27 16:26:37 +03:00
|
|
|
|
configFile = pkgs.runCommand "xserver.conf"
|
|
|
|
|
{ xfs = optionalString (cfg.useXFS != false)
|
|
|
|
|
''FontPath "${toString cfg.useXFS}"'';
|
|
|
|
|
inherit (cfg) config;
|
|
|
|
|
}
|
2009-09-10 16:37:33 +04:00
|
|
|
|
''
|
|
|
|
|
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 22:20:50 +04:00
|
|
|
|
|
2009-09-10 16:37:33 +04: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 22:20:50 +04:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
echo "$config" >> $out
|
|
|
|
|
''; # */
|
2006-11-29 01:27:56 +03:00
|
|
|
|
|
2009-01-02 19:07:21 +03:00
|
|
|
|
in
|
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
{
|
2009-05-15 11:51:51 +04:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
imports =
|
|
|
|
|
[ ./display-managers/default.nix
|
|
|
|
|
./window-managers/default.nix
|
|
|
|
|
./desktop-managers/default.nix
|
|
|
|
|
];
|
2009-05-15 11:51:51 +04:00
|
|
|
|
|
2009-01-02 19:07:21 +03:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
###### interface
|
2011-09-14 22:20:50 +04:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
options = {
|
2011-09-14 22:20:50 +04:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
services.xserver = {
|
|
|
|
|
|
|
|
|
|
enable = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.bool;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = false;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to enable the X server.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-25 18:49:08 +03:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
autorun = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.bool;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = true;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to start the X server automatically.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-02 19:07:21 +03:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
exportConfiguration = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.bool;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = false;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to symlink the X server configuration under
|
|
|
|
|
<filename>/etc/X11/xorg.conf</filename>.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-02 19:07:21 +03:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
enableTCP = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.bool;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = false;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to allow the X server to accept TCP connections.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-02 19:07:39 +03:00
|
|
|
|
|
2016-10-01 22:44:58 +03:00
|
|
|
|
autoRepeatDelay = mkOption {
|
|
|
|
|
type = types.nullOr types.int;
|
|
|
|
|
default = null;
|
|
|
|
|
description = ''
|
|
|
|
|
Sets the autorepeat delay (length of time in milliseconds that a key must be depressed before autorepeat starts).
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
autoRepeatInterval = mkOption {
|
|
|
|
|
type = types.nullOr types.int;
|
|
|
|
|
default = null;
|
|
|
|
|
description = ''
|
|
|
|
|
Sets the autorepeat interval (length of time in milliseconds that should elapse between autorepeat-generated keystrokes).
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2015-04-13 00:49:48 +03:00
|
|
|
|
inputClassSections = mkOption {
|
|
|
|
|
type = types.listOf types.lines;
|
|
|
|
|
default = [];
|
2015-07-04 09:52:50 +03:00
|
|
|
|
example = literalExample ''
|
|
|
|
|
[ '''
|
|
|
|
|
Identifier "Trackpoint Wheel Emulation"
|
|
|
|
|
MatchProduct "ThinkPad USB Keyboard with TrackPoint"
|
2016-03-18 12:25:37 +03:00
|
|
|
|
Option "EmulateWheel" "true"
|
2015-07-04 09:52:50 +03:00
|
|
|
|
Option "EmulateWheelButton" "2"
|
|
|
|
|
Option "Emulate3Buttons" "false"
|
|
|
|
|
'''
|
|
|
|
|
]
|
|
|
|
|
'';
|
2015-04-13 00:49:48 +03:00
|
|
|
|
description = "Content of additional InputClass sections of the X server configuration file.";
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
modules = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.listOf types.path;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = [];
|
2014-08-28 01:41:15 +04:00
|
|
|
|
example = literalExample "[ pkgs.xf86_input_wacom ]";
|
2009-09-10 16:37:33 +04:00
|
|
|
|
description = "Packages to be added to the module search path of the X server.";
|
|
|
|
|
};
|
2009-01-02 19:07:21 +03:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
resolutions = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.listOf types.attrs;
|
2009-11-06 03:59:03 +03:00
|
|
|
|
default = [];
|
2010-08-10 00:10:16 +04:00
|
|
|
|
example = [ { x = 1600; y = 1200; } { x = 1024; y = 786; } ];
|
2009-09-10 16:37:33 +04:00
|
|
|
|
description = ''
|
2009-11-06 03:59:03 +03: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 16:37:33 +04:00
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-02 19:07:21 +03:00
|
|
|
|
|
2014-04-29 14:58:54 +04:00
|
|
|
|
videoDrivers = mkOption {
|
|
|
|
|
type = types.listOf types.str;
|
|
|
|
|
# !!! We'd like "nv" here, but it segfaults the X server.
|
2014-05-21 17:40:48 +04:00
|
|
|
|
default = [ "ati" "cirrus" "intel" "vesa" "vmware" "modesetting" ];
|
2018-04-25 10:12:04 +03:00
|
|
|
|
example = [
|
|
|
|
|
"ati_unfree" "amdgpu" "amdgpu-pro"
|
2018-04-28 01:02:09 +03:00
|
|
|
|
"nv" "nvidia" "nvidiaLegacy340" "nvidiaLegacy304"
|
2018-04-25 10:12:04 +03:00
|
|
|
|
];
|
2018-04-25 10:12:04 +03:00
|
|
|
|
# TODO(@oxij): think how to easily add the rest, like those nvidia things
|
|
|
|
|
relatedPackages = concatLists
|
|
|
|
|
(mapAttrsToList (n: v:
|
|
|
|
|
optional (hasPrefix "xf86video" n) {
|
|
|
|
|
path = [ "xorg" n ];
|
|
|
|
|
title = removePrefix "xf86video" n;
|
|
|
|
|
}) pkgs.xorg);
|
2014-04-29 14:58:54 +04:00
|
|
|
|
description = ''
|
|
|
|
|
The names of the video drivers the configuration
|
|
|
|
|
supports. They will be tried in order until one that
|
|
|
|
|
supports your card is found.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
videoDriver = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.nullOr types.str;
|
2009-11-06 03:59:03 +03:00
|
|
|
|
default = null;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
example = "i810";
|
|
|
|
|
description = ''
|
2009-11-06 03:59:03 +03:00
|
|
|
|
The name of the video driver for your graphics card. This
|
|
|
|
|
option is obsolete; please set the
|
2014-04-29 14:58:54 +04:00
|
|
|
|
<option>services.xserver.videoDrivers</option> instead.
|
2009-09-10 16:37:33 +04:00
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-02 19:07:21 +03:00
|
|
|
|
|
2014-04-29 16:16:34 +04:00
|
|
|
|
drivers = mkOption {
|
|
|
|
|
type = types.listOf types.attrs;
|
|
|
|
|
internal = true;
|
|
|
|
|
description = ''
|
|
|
|
|
A list of attribute sets specifying drivers to be loaded by
|
|
|
|
|
the X11 server.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2016-04-09 04:53:42 +03:00
|
|
|
|
dpi = mkOption {
|
|
|
|
|
type = types.nullOr types.int;
|
2016-04-10 18:46:17 +03:00
|
|
|
|
default = null;
|
2016-04-09 04:53:42 +03:00
|
|
|
|
description = "DPI resolution to use for X server.";
|
|
|
|
|
};
|
|
|
|
|
|
2015-06-22 19:08:29 +03:00
|
|
|
|
startDbusSession = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = true;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to start a new DBus session when you log in with dbus-launch.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2016-04-26 00:37:18 +03:00
|
|
|
|
updateDbusEnvironment = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = false;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to update the DBus activation environment after launching the
|
|
|
|
|
desktop manager.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
layout = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.str;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = "us";
|
|
|
|
|
description = ''
|
2017-03-24 00:14:28 +03:00
|
|
|
|
Keyboard layout, or multiple keyboard layouts separated by commas.
|
2009-09-10 16:37:33 +04:00
|
|
|
|
'';
|
2009-01-25 18:49:08 +03:00
|
|
|
|
};
|
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
xkbModel = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.str;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = "pc104";
|
|
|
|
|
example = "presario";
|
|
|
|
|
description = ''
|
|
|
|
|
Keyboard model.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-06-26 03:29:49 +04:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
xkbOptions = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.str;
|
2010-08-10 16:37:39 +04:00
|
|
|
|
default = "terminate:ctrl_alt_bksp";
|
2009-09-10 16:37:33 +04:00
|
|
|
|
example = "grp:caps_toggle, grp_led:scroll";
|
|
|
|
|
description = ''
|
|
|
|
|
X keyboard options; layout switching goes here.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-01-25 18:49:08 +03:00
|
|
|
|
|
2011-12-31 03:26:11 +04:00
|
|
|
|
xkbVariant = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.str;
|
2011-12-31 03:26:11 +04:00
|
|
|
|
default = "";
|
|
|
|
|
example = "colemak";
|
|
|
|
|
description = ''
|
|
|
|
|
X keyboard variant.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2015-12-24 15:30:42 +03:00
|
|
|
|
xkbDir = mkOption {
|
2015-12-26 11:06:28 +03:00
|
|
|
|
type = types.path;
|
2015-12-24 15:30:42 +03:00
|
|
|
|
description = ''
|
2015-12-26 11:06:28 +03:00
|
|
|
|
Path used for -xkbdir xserver parameter.
|
2015-12-24 15:30:42 +03:00
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
config = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.lines;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
description = ''
|
|
|
|
|
The contents of the configuration file of the X server
|
|
|
|
|
(<filename>xorg.conf</filename>).
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-06-03 12:14:54 +04:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
deviceSection = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.lines;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = "";
|
|
|
|
|
example = "VideoRAM 131072";
|
|
|
|
|
description = "Contents of the first Device section of the X server configuration file.";
|
|
|
|
|
};
|
2009-01-25 18:49:08 +03:00
|
|
|
|
|
2010-05-08 21:18:22 +04:00
|
|
|
|
screenSection = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.lines;
|
2010-05-08 21:18:22 +04:00
|
|
|
|
default = "";
|
|
|
|
|
example = ''
|
|
|
|
|
Option "RandRRotation" "on"
|
|
|
|
|
'';
|
|
|
|
|
description = "Contents of the first Screen section of the X server configuration file.";
|
|
|
|
|
};
|
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
monitorSection = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.lines;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = "";
|
|
|
|
|
example = "HorizSync 28-49";
|
|
|
|
|
description = "Contents of the first Monitor section of the X server configuration file.";
|
|
|
|
|
};
|
2009-04-08 17:41:33 +04:00
|
|
|
|
|
2018-06-30 10:33:45 +03:00
|
|
|
|
extraConfig = mkOption {
|
|
|
|
|
type = types.lines;
|
|
|
|
|
default = "";
|
|
|
|
|
description = "Additional contents (sections) included in the X server configuration file";
|
|
|
|
|
};
|
|
|
|
|
|
2013-01-10 03:31:08 +04:00
|
|
|
|
xrandrHeads = mkOption {
|
|
|
|
|
default = [];
|
2017-04-24 12:08:33 +03:00
|
|
|
|
example = [
|
|
|
|
|
"HDMI-0"
|
|
|
|
|
{ output = "DVI-0"; primary = true; }
|
|
|
|
|
{ output = "DVI-1"; monitorConfig = "Option \"Rotate\" \"left\""; }
|
|
|
|
|
];
|
|
|
|
|
type = with types; listOf (coercedTo str (output: {
|
|
|
|
|
inherit output;
|
|
|
|
|
}) (submodule { options = xrandrOptions; }));
|
2017-04-24 13:02:10 +03:00
|
|
|
|
# Set primary to true for the first head if no other has been set
|
|
|
|
|
# primary already.
|
2017-04-24 12:08:33 +03:00
|
|
|
|
apply = heads: let
|
|
|
|
|
hasPrimary = any (x: x.primary) heads;
|
|
|
|
|
firstPrimary = head heads // { primary = true; };
|
|
|
|
|
newHeads = singleton firstPrimary ++ tail heads;
|
|
|
|
|
in if heads != [] && !hasPrimary then newHeads else heads;
|
2013-01-10 03:31:08 +04:00
|
|
|
|
description = ''
|
2017-04-24 12:08:33 +03:00
|
|
|
|
Multiple monitor configuration, just specify a list of XRandR
|
|
|
|
|
outputs. The individual elements should be either simple strings or
|
|
|
|
|
an attribute set of output options.
|
2016-03-14 16:00:55 +03:00
|
|
|
|
|
2017-04-24 12:08:33 +03:00
|
|
|
|
If the element is a string, it is denoting the physical output for a
|
|
|
|
|
monitor, if it's an attribute set, you must at least provide the
|
|
|
|
|
<option>output</option> option.
|
2016-03-14 16:00:55 +03:00
|
|
|
|
|
2017-04-24 12:08:33 +03:00
|
|
|
|
The monitors will be mapped from left to right in the order of the
|
2013-01-10 03:31:08 +04:00
|
|
|
|
list.
|
|
|
|
|
|
2017-04-24 12:08:33 +03:00
|
|
|
|
By default, the first monitor will be set as the primary monitor if
|
|
|
|
|
none of the elements contain an option that has set
|
|
|
|
|
<option>primary</option> to <literal>true</literal>.
|
|
|
|
|
|
|
|
|
|
<note><para>Only one monitor is allowed to be primary.</para></note>
|
2013-01-10 03:31:08 +04:00
|
|
|
|
|
|
|
|
|
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 18:45:05 +04: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 16:37:33 +04:00
|
|
|
|
moduleSection = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.lines;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = "";
|
|
|
|
|
example =
|
|
|
|
|
''
|
|
|
|
|
SubSection "extmod"
|
|
|
|
|
EndSubsection
|
|
|
|
|
'';
|
|
|
|
|
description = "Contents of the Module section of the X server configuration file.";
|
|
|
|
|
};
|
2009-04-08 17:41:33 +04:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
serverLayoutSection = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.lines;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = "";
|
|
|
|
|
example =
|
|
|
|
|
''
|
|
|
|
|
Option "AIGLX" "true"
|
|
|
|
|
'';
|
|
|
|
|
description = "Contents of the ServerLayout section of the X server configuration file.";
|
|
|
|
|
};
|
2009-01-25 18:49:08 +03:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
extraDisplaySettings = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.lines;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = "";
|
|
|
|
|
example = "Virtual 2048 2048";
|
|
|
|
|
description = "Lines to be added to every Display subsection of the Screen section.";
|
|
|
|
|
};
|
2009-01-25 18:49:08 +03:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
defaultDepth = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.int;
|
2009-11-06 03:59:03 +03:00
|
|
|
|
default = 0;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
example = 8;
|
|
|
|
|
description = "Default colour depth.";
|
|
|
|
|
};
|
2009-01-25 18:49:08 +03:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
useXFS = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
# FIXME: what's the type of this option?
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = false;
|
|
|
|
|
example = "unix/:7100";
|
|
|
|
|
description = "Determines how to connect to the X Font Server.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
tty = mkOption {
|
2015-11-29 03:18:59 +03:00
|
|
|
|
type = types.nullOr types.int;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = 7;
|
|
|
|
|
description = "Virtual console for the X server.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
display = mkOption {
|
2015-11-29 03:18:59 +03:00
|
|
|
|
type = types.nullOr types.int;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = 0;
|
|
|
|
|
description = "Display number for the X server.";
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
virtualScreen = mkOption {
|
2013-10-30 20:37:45 +04:00
|
|
|
|
type = types.nullOr types.attrs;
|
2009-09-10 16:37:33 +04:00
|
|
|
|
default = null;
|
|
|
|
|
example = { x = 2048; y = 2048; };
|
|
|
|
|
description = ''
|
|
|
|
|
Virtual screen size for Xrandr.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2011-09-14 22:20:50 +04:00
|
|
|
|
|
2017-05-08 00:01:20 +03:00
|
|
|
|
verbose = mkOption {
|
|
|
|
|
type = types.nullOr types.int;
|
|
|
|
|
default = 3;
|
|
|
|
|
example = 7;
|
|
|
|
|
description = ''
|
|
|
|
|
Controls verbosity of X logging.
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2014-03-16 21:46:20 +04:00
|
|
|
|
useGlamor = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = false;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to use the Glamor module for 2D acceleration,
|
|
|
|
|
if possible.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2015-11-23 17:45:26 +03:00
|
|
|
|
|
|
|
|
|
enableCtrlAltBackspace = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = false;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to enable the DontZap option, which binds Ctrl+Alt+Backspace
|
|
|
|
|
to forcefully kill X. This can lead to data loss and is disabled
|
|
|
|
|
by default.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2016-12-05 00:30:42 +03:00
|
|
|
|
|
|
|
|
|
terminateOnReset = mkOption {
|
|
|
|
|
type = types.bool;
|
|
|
|
|
default = true;
|
|
|
|
|
description = ''
|
|
|
|
|
Whether to terminate X upon server reset.
|
|
|
|
|
'';
|
|
|
|
|
};
|
2009-09-10 16:37:33 +04:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
2013-05-16 19:23:31 +04:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
###### implementation
|
2009-11-22 01:14:01 +03:00
|
|
|
|
|
2013-10-30 21:30:23 +04:00
|
|
|
|
config = mkIf cfg.enable {
|
2014-04-29 16:16:34 +04:00
|
|
|
|
|
2018-08-20 15:25:25 +03:00
|
|
|
|
services.xserver.displayManager.lightdm.enable =
|
|
|
|
|
let dmconf = cfg.displayManager;
|
|
|
|
|
default = !( dmconf.auto.enable
|
|
|
|
|
|| dmconf.gdm.enable
|
|
|
|
|
|| dmconf.sddm.enable
|
|
|
|
|
|| dmconf.slim.enable
|
|
|
|
|
|| dmconf.xpra.enable );
|
|
|
|
|
in mkIf (default) true;
|
|
|
|
|
|
2014-04-29 16:16:34 +04:00
|
|
|
|
hardware.opengl.enable = mkDefault true;
|
|
|
|
|
|
2014-04-29 14:58:54 +04:00
|
|
|
|
services.xserver.videoDrivers = mkIf (cfg.videoDriver != null) [ cfg.videoDriver ];
|
2013-10-30 21:30:23 +04:00
|
|
|
|
|
2016-08-06 08:22:33 +03:00
|
|
|
|
# FIXME: somehow check for unknown driver names.
|
|
|
|
|
services.xserver.drivers = flip concatMap cfg.videoDrivers (name:
|
2014-04-29 16:16:34 +04:00
|
|
|
|
let driver =
|
|
|
|
|
attrByPath [name]
|
2014-10-05 02:03:52 +04:00
|
|
|
|
(if xorg ? ${"xf86video" + name}
|
|
|
|
|
then { modules = [xorg.${"xf86video" + name}]; }
|
2016-08-06 08:22:33 +03:00
|
|
|
|
else null)
|
2014-04-29 16:16:34 +04:00
|
|
|
|
knownVideoDrivers;
|
2016-08-06 08:22:33 +03:00
|
|
|
|
in optional (driver != null) ({ inherit name; modules = []; driverName = name; } // driver));
|
2014-04-29 16:16:34 +04:00
|
|
|
|
|
2017-04-24 12:08:33 +03:00
|
|
|
|
assertions = [
|
|
|
|
|
{ assertion = config.security.polkit.enable;
|
|
|
|
|
message = "X11 requires Polkit to be enabled (‘security.polkit.enable = true’).";
|
|
|
|
|
}
|
|
|
|
|
(let primaryHeads = filter (x: x.primary) cfg.xrandrHeads; in {
|
|
|
|
|
assertion = length primaryHeads < 2;
|
|
|
|
|
message = "Only one head is allowed to be primary in "
|
|
|
|
|
+ "‘services.xserver.xrandrHeads’, but there are "
|
|
|
|
|
+ "${toString (length primaryHeads)} heads set to primary: "
|
|
|
|
|
+ concatMapStringsSep ", " (x: x.output) primaryHeads;
|
|
|
|
|
})
|
|
|
|
|
];
|
2009-09-10 16:37:33 +04:00
|
|
|
|
|
2017-01-30 16:03:42 +03:00
|
|
|
|
environment.etc =
|
|
|
|
|
(optionals cfg.exportConfiguration
|
|
|
|
|
[ { source = "${configFile}";
|
|
|
|
|
target = "X11/xorg.conf";
|
|
|
|
|
}
|
|
|
|
|
# -xkbdir command line option does not seems to be passed to xkbcomp.
|
|
|
|
|
{ source = "${cfg.xkbDir}";
|
|
|
|
|
target = "X11/xkb";
|
|
|
|
|
}
|
|
|
|
|
])
|
2017-11-30 16:10:34 +03:00
|
|
|
|
# localectl looks into 00-keyboard.conf
|
|
|
|
|
++ [
|
|
|
|
|
{
|
|
|
|
|
text = ''
|
|
|
|
|
Section "InputClass"
|
|
|
|
|
Identifier "Keyboard catchall"
|
|
|
|
|
MatchIsKeyboard "on"
|
|
|
|
|
Option "XkbModel" "${cfg.xkbModel}"
|
|
|
|
|
Option "XkbLayout" "${cfg.layout}"
|
|
|
|
|
Option "XkbOptions" "${cfg.xkbOptions}"
|
|
|
|
|
Option "XkbVariant" "${cfg.xkbVariant}"
|
|
|
|
|
EndSection
|
|
|
|
|
'';
|
|
|
|
|
target = "X11/xorg.conf.d/00-keyboard.conf";
|
|
|
|
|
}
|
|
|
|
|
]
|
2016-05-23 14:01:01 +03:00
|
|
|
|
# Needed since 1.18; see https://bugs.freedesktop.org/show_bug.cgi?id=89023#c5
|
2017-01-30 16:03:42 +03:00
|
|
|
|
++ (let cfgPath = "/X11/xorg.conf.d/10-evdev.conf"; in
|
|
|
|
|
[{
|
|
|
|
|
source = xorg.xf86inputevdev.out + "/share" + cfgPath;
|
|
|
|
|
target = cfgPath;
|
|
|
|
|
}]
|
|
|
|
|
);
|
2011-09-14 22:20:50 +04:00
|
|
|
|
|
2013-10-30 20:52:35 +04:00
|
|
|
|
environment.systemPackages =
|
2015-11-25 11:47:56 +03:00
|
|
|
|
[ xorg.xorgserver.out
|
2009-09-10 16:37:33 +04:00
|
|
|
|
xorg.xrandr
|
|
|
|
|
xorg.xrdb
|
|
|
|
|
xorg.setxkbmap
|
|
|
|
|
xorg.iceauth # required for KDE applications (it's called by dcopserver)
|
2010-02-10 16:22:38 +03:00
|
|
|
|
xorg.xlsclients
|
|
|
|
|
xorg.xset
|
2009-09-10 16:37:33 +04:00
|
|
|
|
xorg.xsetroot
|
2013-04-27 05:30:40 +04:00
|
|
|
|
xorg.xinput
|
2009-09-13 17:26:35 +04:00
|
|
|
|
xorg.xprop
|
2016-04-12 20:12:47 +03:00
|
|
|
|
xorg.xauth
|
2010-02-10 16:22:38 +03:00
|
|
|
|
pkgs.xterm
|
2012-05-15 06:49:47 +04:00
|
|
|
|
pkgs.xdg_utils
|
2016-05-23 14:01:01 +03:00
|
|
|
|
xorg.xf86inputevdev.out # get evdev.4 man page
|
2009-09-10 16:37:33 +04:00
|
|
|
|
]
|
2014-09-05 13:53:36 +04:00
|
|
|
|
++ optional (elem "virtualbox" cfg.videoDrivers) xorg.xrefresh;
|
2014-03-17 22:27:06 +04:00
|
|
|
|
|
2018-09-06 02:04:40 +03:00
|
|
|
|
environment.pathsToLink = [ "/share/X11" ];
|
|
|
|
|
|
2018-08-15 11:55:35 +03:00
|
|
|
|
xdg = {
|
|
|
|
|
autostart.enable = true;
|
|
|
|
|
menus.enable = true;
|
|
|
|
|
mime.enable = true;
|
|
|
|
|
icons.enable = true;
|
|
|
|
|
};
|
2011-03-30 21:52:34 +04:00
|
|
|
|
|
2015-06-12 14:02:06 +03:00
|
|
|
|
# The default max inotify watches is 8192.
|
|
|
|
|
# Nowadays most apps require a good number of inotify watches,
|
|
|
|
|
# the value below is used by default on several other distros.
|
|
|
|
|
boot.kernel.sysctl."fs.inotify.max_user_watches" = mkDefault 524288;
|
|
|
|
|
|
2013-01-16 15:33:18 +04:00
|
|
|
|
systemd.defaultUnit = mkIf cfg.autorun "graphical.target";
|
2012-06-19 22:51:04 +04:00
|
|
|
|
|
2014-04-29 16:16:34 +04:00
|
|
|
|
systemd.services.display-manager =
|
2013-01-10 16:59:41 +04:00
|
|
|
|
{ description = "X11 Server";
|
|
|
|
|
|
2017-10-14 09:41:54 +03:00
|
|
|
|
after = [ "systemd-udev-settle.service" "local-fs.target" "acpid.service" "systemd-logind.service" ];
|
|
|
|
|
wants = [ "systemd-udev-settle.service" ];
|
2011-09-14 22:20:50 +04:00
|
|
|
|
|
2012-08-17 21:14:42 +04:00
|
|
|
|
restartIfChanged = false;
|
2012-03-18 06:10:39 +04:00
|
|
|
|
|
|
|
|
|
environment =
|
2014-09-28 17:11:10 +04:00
|
|
|
|
{
|
2018-03-18 05:28:14 +03:00
|
|
|
|
LD_LIBRARY_PATH = concatStringsSep ":" ([ "/run/opengl-driver/lib" ]
|
2014-04-29 16:16:34 +04:00
|
|
|
|
++ concatLists (catAttrs "libPath" cfg.drivers));
|
2009-09-10 16:37:33 +04:00
|
|
|
|
} // cfg.displayManager.job.environment;
|
|
|
|
|
|
|
|
|
|
preStart =
|
|
|
|
|
''
|
2009-09-10 19:49:16 +04:00
|
|
|
|
${cfg.displayManager.job.preStart}
|
2009-09-10 16:37:33 +04:00
|
|
|
|
|
|
|
|
|
rm -f /tmp/.X0-lock
|
|
|
|
|
'';
|
|
|
|
|
|
2009-09-13 19:03:07 +04:00
|
|
|
|
script = "${cfg.displayManager.job.execCmd}";
|
2013-10-15 15:15:33 +04:00
|
|
|
|
|
|
|
|
|
serviceConfig = {
|
|
|
|
|
Restart = "always";
|
|
|
|
|
RestartSec = "200ms";
|
2016-05-24 22:07:26 +03:00
|
|
|
|
SyslogIdentifier = "display-manager";
|
2016-10-10 23:35:37 +03:00
|
|
|
|
# Stop restarting if the display manager stops (crashes) 2 times
|
|
|
|
|
# in one minute. Starting X typically takes 3-4s.
|
|
|
|
|
StartLimitInterval = "30s";
|
|
|
|
|
StartLimitBurst = "3";
|
2013-10-15 15:15:33 +04:00
|
|
|
|
};
|
2009-09-10 16:37:33 +04:00
|
|
|
|
};
|
|
|
|
|
|
2016-10-28 19:15:40 +03:00
|
|
|
|
services.xserver.displayManager.xserverArgs =
|
2016-12-05 00:30:42 +03:00
|
|
|
|
[ "-config ${configFile}"
|
2015-12-24 15:30:42 +03:00
|
|
|
|
"-xkbdir" "${cfg.xkbDir}"
|
2016-05-24 22:07:26 +03:00
|
|
|
|
# Log at the default verbosity level to stderr rather than /var/log/X.*.log.
|
2017-05-08 00:01:20 +03:00
|
|
|
|
"-logfile" "/dev/null"
|
2016-10-28 19:15:40 +03:00
|
|
|
|
] ++ optional (cfg.display != null) ":${toString cfg.display}"
|
|
|
|
|
++ optional (cfg.tty != null) "vt${toString cfg.tty}"
|
2016-04-09 04:53:42 +03:00
|
|
|
|
++ optional (cfg.dpi != null) "-dpi ${toString cfg.dpi}"
|
2017-05-08 00:01:20 +03:00
|
|
|
|
++ optional (cfg.verbose != null) "-verbose ${toString cfg.verbose}"
|
2016-10-28 19:15:40 +03:00
|
|
|
|
++ optional (!cfg.enableTCP) "-nolisten tcp"
|
2016-10-01 22:44:58 +03:00
|
|
|
|
++ optional (cfg.autoRepeatDelay != null) "-ardelay ${toString cfg.autoRepeatDelay}"
|
2016-12-05 00:30:42 +03:00
|
|
|
|
++ optional (cfg.autoRepeatInterval != null) "-arinterval ${toString cfg.autoRepeatInterval}"
|
|
|
|
|
++ optional cfg.terminateOnReset "-terminate";
|
2009-09-10 16:37:33 +04:00
|
|
|
|
|
2009-11-06 03:59:03 +03:00
|
|
|
|
services.xserver.modules =
|
2014-04-29 16:16:34 +04:00
|
|
|
|
concatLists (catAttrs "modules" cfg.drivers) ++
|
2015-11-25 11:47:56 +03:00
|
|
|
|
[ xorg.xorgserver.out
|
2016-05-23 14:00:21 +03:00
|
|
|
|
xorg.xf86inputevdev.out
|
2009-11-06 03:59:03 +03:00
|
|
|
|
];
|
2011-09-14 22:20:50 +04:00
|
|
|
|
|
2015-12-26 11:06:28 +03:00
|
|
|
|
services.xserver.xkbDir = mkDefault "${pkgs.xkeyboard_config}/etc/X11/xkb";
|
|
|
|
|
|
nixos/xserver: Properly validate XKB options
Checking the keyboard layout has been a long set of hurdles so far, with
several attempts. Originally, the checking was introduced by @lheckemann
in #23709.
The initial implementation just was trying to check whether the symbols/
directory contained the layout name.
Unfortunately, that wasn't enough and keyboard variants weren't
recognized, so if you set layout to eg. "dvorak" it will fail with an
error (#25526).
So my improvement on that was to use sed to filter rules/base.lst and
match the layout against that. I fucked up twice with this, first
because layout can be a comma-separated list which I didn't account for
and second because I ran into a Nix issue (NixOS/nix#1426).
After fixing this, it still wasn't enough (and this is btw. what
localectl also does), because we were *only* matching rules but not
symbols, so using "eu" as a layout won't work either.
I decided now it's the time to actually use libxkbcommon to try
compiling the keyboard options and see whether it succeeds. This comes
in the form of a helper tool called xkbvalidate.
IMHO this approach is a lot less error-prone and we can be sure that we
don't forget about anything because that's what the X server itself uses
to compile the keymap.
Another advantage of this is that we now validate the full set of XKB
options rather than just the layout.
Tested this against a variety of wrong and correct keyboard
configurations and against the "keymap" NixOS VM tests.
Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @lheckemann, @peti, @7c6f434c, @tohl, @vcunat, @lluchs
Fixes: #27597
2017-07-28 13:36:48 +03:00
|
|
|
|
system.extraDependencies = singleton (pkgs.runCommand "xkb-validated" {
|
|
|
|
|
inherit (cfg) xkbModel layout xkbVariant xkbOptions;
|
|
|
|
|
nativeBuildInputs = [ pkgs.xkbvalidate ];
|
2017-06-22 04:22:48 +03:00
|
|
|
|
} ''
|
nixos/xserver: Properly validate XKB options
Checking the keyboard layout has been a long set of hurdles so far, with
several attempts. Originally, the checking was introduced by @lheckemann
in #23709.
The initial implementation just was trying to check whether the symbols/
directory contained the layout name.
Unfortunately, that wasn't enough and keyboard variants weren't
recognized, so if you set layout to eg. "dvorak" it will fail with an
error (#25526).
So my improvement on that was to use sed to filter rules/base.lst and
match the layout against that. I fucked up twice with this, first
because layout can be a comma-separated list which I didn't account for
and second because I ran into a Nix issue (NixOS/nix#1426).
After fixing this, it still wasn't enough (and this is btw. what
localectl also does), because we were *only* matching rules but not
symbols, so using "eu" as a layout won't work either.
I decided now it's the time to actually use libxkbcommon to try
compiling the keyboard options and see whether it succeeds. This comes
in the form of a helper tool called xkbvalidate.
IMHO this approach is a lot less error-prone and we can be sure that we
don't forget about anything because that's what the X server itself uses
to compile the keymap.
Another advantage of this is that we now validate the full set of XKB
options rather than just the layout.
Tested this against a variety of wrong and correct keyboard
configurations and against the "keymap" NixOS VM tests.
Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @lheckemann, @peti, @7c6f434c, @tohl, @vcunat, @lluchs
Fixes: #27597
2017-07-28 13:36:48 +03:00
|
|
|
|
validate "$xkbModel" "$layout" "$xkbVariant" "$xkbOptions"
|
2017-07-03 09:14:19 +03:00
|
|
|
|
touch "$out"
|
2017-06-22 04:22:48 +03:00
|
|
|
|
'');
|
2017-03-23 23:06:52 +03:00
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
services.xserver.config =
|
|
|
|
|
''
|
|
|
|
|
Section "ServerFlags"
|
|
|
|
|
Option "AllowMouseOpenFail" "on"
|
2015-11-23 17:45:26 +03:00
|
|
|
|
Option "DontZap" "${if cfg.enableCtrlAltBackspace then "off" else "on"}"
|
2013-11-04 18:45:05 +04:00
|
|
|
|
${cfg.serverFlagsSection}
|
2009-09-10 16:37:33 +04:00
|
|
|
|
EndSection
|
|
|
|
|
|
|
|
|
|
Section "Module"
|
|
|
|
|
${cfg.moduleSection}
|
|
|
|
|
EndSection
|
|
|
|
|
|
|
|
|
|
Section "Monitor"
|
2009-11-06 03:59:03 +03:00
|
|
|
|
Identifier "Monitor[0]"
|
2009-09-10 16:37:33 +04:00
|
|
|
|
${cfg.monitorSection}
|
|
|
|
|
EndSection
|
|
|
|
|
|
2015-04-18 20:52:15 +03:00
|
|
|
|
# Additional "InputClass" sections
|
2015-04-13 00:49:48 +03:00
|
|
|
|
${flip concatMapStrings cfg.inputClassSections (inputClassSection: ''
|
|
|
|
|
Section "InputClass"
|
|
|
|
|
${inputClassSection}
|
|
|
|
|
EndSection
|
|
|
|
|
'')}
|
|
|
|
|
|
|
|
|
|
|
2009-09-10 16:37:33 +04:00
|
|
|
|
Section "ServerLayout"
|
2009-11-06 03:59:03 +03:00
|
|
|
|
Identifier "Layout[all]"
|
2009-09-10 16:37:33 +04:00
|
|
|
|
${cfg.serverLayoutSection}
|
2009-11-06 03:59:03 +03:00
|
|
|
|
# Reference the Screen sections for each driver. This will
|
|
|
|
|
# cause the X server to try each in turn.
|
2014-04-29 16:16:34 +04:00
|
|
|
|
${flip concatMapStrings cfg.drivers (d: ''
|
2009-11-06 03:59:03 +03:00
|
|
|
|
Screen "Screen-${d.name}[0]"
|
|
|
|
|
'')}
|
2009-09-10 16:37:33 +04:00
|
|
|
|
EndSection
|
|
|
|
|
|
2014-03-16 21:46:20 +04:00
|
|
|
|
${if cfg.useGlamor then ''
|
|
|
|
|
Section "Module"
|
|
|
|
|
Load "dri2"
|
|
|
|
|
Load "glamoregl"
|
|
|
|
|
EndSection
|
|
|
|
|
'' else ""}
|
|
|
|
|
|
2009-11-06 03:59:03 +03:00
|
|
|
|
# For each supported driver, add a "Device" and "Screen"
|
|
|
|
|
# section.
|
2014-04-29 16:16:34 +04:00
|
|
|
|
${flip concatMapStrings cfg.drivers (driver: ''
|
2011-09-14 22:20:50 +04:00
|
|
|
|
|
2009-11-06 03:59:03 +03:00
|
|
|
|
Section "Device"
|
|
|
|
|
Identifier "Device-${driver.name}[0]"
|
2014-04-29 16:16:34 +04:00
|
|
|
|
Driver "${driver.driverName or driver.name}"
|
2014-03-16 21:46:20 +04:00
|
|
|
|
${if cfg.useGlamor then ''Option "AccelMethod" "glamor"'' else ""}
|
2009-11-06 03:59:03 +03:00
|
|
|
|
${cfg.deviceSection}
|
2018-06-30 10:33:45 +03:00
|
|
|
|
${driver.deviceSection or ""}
|
2013-01-10 03:31:08 +04:00
|
|
|
|
${xrandrDeviceSection}
|
2009-11-06 03:59:03 +03:00
|
|
|
|
EndSection
|
|
|
|
|
|
|
|
|
|
Section "Screen"
|
|
|
|
|
Identifier "Screen-${driver.name}[0]"
|
|
|
|
|
Device "Device-${driver.name}[0]"
|
2010-08-10 00:10:16 +04:00
|
|
|
|
${optionalString (cfg.monitorSection != "") ''
|
|
|
|
|
Monitor "Monitor[0]"
|
|
|
|
|
''}
|
2009-11-06 03:59:03 +03:00
|
|
|
|
|
2010-05-08 21:18:22 +04:00
|
|
|
|
${cfg.screenSection}
|
2018-06-30 10:33:45 +03:00
|
|
|
|
${driver.screenSection or ""}
|
2010-05-08 21:18:22 +04:00
|
|
|
|
|
2009-11-06 03:59:03 +03:00
|
|
|
|
${optionalString (cfg.defaultDepth != 0) ''
|
|
|
|
|
DefaultDepth ${toString cfg.defaultDepth}
|
|
|
|
|
''}
|
|
|
|
|
|
|
|
|
|
${optionalString
|
2010-08-10 00:10:16 +04:00
|
|
|
|
(driver.name != "virtualbox" &&
|
|
|
|
|
(cfg.resolutions != [] ||
|
|
|
|
|
cfg.extraDisplaySettings != "" ||
|
|
|
|
|
cfg.virtualScreen != null))
|
|
|
|
|
(let
|
2009-11-06 03:59:03 +03: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 22:20:50 +04:00
|
|
|
|
|
2009-11-06 03:59:03 +03:00
|
|
|
|
EndSection
|
|
|
|
|
'')}
|
2013-01-10 01:19:58 +04:00
|
|
|
|
|
2013-01-10 03:31:08 +04:00
|
|
|
|
${xrandrMonitorSections}
|
2018-06-30 10:33:45 +03:00
|
|
|
|
|
|
|
|
|
${cfg.extraConfig}
|
2009-09-10 16:37:33 +04:00
|
|
|
|
'';
|
|
|
|
|
|
2016-09-05 16:48:48 +03:00
|
|
|
|
fonts.enableDefaultFonts = mkDefault true;
|
|
|
|
|
|
2013-10-30 21:30:23 +04:00
|
|
|
|
};
|
2009-09-10 16:37:33 +04:00
|
|
|
|
|
2006-11-29 01:27:56 +03:00
|
|
|
|
}
|