Merge pull request #259891 from l0b0/refactor/xkb-attrset

This commit is contained in:
Artturi 2023-10-12 08:43:28 +03:00 committed by GitHub
commit 520e363e82
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 114 additions and 81 deletions

View File

@ -45,8 +45,8 @@ services.xserver.displayManager.gdm.enable = true;
You can set the keyboard layout (and optionally the layout variant): You can set the keyboard layout (and optionally the layout variant):
```nix ```nix
services.xserver.layout = "de"; services.xserver.xkb.layout = "de";
services.xserver.xkbVariant = "neo"; services.xserver.xkb.variant = "neo";
``` ```
The X server is started automatically at boot time. If you don't want The X server is started automatically at boot time. If you don't want
@ -266,7 +266,7 @@ Once the configuration is applied, and you did a logout/login cycle, the
layout should be ready to use. You can try it by e.g. running layout should be ready to use. You can try it by e.g. running
`setxkbmap us-greek` and then type `<alt>+a` (it may not get applied in `setxkbmap us-greek` and then type `<alt>+a` (it may not get applied in
your terminal straight away). To change the default, the usual your terminal straight away). To change the default, the usual
`services.xserver.layout` option can still be used. `services.xserver.xkb.layout` option can still be used.
A layout can have several other components besides `xkb_symbols`, for A layout can have several other components besides `xkb_symbols`, for
example we will define new keycodes for some multimedia key and bind example we will define new keycodes for some multimedia key and bind

View File

@ -269,6 +269,8 @@
order, or relying on `mkBefore` and `mkAfter`, but may impact users calling order, or relying on `mkBefore` and `mkAfter`, but may impact users calling
`mkOrder n` with n  400. `mkOrder n` with n  400.
- X keyboard extension (XKB) options have been reorganized into a single attribute set, `services.xserver.xkb`. Specifically, `services.xserver.layout` is now `services.xserver.xkb.layout`, `services.xserver.xkbModel` is now `services.xserver.xkb.model`, `services.xserver.xkbOptions` is now `services.xserver.xkb.options`, `services.xserver.xkbVariant` is now `services.xserver.xkb.variant`, and `services.xserver.xkbDir` is now `services.xserver.xkb.dir`.
- `networking.networkmanager.firewallBackend` was removed as NixOS is now using iptables-nftables-compat even when using iptables, therefore Networkmanager now uses the nftables backend unconditionally. - `networking.networkmanager.firewallBackend` was removed as NixOS is now using iptables-nftables-compat even when using iptables, therefore Networkmanager now uses the nftables backend unconditionally.
- [`lib.lists.foldl'`](https://nixos.org/manual/nixpkgs/stable#function-library-lib.lists.foldl-prime) now always evaluates the initial accumulator argument first. - [`lib.lists.foldl'`](https://nixos.org/manual/nixpkgs/stable#function-library-lib.lists.foldl-prime) now always evaluates the initial accumulator argument first.
@ -442,4 +444,3 @@ The module update takes care of the new config syntax and the data itself (user
- The `electron` packages now places its application files in `$out/libexec/electron` instead of `$out/lib/electron`. Packages using electron-builder will fail to build and need to be adjusted by changing `lib` to `libexec`. - The `electron` packages now places its application files in `$out/libexec/electron` instead of `$out/lib/electron`. Packages using electron-builder will fail to build and need to be adjusted by changing `lib` to `libexec`.
- `teleport` has been upgraded from major version 12 to major version 14. Please see upstream [upgrade instructions](https://goteleport.com/docs/management/operations/upgrading/) and release notes for versions [13](https://goteleport.com/docs/changelog/#1300-050823) and [14](https://goteleport.com/docs/changelog/#1400-092023). Note that Teleport does not officially support upgrades across more than one major version at a time. If you're running Teleport server components, it is recommended to first upgrade to an intermediate 13.x version by setting `services.teleport.package = pkgs.teleport_13`. Afterwards, this option can be removed to upgrade to the default version (14). - `teleport` has been upgraded from major version 12 to major version 14. Please see upstream [upgrade instructions](https://goteleport.com/docs/management/operations/upgrading/) and release notes for versions [13](https://goteleport.com/docs/changelog/#1300-050823) and [14](https://goteleport.com/docs/changelog/#1400-092023). Note that Teleport does not officially support upgrades across more than one major version at a time. If you're running Teleport server components, it is recommended to first upgrade to an intermediate 13.x version by setting `services.teleport.package = pkgs.teleport_13`. Afterwards, this option can be removed to upgrade to the default version (14).

View File

@ -127,8 +127,8 @@ in
${optionalString (config.environment.sessionVariables ? XKB_CONFIG_ROOT) ${optionalString (config.environment.sessionVariables ? XKB_CONFIG_ROOT)
"-I${config.environment.sessionVariables.XKB_CONFIG_ROOT}" "-I${config.environment.sessionVariables.XKB_CONFIG_ROOT}"
} \ } \
-model '${xkbModel}' -layout '${layout}' \ -model '${xkb.model}' -layout '${xkb.layout}' \
-option '${xkbOptions}' -variant '${xkbVariant}' > "$out" -option '${xkb.options}' -variant '${xkb.variant}' > "$out"
''); '');
} }

