From 32a97230430adcd8a82eef7deef32f22dc8c259c Mon Sep 17 00:00:00 2001 From: Hojun-Cho Date: Sun, 16 Aug 2026 20:27:31 +0900 Subject: [PATCH] fix(engine): the search keys commit the query they end or replace Ctrl+E during an emoji search, Ctrl+H during a hanja search, or either during the other search dropped the typed query, while every other Ctrl key committed it as the README says. Escape is the way to cancel; the search keys now commit the shown text like a language switch. --- strans.c | 29 +++++++++++++---------------- tests/engine_test.c | 17 +++++++++++++++++ 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/strans.c b/strans.c index 445bb92..4b5fd07 100644 --- a/strans.c +++ b/strans.c @@ -556,15 +556,6 @@ endsearch(void) clearkouho(); } -/* A search commits any pending composition and takes over the keys. */ -static void -startsearch(int lang, Str *com) -{ - commit(com); - endsearch(); - search.lang = lang; -} - static void commitsearch(Str *com) { @@ -572,6 +563,15 @@ commitsearch(Str *com) endsearch(); } +/* A search commits whatever is pending and takes over the keys. */ +static void +startsearch(int lang, Str *com) +{ + commit(com); + commitsearch(com); + search.lang = lang; +} + static void picksearch(int n, Str *com) { @@ -639,15 +639,12 @@ searchkey(u32int ks, u32int mod, Str *com) if(mod & Mctrl){ c = ctrlkey(ks); n = searchlang(c); - if(n == search.lang) - endsearch(); - else if(n != 0) + if(n != 0 && n != search.lang){ startsearch(n, com); - else{ - commitsearch(com); - return setlang(c); + return 1; } - return 1; + commitsearch(com); + return n != 0 || setlang(c); } if(search.raw.n >= Maxrunes){ commitsearch(com); diff --git a/tests/engine_test.c b/tests/engine_test.c index 1c36653..7937b20 100644 --- a/tests/engine_test.c +++ b/tests/engine_test.c @@ -1585,6 +1585,23 @@ engine_emoji_start_and_unknown(struct ct *t) im.l = getlang(LangKO); } + /* So do the search keys, ending or changing the search. */ + sclear(&com); + CT_CHECK(t, keystroke('e', Mctrl, &com)); + if(typekeys(t, "xy", &com)){ + CT_CHECK(t, keystroke('e', Mctrl, &com)); + checkstr(t, "search key commits query", "xy", &com); + CT_CHECK(t, !search.lang); + } + sclear(&com); + CT_CHECK(t, keystroke('e', Mctrl, &com)); + if(typekeys(t, "xy", &com)){ + CT_CHECK(t, keystroke('h', Mctrl, &com)); + checkstr(t, "other search commits query", "xy", &com); + CT_EQ_INT(t, LangHANJA, search.lang); + CT_CHECK(t, keystroke(Kesc, 0, &com)); + } + sclear(&com); CT_CHECK(t, keystroke('e', Mctrl, &com)); for(i = 0; i < Maxrunes; i++)