|
libxkbcommon
1.13.1
Library implementing the XKB specification for parsing keyboard descriptions and handling keyboard state
|
This page describes how to add a custom keyboard layout or option so that it will be parsed by libxkbcommon.
$XDG_CONFIG_HOME with the system configuration directory in the file locations. See xkb-data-locations for further details.echo $XDG_SESSION_TYPE.setxkbmap nor xkbcomp does work in Wayland sessions.@important An erroneous XKB configuration may make your keyboard unusable. Therefore it is advised to try custom configurations safely in user-space using xkbcli tools; see “Testing a custom configuration” for further details.
This example creates a minimal custom layout that swaps the number row (numbers require Shift).
This works by defining a new symbols file, which tells XKB how keys map to characters.
Create a temporary XKB directory (used later via --include):
Create the file: /tmp/xkb/symbols/test with the following content:
Use the xkbcli tool provided by the libxkbcommon-tools package (or similar) to compile and inspect the new layout:
Compilation should succeed and print “valid!”.
xkbcli in the /tmp directory.To preview how keys behave interactively, use the following command. It will open a window that needs to stay focused and log the keys in the terminal. Use Esc to quit.
If everything worked, you now have a working custom keyboard layout named test!
@important This step does affect your system. Ensure that the layout compiles (see the previous step) before going further. An erroneous layout may make your keyboard unusable!
$XDG_CONFIG_HOME/xkb/symbols/test – where $XDG_CONFIG_HOME is usually $HOME/.config – so it is in the default libxkbcommon include paths.Enabling the keyboard layout depends on your environment. On desktop environments (e.g. GNOME, KDE), the GUI configuration tools require a further step: see Discoverable layouts. Other configuration methods depend on your environment and are not covered here.
This example defines a single simple layout. Read on to discover more advanced customizations:
$XDG_CONFIG_HOME); see “Testing a custom configuration” for further details.libxkbcommon searches the following paths for XKB configuration files:
Scope
Rank
Name
Path </thead> <tbody>
User
1
User configuration
$XDG_CONFIG_HOME/xkb/, or $HOME/.config/xkb/ if the $XDG_CONFIG_HOME environment variable is not defined. See the XDG Base Directory Specification for further details.
2
Legacy user configuration
$HOME/.xkb/ as a legacy alternative to the previous XDG option. xkeyboard-config (also: xkb-data) package. </tbody> A keymap created with xkb_keymap::xkb_keymap_new_from_names2() will look up those paths in order until the required data is found.
root), only the system path is available (<xkb-config-root>).$XDG_CONFIG_HOME with <sysconfdir> in the file locations (see in the table above).Each directory should have one or more of the following subdirectories:
The majority of user-specific configurations involve modifying key symbols and this is what this document focuses on. For use-cases where a user may need to add new key types or compat entries the general approach remains the same. See “The XKB keymap text format, V1 and V2” for detailed descriptions for how to add those types or compat entries.
You should never need to add user-specific keycodes. Where a keycode is missing, the addition should be filed in the upstream xkeyboard-config project.
Due to how XKB is configured, there is no such thing as a “layout” in XKB itself, or, indeed, any of the rules, models, variant, options (RMLVO) described in struct xkb_rule_names. RMLVO names are merely lookup keys in the rules file provided by xkeyboard-config to map to the correct keycode, compat, geometry (ignored by libxkbcommon), symbols and types (KcCGST). The KcCGST data is the one used by XKB and libxkbcommon to map keys to actual symbols.
For example, a common RMLVO configuration is layout us, variant dvorak and option terminate:ctrl_alt_bksp. Using the default rules file and model this maps into the following KcCGST components:
Output of the command: xkbcli compile-keymap --kccgst --layout us --variant dvorak --options terminate:ctrl_alt_bksp
A detailed explanation of how rules files convert RMLVO to KcCGST is out of scope for this document. See the rules file page instead.
Adding a layout requires that the user adds symbols in the correct location.
<AE01>) <xkb-config-root>/symbols/pc for the basic system keys<xkb-config-root>/symbols/inet (section evdev) for the special function keys<xkb-config-root>/symbols/us for the US Qwerty layout xkbcommon-keysyms.h (remove the XKB_KEY_ prefix to get the name). The dead keys follow the pattern dead_<diacritic name>.The default rules files (usually evdev) have a catch-all to map a layout, say foo, and a variant, say bar, into the bar section in the file <xkb-config-root>/symbols/foo. This is sufficient to define a new keyboard layout. The example below defines the keyboard layout banana with an optional variant orange:
Content of $XDG_CONFIG_HOME/xkb/symbols/banana
The default section is loaded when no variant is given. The first example section uses include to populate with a symbols list defined elsewhere (here: section basic from the file symbols/us, aka. the default US keyboard layout) and overrides parts of these symbols. The effect of this section is to swap the numbers and symbols in the top-most row (compared to the US layout) but otherwise use the US layout.
The orange variant uses the banana symbols and includes a different section to define the eurosign. It does not specifically override any symbols.
The exact details of how xkb_symbols section works is detailed in “The XKB keymap text format, V1 and V2”.
banana that should not clash with the system files in <xkb-config-root>/symbols. Using the same file name than the system files is possible but may require special handling, see: Using system file names.Options are sets of changes of any keymap components that affect the whole keyboard.
For technical reasons, options do not have a catch-all to map option names to files and sections and must be specifically mapped by the user. This requires a custom rules file. As the evdev ruleset is hardcoded in many clients, the custom rules file must usually be named evdev.
Content of $XDG_CONFIG_HOME/xkb/rules/evdev
The include statement includes the system-provided evdev ruleset. This allows users to only override those options they need afterwards.
This rules file maps the RMLVO option custom:foo to the bar section in the symbols/custom file and the custom:baz option to the baz section in the symbols/other file. Note how the RMLVO option name may be different to the file or section name.
@important The order of the options matters in the rule file! This is due to the sequential processing of the rules. In the example, custom:foo will always be applied before custom:baz and both options will always be applied after the system ones, even if the order is different in the RMLVO configuration passed to libxkbcommon (e.g. with xkbcli). See the related section in the rules documentation for further details.
The files themselves are similar to the layout examples in the previous section:
Content of $XDG_CONFIG_HOME/xkb/symbols/custom
Content of $XDG_CONFIG_HOME/xkb/symbols/other
With these in place, a user may select any layout/variant together with the custom:foo and/or custom:baz options.
custom and other that should not clash with the system files in <xkb-config-root>/symbols. Using the same file name than the system files is possible but may require special handling, see: Using system file names.The previous examples use custom keymap files with file name that do not clash with the files in the system directory, <xkb-config-root>. It is possible to add a custom variant/option using the same file name than the system file, e.g. $XDG_CONFIG_HOME/xkb/symbols/us instead of $XDG_CONFIG_HOME/xkb/symbols/banana for the example in Adding a layout.
broccoli layout variant: $XDG_CONFIG_HOME/xkb/symbols/us For libxkbcommon ≥ 1.9 an explicit default section is not required anymore: libxkbcommon will look up for the proper default section in the XKB paths:
Content of $XDG_CONFIG_HOME/xkb/symbols/us
One may override the system sections:
default before xkb_symbols in the custom file.Therefore is it highly recommended to not override the system sections and prefer creating proper independent variants.
%S to the included file. See the corresponding documentation.libxkbregistry as XKB lookup tool and does not work where clients parse the XML file directly.The above sections apply only to the data files and require that the user knows about the existence of the new entries. To make custom entries discoverable by the configuration tools (e.g. the GNOME Control Center), the new entries must also be added to the XML file that is parsed by libxkbregistry. In most cases, this is the evdev.xml file in the rules directory.
The following tags are required:
name <group>:<option_name>. shortDescription description name[Group1]. See the xkeyboard-config documentation for further information.
The example below shows the XML file that would add the custom layout and custom options as outlined above to the XKB registry:
Content of $XDG_CONFIG_HOME/xkb/rules/evdev.xml
The default behavior of libxkbregistry ensures that the new layout and options are added to the system-provided layouts and options.
For details on the XML format, see the DTD in <xkb-config-root>/rules/xkb.dtd and the system-provided XML files <xkb-config-root>/rules/*.xml.
xkbcli tools. See “Testing a custom configuration” for further details.