View File

@ -163,15 +163,15 @@ in
# console = { # console = {
# font = "Lat2-Terminus16"; # font = "Lat2-Terminus16";
# keyMap = "us"; # keyMap = "us";
# useXkbConfig = true; # use xkbOptions in tty. # useXkbConfig = true; # use xkb.options in tty.
# }; # };
$xserverConfig $xserverConfig
$desktopConfiguration $desktopConfiguration
# Configure keymap in X11 # Configure keymap in X11
# services.xserver.layout = "us"; # services.xserver.xkb.layout = "us";
# services.xserver.xkbOptions = "eurosign:e,caps:escape"; # services.xserver.xkb.options = "eurosign:e,caps:escape";
# Enable CUPS to print documents. # Enable CUPS to print documents.
# services.printing.enable = true; # services.printing.enable = true;

View File

@ -90,7 +90,7 @@ in
}; };
}; };
environment.etc."X11/xkb".source = xcfg.xkbDir; environment.etc."X11/xkb".source = xcfg.xkb.dir;
fonts.packages = [ pkgs.dejavu_fonts pkgs.ubuntu_font_family ]; fonts.packages = [ pkgs.dejavu_fonts pkgs.ubuntu_font_family ];

View File

@ -309,7 +309,7 @@ in
"/share" "/share"
]; ];
environment.etc."X11/xkb".source = xcfg.xkbDir; environment.etc."X11/xkb".source = xcfg.xkb.dir;
environment.sessionVariables = { environment.sessionVariables = {
PLASMA_USE_QT_SCALING = mkIf cfg.useQtScaling "1"; PLASMA_USE_QT_SCALING = mkIf cfg.useQtScaling "1";

View File

@ -204,10 +204,10 @@ in
left-handed = xcfg.libinput.mouse.leftHanded; left-handed = xcfg.libinput.mouse.leftHanded;
}; };
keyboard = { keyboard = {
keymap_model = xcfg.xkbModel; keymap_model = xcfg.xkb.model;
keymap_layout = xcfg.layout; keymap_layout = xcfg.xkb.layout;
keymap_variant = xcfg.xkbVariant; keymap_variant = xcfg.xkb.variant;
keymap_options = xcfg.xkbOptions; keymap_options = xcfg.xkb.options;
}; };
}; in "${pkgs.weston}/bin/weston --shell=fullscreen-shell.so -c ${westonIni}"; }; in "${pkgs.weston}/bin/weston --shell=fullscreen-shell.so -c ${westonIni}";
description = lib.mdDoc "Command used to start the selected compositor"; description = lib.mdDoc "Command used to start the selected compositor";

View File

@ -121,11 +121,11 @@ in
environment.sessionVariables = { environment.sessionVariables = {
# runtime override supported by multiple libraries e. g. libxkbcommon # runtime override supported by multiple libraries e. g. libxkbcommon
# https://xkbcommon.org/doc/current/group__include-path.html # https://xkbcommon.org/doc/current/group__include-path.html
XKB_CONFIG_ROOT = config.services.xserver.xkbDir; XKB_CONFIG_ROOT = config.services.xserver.xkb.dir;
}; };
services.xserver = { services.xserver = {
xkbDir = "${xkb_patched}/etc/X11/xkb"; xkb.dir = "${xkb_patched}/etc/X11/xkb";
exportConfiguration = config.services.xserver.displayManager.startx.enable exportConfiguration = config.services.xserver.displayManager.startx.enable
|| config.services.xserver.displayManager.sx.enable; || config.services.xserver.displayManager.sx.enable;
}; };

