libxkbcommon icon indicating copy to clipboard operation
libxkbcommon copied to clipboard

Compose: allow overlapping sequences

Open wismill opened this issue 2 years ago • 4 comments

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> : "•" U2022 but 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_SUPPORT to test overlapping sequences support at compile time via #ifdef.
  • xkb_compose_compile_flags: XKB_COMPOSE_COMPILE_OVERLAPPING_SEQUENCES: Allow overlapping sequences
  • xkb_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.

wismill avatar Nov 01 '23 17:11 wismill

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.

wismill avatar Nov 01 '23 17:11 wismill

I asked feedback to Qt devs.

wismill avatar Nov 02 '23 06:11 wismill

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.

wismill avatar Nov 03 '23 08:11 wismill

I sent a merge request in Qt.

wismill avatar Nov 08 '23 09:11 wismill