diff --git a/nixos/modules/services/x11/xserver.nix b/nixos/modules/services/x11/xserver.nix index 09fcdd0b72b..01e1659b30b 100644 --- a/nixos/modules/services/x11/xserver.nix +++ b/nixos/modules/services/x11/xserver.nix @@ -648,34 +648,25 @@ in services.xserver.xkbDir = mkDefault "${pkgs.xkeyboard_config}/etc/X11/xkb"; - system.extraDependencies = [ - (pkgs.runCommand "xkb-layouts-exist" { - layouts=cfg.layout; - } '' - missing=() - while read -d , layout - do - [[ -f "${cfg.xkbDir}/symbols/$layout" ]] || missing+=($layout) - done <<< "$layouts," - if [[ ''${#missing[@]} -eq 0 ]] - then - touch $out - exit 0 - fi + system.extraDependencies = singleton (pkgs.runCommand "xkb-layouts-exist" { + inherit (cfg) layout xkbDir; + } '' + sed -n -e ':i /^! \(layout\|variant\) *$/ { + :l; n; /^!/bi; s/^ *\([^ ]\+\).*/\1/p; tl + }' "$xkbDir/rules/base.lst" | grep -qxF "$layout" && exec touch "$out" - cat >&2 <&2 <<-EOF - Some of the selected keyboard layouts do not exist: + The selected keyboard layout definition does not exist: - ''${missing[@]} + $layout - Set services.xserver.layout to the name of an existing keyboard - layout (check ${cfg.xkbDir}/symbols for options). + Set \`services.xserver.layout' to the name of an existing keyboard + layout (check $xkbDir/rules/base.lst for options). - EOF - exit -1 - '') - ]; + EOF + exit 1 + ''); services.xserver.config = ''