diff --git a/README.md b/README.md index 08bb295..7721450 100644 --- a/README.md +++ b/README.md @@ -28,8 +28,8 @@ what is pending; `Esc` cancels it. Hiragana mode composes a complete reading before offering Kanji candidates. Katakana mode does not perform Kanji conversion. Emoji and Hanja searches return to the previous mode after use; switching language during a search -commits the shown query. The Hanja dictionary lists one modern Hangul -syllable at a time. +commits the shown query. `Ctrl+H` takes the syllable being composed as its +query; the Hanja dictionary lists one modern Hangul syllable at a time. ## Preedit and candidates diff --git a/strans.c b/strans.c index b27aad1..834778f 100644 --- a/strans.c +++ b/strans.c @@ -10,10 +10,12 @@ static Drawcmd lastdraw; static Emit transjp(Im*, Rune); static void backjp(Im*); +/* seed is what Ctrl+H found pending; raw the keys typed since; text both. */ typedef struct Search Search; struct Search { int lang; + Str seed; Str raw; Str text; }; @@ -228,18 +230,6 @@ redraw(void) channbsend(drawc, &dc); } -static void -reset(void) -{ - sclear(&im.pre); - sclear(&im.raw); - search.lang = 0; - sclear(&search.raw); - sclear(&search.text); - memset(&caret, 0, sizeof caret); - clearkouho(); -} - /* Kanji candidates for a complete reading. */ static void dictqjp(void) @@ -526,9 +516,11 @@ hanjaquery(void) Str key; transstr(im.l, &search.raw, &key); - search.text = key; + search.text = search.seed; + sappend(&search.text, &key); clearkouho(); - im.nkouho = dictlookup(getlang(LangHANJA), &key, im.kouho, Maxkouho); + im.nkouho = dictlookup(getlang(LangHANJA), &search.text, im.kouho, + Maxkouho); selectfirst(); } @@ -551,11 +543,21 @@ static void endsearch(void) { search.lang = 0; + sclear(&search.seed); sclear(&search.raw); sclear(&search.text); clearkouho(); } +static void +reset(void) +{ + sclear(&im.pre); + sclear(&im.raw); + endsearch(); + memset(&caret, 0, sizeof caret); +} + static void commitsearch(Str *com) { @@ -563,13 +565,27 @@ commitsearch(Str *com) endsearch(); } -/* A search commits whatever is pending and takes over the keys. */ +/* + * A search takes over the keys. Hanja converts the pending syllable, so + * it becomes the query; anything else pending is committed. + */ static void startsearch(int lang, Str *com) { - commit(com); + Str pending; + + impre(&im, &pending); + if(lang == LangHANJA){ + sclear(&im.pre); + sclear(&im.raw); + }else + commit(com); commitsearch(com); search.lang = lang; + if(lang == LangHANJA){ + search.seed = pending; + searchquery(); + } } /* @@ -635,11 +651,14 @@ searchkey(u32int ks, u32int mod, Str *com) return 1; } if(ks == Kback){ - if(search.raw.n == 0){ + if(search.raw.n != 0) + spopr(&search.raw); + else if(search.seed.n != 0) + spopr(&search.seed); + else{ endsearch(); - return 0; + return 1; } - spopr(&search.raw); searchquery(); return 1; } diff --git a/tests/engine_test.c b/tests/engine_test.c index 6bfe7bb..d5d9cf4 100644 --- a/tests/engine_test.c +++ b/tests/engine_test.c @@ -1744,15 +1744,20 @@ engine_hanja_backspace(struct ct *t) CT_CHECK(t, keystroke(Kback, 0, &com)); checkstr(t, "empty Hanja search", "", &search.text); CT_EQ_INT(t, LangHANJA, search.lang); - CT_CHECK(t, !keystroke(Kback, 0, &com)); + CT_CHECK(t, keystroke(Kback, 0, &com)); CT_EQ_INT(t, 0, search.lang); + /* Ctrl+H converts the pending syllable: it seeds the query. */ if(!typekeys(t, "gks", &com)) goto cleanup; CT_CHECK(t, keystroke('h', Mctrl, &com)); - checkstr(t, "preedit committed before Hanja", "한", &com); + checkstr(t, "nothing committed before Hanja", "", &com); + checkstr(t, "pending syllable is the query", "한", &search.text); + CT_EQ_INT(t, 2, im.nkouho); + CT_CHECK(t, keystroke(Kback, 0, &com)); + checkstr(t, "seed backspaced", "", &search.text); CT_EQ_INT(t, LangHANJA, search.lang); - CT_CHECK(t, !keystroke(Kback, 0, &com)); + CT_CHECK(t, keystroke(Kback, 0, &com)); CT_EQ_INT(t, 0, search.lang); CT_EQ_INT(t, LangKO, im.l->lang); cleanup: