gtk: a dead key hands the pending text back first

GtkIMContextSimple composes dead keys, and while it did the daemon still
held the syllable typed before them: the composed é was inserted first
and 하 reappeared after it.  A key the daemon does not take now resets
the composition when Simple begins composing on it — a modifier press,
which is also no key, leaves it alone.
This commit is contained in:
2026-08-17 11:59:42 +09:00
parent c102c87d55
commit 0f684ae6d3
2 changed files with 28 additions and 2 deletions

View File

@@ -764,6 +764,26 @@ main(int argc, char **argv)
Check(key(ctx, win, GDK_KEY_dead_acute) && key(ctx, win, GDK_KEY_e),
"dead-key sequence was not consumed");
Check(strcmp(log.commit, "é") == 0, "dead key committed %s", log.commit);
/* A dead key over a preedit hands the pending text back first. */
setreply(&srv, 1, Rnormal, 0);
setpre(&srv, "");
clearlog(&log);
Check(key(ctx, win, GDK_KEY_h), "dead-key setup key was not eaten");
clearevent(&log);
first = eventcount(&srv);
Check(!key(ctx, win, GDK_KEY_Shift_L), "a modifier press was eaten");
Check(eventcount(&srv) == first && strcmp(log.pre, "") == 0,
"a modifier press disturbed the preedit");
setreply(&srv, 0, Rnormal, 0);
setpre(&srv, "");
Check(key(ctx, win, GDK_KEY_dead_acute) && key(ctx, win, GDK_KEY_e),
"dead key over a preedit was not consumed");
Check(getevent(&srv, first).type == Ereset,
"dead key did not hand the pending text back");
Check(strcmp(log.commit, "é") == 0 && log.pre[0] == '\0',
"dead key over a preedit committed %s (preedit %s)",
log.commit, log.pre);
clearlog(&log);
Check(keystate(ctx, win, GDK_KEY_U, GDK_CONTROL_MASK|GDK_SHIFT_MASK),
"Unicode prefix was not consumed");