Add support for modmap None (#291)
authorWismill <dev@wismill.eu>
Mon, 1 May 2023 20:30:41 +0000 (22:30 +0200)
committerGitHub <noreply@github.com>
Mon, 1 May 2023 20:30:41 +0000 (23:30 +0300)
commit5b5b67f28ccfe1fe69ec5569c90f1752de323a08
tree09c02e8aa8d7fe495109823ee5848cdc01becb96
parent0e9c2ec97e8f5280171002834243104b9f53a772
Add support for modmap None (#291)

Unlike current xkbcommon, X11’s xkbcomp allows to remove entries in
the modifiers’ map using “modifier_map None { … }”.

“None” is translated to the special value “XkbNoModifier” defined in
“X11/extensions/XKB.h”. Then it relies on the fact that in "CopyModMapDef",
the following code:

    1U << entry->modifier

ends up being zero when “entry->modifier” is “XkbNoModifier” (i.e. 0xFF).
Indeed, it relies on the overflow behaviour of the left shift, which in
practice resolves to use only the 5 low bits of the shift amount, i.e.
0x1F here. Then the result of “1U << 0xFF” is cast to “char”, i.e. 0.

This is a good trick but too magical, so in libxkbcommon we will use
an explicit test against our new constant XKB_MOD_NONE.
meson.build
src/keymap.h
src/text.c
src/xkbcomp/ast.h
src/xkbcomp/symbols.c
test/data/keymaps/modmap-none.xkb [new file with mode: 0644]
test/filecomp.c
test/modifiers.c [new file with mode: 0644]