From 0c4271b8b53034df4d96489579de00bf1dca4040 Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Mon, 17 Aug 2026 01:44:29 +0900 Subject: [PATCH] engine: an emoji query shows as typed and Space picks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The emoji search folded the keys for its lookup and then showed and committed the folded copy: SMILE became smile in the text. And it showed the transliteration only while that alone matched, so a Korean query flipped between 웃 and key soup as it grew. Now the query shown is the keys while they match anything, else what they type in the current language, both as typed; only the lookups fold. Space in a search picks the highlighted result as Enter does, instead of adding a space no alias needs. --- README.md | 2 +- strans.c | 18 +++++++++++------- tests/engine_test.c | 7 +++++-- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b1b9c68..0aaf930 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Japanese consumes the confirming key; Korean and Vietnamese pass it on to the application. `Space` adds the reading in Katakana as the last candidate, so a word the dictionary lacks converts to Katakana with one `Space`. `Backspace` and `Esc` on a chosen candidate go back to the -reading. In a temporary Emoji or Hanja search, `Enter` commits the +reading. In a temporary Emoji or Hanja search, `Enter` or `Space` commits the highlighted result and `Tab`/`Shift-Tab` wrap through the results. Leaving the field or clicking elsewhere commits what is pending. `Esc` cancels a Japanese reading or a search; in Korean and Vietnamese it commits the diff --git a/strans.c b/strans.c index 31767bb..80cade3 100644 --- a/strans.c +++ b/strans.c @@ -560,30 +560,34 @@ transstr(Lang *l, Str *pre, Str *raw, Str *out) commitim(&q, out); } -/* The typed keys and their transliteration are both emoji queries. */ +/* + * The typed keys and their transliteration are both emoji queries, folded + * as the dictionary is; the query shown is the keys while they match + * something, else the transliteration, as typed. + */ static void emojiquery(void) { Str kouho[Maxkouho], raw, local; - int i, n, rawhit, localhit; + int i, n, rawhit; raw = search.raw; foldascii(&raw); - transstr(im.l, nil, &search.raw, &local); + transstr(im.l, nil, &search.raw, &search.text); + local = search.text; foldascii(&local); clearkouho(); n = dictprefix(getlang(LangEMOJI)->dict, &raw, kouho, Maxkouho); rawhit = n != 0; for(i = 0; i < n; i++) addkouho(&kouho[i]); - localhit = 0; if(scmp(&raw, &local) != 0){ n = dictprefix(getlang(LangEMOJI)->dict, &local, kouho, Maxkouho); - localhit = n != 0; for(i = 0; i < n; i++) addkouho(&kouho[i]); } - search.text = rawhit || !localhit ? raw : local; + if(rawhit) + search.text = search.raw; selectfirst(); } @@ -706,7 +710,7 @@ searchkey(u32int ks, u32int mod, Str *com) cyclekouho(mod & Mshift ? -1 : 1); return 1; } - if(ks == Kret){ + if(ks == Kret || ks == ' '){ if(im.nkouho > 0) picksearch(max(im.sel, 0), com); else diff --git a/tests/engine_test.c b/tests/engine_test.c index 7e0a32e..383cdb1 100644 --- a/tests/engine_test.c +++ b/tests/engine_test.c @@ -1526,6 +1526,7 @@ engine_emoji_digit_aliases(struct ct *t) checkstr(t, "zero alias", "⁰", &com); sclear(&com); + im.l = getlang(LangEN); CT_CHECK(t, keystroke('e', Mctrl, &com)); if(typekeys(t, "smile", &com)){ CT_CHECK(t, keystroke('9', 0, &com)); @@ -1582,6 +1583,7 @@ engine_search_candidate_keys(struct ct *t) Str com; emojibegin(&f, 0); + im.l = getlang(LangEN); sclear(&com); CT_CHECK(t, keystroke('e', Mctrl, &com)); if(typekeys(t, "smile", &com)){ @@ -1709,11 +1711,13 @@ engine_emoji_start_and_unknown(struct ct *t) sclear(&com); CT_CHECK(t, keystroke('e', Mctrl, &com)); if(typekeys(t, "xyz", &com)){ + /* Keys that match nothing show what they type in the language. */ CT_CHECK(t, !keystroke(Kspec|0x51, 0, &com)); - checkstr(t, "special commits shown query", "xyz", &com); + checkstr(t, "special commits shown query", "툨", &com); CT_CHECK(t, !search.lang); CT_EQ_INT(t, LangKO, im.l->lang); } + im.l = getlang(LangEN); /* A language switch commits the query like any other pending text. */ sclear(&com); @@ -1723,7 +1727,6 @@ engine_emoji_start_and_unknown(struct ct *t) checkstr(t, "language switch commits query", "xy", &com); CT_CHECK(t, !search.lang); CT_EQ_INT(t, LangEN, im.l->lang); - im.l = getlang(LangKO); } /* So do the search keys, ending or changing the search. */