View File

@ -175,6 +175,31 @@ in
"Use services.xserver.fontPath instead of useXFS") "Use services.xserver.fontPath instead of useXFS")
(mkRemovedOptionModule [ "services" "xserver" "useGlamor" ] (mkRemovedOptionModule [ "services" "xserver" "useGlamor" ]
"Option services.xserver.useGlamor was removed because it is unnecessary. Drivers that uses Glamor will use it automatically.") "Option services.xserver.useGlamor was removed because it is unnecessary. Drivers that uses Glamor will use it automatically.")
(lib.mkRenamedOptionModuleWith {
sinceRelease = 2311;
from = [ "services" "xserver" "layout" ];
to = [ "services" "xserver" "xkb" "layout" ];
})
(lib.mkRenamedOptionModuleWith {
sinceRelease = 2311;
from = [ "services" "xserver" "xkbModel" ];
to = [ "services" "xserver" "xkb" "model" ];
})
(lib.mkRenamedOptionModuleWith {
sinceRelease = 2311;
from = [ "services" "xserver" "xkbOptions" ];
to = [ "services" "xserver" "xkb" "options" ];
})
(lib.mkRenamedOptionModuleWith {
sinceRelease = 2311;
from = [ "services" "xserver" "xkbVariant" ];
to = [ "services" "xserver" "xkb" "variant" ];
})
(lib.mkRenamedOptionModuleWith {
sinceRelease = 2311;
from = [ "services" "xserver" "xkbDir" ];
to = [ "services" "xserver" "xkb" "dir" ];
})
]; ];
@ -339,48 +364,55 @@ in
''; '';
}; };
layout = mkOption { xkb = mkOption {
type = types.str; description = "X keyboard extension (XKB) configuration";
default = "us"; type = types.submodule {
description = lib.mdDoc '' options = {
Keyboard layout, or multiple keyboard layouts separated by commas. layout = mkOption {
''; type = types.str;
}; default = "us";
description = lib.mdDoc ''
Keyboard layout, or multiple keyboard layouts separated by commas.
'';
};
xkbModel = mkOption { model = mkOption {
type = types.str; type = types.str;
default = "pc104"; default = "pc104";
example = "presario"; example = "presario";
description = lib.mdDoc '' description = lib.mdDoc ''
Keyboard model. Keyboard model.
''; '';
}; };
xkbOptions = mkOption { options = mkOption {
type = types.commas; type = types.commas;
default = "terminate:ctrl_alt_bksp"; default = "terminate:ctrl_alt_bksp";
example = "grp:caps_toggle,grp_led:scroll"; example = "grp:caps_toggle,grp_led:scroll";
description = lib.mdDoc '' description = lib.mdDoc ''
X keyboard options; layout switching goes here. X keyboard options; layout switching goes here.
''; '';
}; };
xkbVariant = mkOption { variant = mkOption {
type = types.str; type = types.str;
default = ""; default = "";
example = "colemak"; example = "colemak";
description = lib.mdDoc '' description = lib.mdDoc ''
X keyboard variant. X keyboard variant.
''; '';
}; };
xkbDir = mkOption { dir = mkOption {
type = types.path; type = types.path;
default = "${pkgs.xkeyboard_config}/etc/X11/xkb"; default = "${pkgs.xkeyboard_config}/etc/X11/xkb";
defaultText = literalExpression ''"''${pkgs.xkeyboard_config}/etc/X11/xkb"''; defaultText = literalExpression ''"''${pkgs.xkeyboard_config}/etc/X11/xkb"'';
description = lib.mdDoc '' description = lib.mdDoc ''
Path used for -xkbdir xserver parameter. Path used for -xkbdir xserver parameter.
''; '';
};
};
};
}; };
config = mkOption { config = mkOption {
@ -667,7 +699,7 @@ in
{ {
"X11/xorg.conf".source = "${configFile}"; "X11/xorg.conf".source = "${configFile}";
# -xkbdir command line option does not seems to be passed to xkbcomp. # -xkbdir command line option does not seems to be passed to xkbcomp.
"X11/xkb".source = "${cfg.xkbDir}"; "X11/xkb".source = "${cfg.xkb.dir}";
}) })
# localectl looks into 00-keyboard.conf # localectl looks into 00-keyboard.conf
//{ //{
@ -675,10 +707,10 @@ in
Section "InputClass" Section "InputClass"
Identifier "Keyboard catchall" Identifier "Keyboard catchall"
MatchIsKeyboard "on" MatchIsKeyboard "on"
Option "XkbModel" "${cfg.xkbModel}" Option "XkbModel" "${cfg.xkb.model}"
Option "XkbLayout" "${cfg.layout}" Option "XkbLayout" "${cfg.xkb.layout}"
Option "XkbOptions" "${cfg.xkbOptions}" Option "XkbOptions" "${cfg.xkb.options}"
Option "XkbVariant" "${cfg.xkbVariant}" Option "XkbVariant" "${cfg.xkb.variant}"
EndSection EndSection
''; '';
} }
@ -759,7 +791,7 @@ in
services.xserver.displayManager.xserverArgs = services.xserver.displayManager.xserverArgs =
[ "-config ${configFile}" [ "-config ${configFile}"
"-xkbdir" "${cfg.xkbDir}" "-xkbdir" "${cfg.xkb.dir}"
] ++ optional (cfg.display != null) ":${toString cfg.display}" ] ++ optional (cfg.display != null) ":${toString cfg.display}"
++ optional (cfg.tty != null) "vt${toString cfg.tty}" ++ optional (cfg.tty != null) "vt${toString cfg.tty}"
++ optional (cfg.dpi != null) "-dpi ${toString cfg.dpi}" ++ optional (cfg.dpi != null) "-dpi ${toString cfg.dpi}"
@ -777,14 +809,14 @@ in
]; ];
system.checks = singleton (pkgs.runCommand "xkb-validated" { system.checks = singleton (pkgs.runCommand "xkb-validated" {
inherit (cfg) xkbModel layout xkbVariant xkbOptions; inherit (cfg.xkb) model layout variant options;
nativeBuildInputs = with pkgs.buildPackages; [ xkbvalidate ]; nativeBuildInputs = with pkgs.buildPackages; [ xkbvalidate ];
preferLocalBuild = true; preferLocalBuild = true;
} '' } ''
${optionalString (config.environment.sessionVariables ? XKB_CONFIG_ROOT) ${optionalString (config.environment.sessionVariables ? XKB_CONFIG_ROOT)
"export XKB_CONFIG_ROOT=${config.environment.sessionVariables.XKB_CONFIG_ROOT}" "export XKB_CONFIG_ROOT=${config.environment.sessionVariables.XKB_CONFIG_ROOT}"
} }
xkbvalidate "$xkbModel" "$layout" "$xkbVariant" "$xkbOptions" xkbvalidate "$model" "$layout" "$variant" "$options"
touch "$out" touch "$out"
''); '');

