transvi fixes:
1. qu-/gi- onset tone placement. The u after q, and the i after g when a
vowel follows, are onset glides rather than the rime nucleus, so the
tone must skip them: qua -> quá (was qúa), gia -> giá. The onset was
previously passed straight through to the app, so transvi never saw it
and toned the glide. Keep the onset in the preedit by adding qu-/gi-
clusters to telex.map (mktelex.py onsets(), appended additively to the
curated map), and add onsetglide() so transvi skips the glide. gi- with
no following vowel keeps i as the nucleus (gì, gìn).
2. A tone key on a vowel-less preedit (e.g. "đ" from dd) now commits the
preedit and lets the tone key pass through (eat=0), matching the engine
commit-on-passthrough invariant, instead of eating it into the commit.
Verified against the running engine: qua/quan/quay/quê/quên/quyển,
gia/già/giàu/giữ/giúp/giống, gì/gìn, dd+s; unchanged mua->mùa, của, lúa;
all non-qu/gi words byte-identical to before.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The GTK IM module only emitted the commit signal when the key was
eaten (r != 0). But when a non-matching key is pressed mid-composition
the engine commits the pending preedit and returns eaten=0 so the raw
key passes through, sending a commit string with eaten=0. GTK dropped
it, silently losing the composed text (e.g. Hangul "ㅇ" + "?" yielded
only "?").
Commit whenever a commit string is present, matching the wayland, ibus
and xim frontends.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>