Compose: allow overlapping sequences
Motivation
Currently xkbcommon does not support Compose overlapping sequences, unlike GTK and ibus. It means a sequence that is a prefix to a longer one is simply discarded with a warning.
This is unfortunate:
-
There is discrepency for users of xkbcommon, e.g. Qt-based apps.
-
It is impossible to have a sequence that is the prefix of another one. As a consequence, if one imports e.g. the system locale Compose file (as many – most ? – custom Compose files do), some sequences become impossible.
Example: I used
<Multi_key> <minus> <period> : "•" U2022but upstream change in libX11 added<Multi_key> <minus> <period> <e> : "ė̄", so I had to introduce an alternative sequence for Qt apps, although the previous one works in GTK-based apps.
Proposed change
This commit introduces the new following API:
- Macro
XKB_COMPOSE_HAS_OVERLAPPING_SEQUENCES_SUPPORTto test overlapping sequences support at compile time via#ifdef. xkb_compose_compile_flags:XKB_COMPOSE_COMPILE_OVERLAPPING_SEQUENCES: Allow overlapping sequencesxkb_compose_status: -XKB_COMPOSE_CANDIDATE: A complete sequence has been matched, but a longer sequence also exists. -XKB_COMPOSE_CANDIDATE_ACCEPTED: The last sequence was accepted due to an unmatched keysym.
Fixes #395
NOTE: I intend to add the first two commits in #399. Will need to rebase once done.
Trying the patch
You can try it with
meson devenv -C build xkbcli-interactive-wayland --enable-compose --enable-compose-overlapping
or replace wayland with x11 if relevant.
Implementation in Qt
I asked feedback to Qt devs.
I sent also sent a merge request.
The idea is to create nodes that contain the overlapping results using a previously unused slot.
Possible enhancements:
- Naming
- Compose sequence iterator
- Doc
- Integration in toolkits (Qt in particular)
It would be great to be able to test this in Qt apps to test the design, but I will not do it myself.
I asked feedback to Qt devs.
Not too happy with the XKB_COMPOSE_CANDIDATE_ACCEPTED state. But if we return just XKB_COMPOSE_COMPOSED, then the client should handle the last keysym as not part of the sequence.
I sent a merge request in Qt.