View File

@ -31,7 +31,7 @@ let
nodes.machine.console.keyMap = mkOverride 900 layout; nodes.machine.console.keyMap = mkOverride 900 layout;
nodes.machine.services.xserver.desktopManager.xterm.enable = false; nodes.machine.services.xserver.desktopManager.xterm.enable = false;
nodes.machine.services.xserver.layout = mkOverride 900 layout; nodes.machine.services.xserver.xkb.layout = mkOverride 900 layout;
nodes.machine.imports = [ ./common/x11.nix extraConfig ]; nodes.machine.imports = [ ./common/x11.nix extraConfig ];
testScript = '' testScript = ''
@ -116,7 +116,7 @@ in pkgs.lib.mapAttrs mkKeyboardTest {
}; };
extraConfig.console.keyMap = "fr"; extraConfig.console.keyMap = "fr";
extraConfig.services.xserver.layout = "fr"; extraConfig.services.xserver.xkb.layout = "fr";
}; };
bone = { bone = {
@ -130,8 +130,8 @@ in pkgs.lib.mapAttrs mkKeyboardTest {
}; };
extraConfig.console.keyMap = "bone"; extraConfig.console.keyMap = "bone";
extraConfig.services.xserver.layout = "de"; extraConfig.services.xserver.xkb.layout = "de";
extraConfig.services.xserver.xkbVariant = "bone"; extraConfig.services.xserver.xkb.variant = "bone";
}; };
colemak = { colemak = {
@ -141,8 +141,8 @@ in pkgs.lib.mapAttrs mkKeyboardTest {
}; };
extraConfig.console.keyMap = "colemak"; extraConfig.console.keyMap = "colemak";
extraConfig.services.xserver.layout = "us"; extraConfig.services.xserver.xkb.layout = "us";
extraConfig.services.xserver.xkbVariant = "colemak"; extraConfig.services.xserver.xkb.variant = "colemak";
}; };
dvorak = { dvorak = {
@ -154,8 +154,8 @@ in pkgs.lib.mapAttrs mkKeyboardTest {
}; };
extraConfig.console.keyMap = "dvorak"; extraConfig.console.keyMap = "dvorak";
extraConfig.services.xserver.layout = "us"; extraConfig.services.xserver.xkb.layout = "us";
extraConfig.services.xserver.xkbVariant = "dvorak"; extraConfig.services.xserver.xkb.variant = "dvorak";
}; };
dvorak-programmer = { dvorak-programmer = {
@ -170,8 +170,8 @@ in pkgs.lib.mapAttrs mkKeyboardTest {
}; };
extraConfig.console.keyMap = "dvorak-programmer"; extraConfig.console.keyMap = "dvorak-programmer";
extraConfig.services.xserver.layout = "us"; extraConfig.services.xserver.xkb.layout = "us";
extraConfig.services.xserver.xkbVariant = "dvp"; extraConfig.services.xserver.xkb.variant = "dvp";
}; };
neo = { neo = {
@ -185,8 +185,8 @@ in pkgs.lib.mapAttrs mkKeyboardTest {
}; };
extraConfig.console.keyMap = "neo"; extraConfig.console.keyMap = "neo";
extraConfig.services.xserver.layout = "de"; extraConfig.services.xserver.xkb.layout = "de";
extraConfig.services.xserver.xkbVariant = "neo"; extraConfig.services.xserver.xkb.variant = "neo";
}; };
qwertz = { qwertz = {
@ -199,7 +199,7 @@ in pkgs.lib.mapAttrs mkKeyboardTest {
}; };
extraConfig.console.keyMap = "de"; extraConfig.console.keyMap = "de";
extraConfig.services.xserver.layout = "de"; extraConfig.services.xserver.xkb.layout = "de";
}; };
custom = { custom = {
@ -212,7 +212,7 @@ in pkgs.lib.mapAttrs mkKeyboardTest {
}; };
extraConfig.console.useXkbConfig = true; extraConfig.console.useXkbConfig = true;
extraConfig.services.xserver.layout = "us-greek"; extraConfig.services.xserver.xkb.layout = "us-greek";
extraConfig.services.xserver.extraLayouts.us-greek = extraConfig.services.xserver.extraLayouts.us-greek =
{ description = "US layout with alt-gr greek"; { description = "US layout with alt-gr greek";
languages = [ "eng" ]; languages = [ "eng" ];

View File

@ -121,10 +121,10 @@ int main(int argc, char **argv)
rdef = malloc(sizeof(struct xkb_rule_names)); rdef = malloc(sizeof(struct xkb_rule_names));
TRY_KEYMAP(model, argv[1], "xkbModel"); TRY_KEYMAP(model, argv[1], "xkb.model");
TRY_KEYMAP(layout, argv[2], "layout"); TRY_KEYMAP(layout, argv[2], "xkb.layout");
TRY_KEYMAP(variant, argv[3], "xkbVariant"); TRY_KEYMAP(variant, argv[3], "xkb.variant");
TRY_KEYMAP(options, argv[4], "xkbOptions"); TRY_KEYMAP(options, argv[4], "xkb.options");
free_logs(); free_logs();
rdef->model = argv[1]; rdef->model = argv[1];