diff --git a/README.md b/README.md index 26a9d3e..fe07ad0 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,9 @@ compatibility mode. | `Ctrl+E` | Emoji and symbol search | | `Ctrl+H` | One-shot Hanja search | +Switching mode shows the mode switched to — `A`, `한`, `あ`, `ア`, `ă` — in +the popup until the next key. + A Korean keyboard's 한/영 key toggles Korean and English, and its 한자 key is `Ctrl+H`; a Japanese keyboard's 半角/全角 toggles Japanese and English, ひらがな/カタカナ switches between the two kana modes, 変換 turns Japanese diff --git a/strans.c b/strans.c index 6cb868e..e059481 100644 --- a/strans.c +++ b/strans.c @@ -7,6 +7,7 @@ static void *lostowner; /* the context the engine was taken from */ static Str lost; static int clientpre; /* the owner draws its own preedit */ static Caret caret; +static Rune modemark; /* the mode the last key switched to */ static Drawcmd lastdraw; static Emit transjp(Im*, Rune); static void backjp(Im*); @@ -197,6 +198,8 @@ snapshot(Drawcmd *dc) dc->pre = pre; if(search.lang && pre.n == 0) /* a search just begun shows itself */ sputr(&dc->pre, search.lang == LangEMOJI ? L'☺' : L'漢'); + else if(modemark != 0 && pre.n == 0 && im.nkouho == 0) + sputr(&dc->pre, modemark); first = pagefirst(); n = im.nkouho - first; if(n > Maxdisp) n = Maxdisp; @@ -336,6 +339,19 @@ katakouho(void) addkouho(&k); } +/* What the popup shows for a moment when the mode changes. */ +static Rune +langmark(int lang) +{ + switch(lang){ + case LangJP: return L'あ'; + case LangJPK: return L'ア'; + case LangKO: return L'한'; + case LangVI: return L'ă'; + } + return L'A'; +} + static int setlang(int c) { @@ -344,6 +360,8 @@ setlang(int c) l = getlang(c); if(l == nil) return 0; + if(l != im.l) + modemark = langmark(l->lang); im.l = l; return 1; } @@ -783,6 +801,7 @@ transition(u32int ks, u32int mod, Str *com) int n; Rune c; + modemark = 0; /* any key after the switch takes its mark away */ if(im.l->lang == LangKO) ks = kokey(ks, mod); else if(isjp(&im)) @@ -897,6 +916,7 @@ init(void) im.sel = -1; memset(&search, 0, sizeof search); memset(&caret, 0, sizeof caret); + modemark = 0; activeowner = nil; lostowner = nil; clientpre = 0; diff --git a/tests/engine_test.c b/tests/engine_test.c index 9ff0ec7..a376153 100644 --- a/tests/engine_test.c +++ b/tests/engine_test.c @@ -565,11 +565,25 @@ engine_korean_modifiers_and_backspace(struct ct *t) void engine_direct_language_modes(struct ct *t) { + Drawcmd dc; Str com; init(); + draindraw(nil); sclear(&com); CT_EQ_INT(t, LangEN, im.l->lang); + /* A switch shows the mode it switched to until the next key. */ + CT_CHECK(t, keystroke('s', Mctrl, &com)); + if(CT_CHECK(t, draindraw(&dc) > 0)) + checkstr(t, "mode mark", "한", &dc.pre); + CT_CHECK(t, keystroke('t', Mctrl, &com)); + if(CT_CHECK(t, draindraw(&dc) > 0)) + checkstr(t, "mode mark", "A", &dc.pre); + CT_CHECK(t, !keystroke('a', 0, &com)); + if(CT_CHECK(t, draindraw(&dc) > 0)) + CT_EQ_INT(t, 0, dc.pre.n); + CT_CHECK(t, !keystroke('a', 0, &com)); + CT_EQ_INT(t, 0, draindraw(nil)); CT_EQ_PTR(t, nil, im.l->mapname); CT_EQ_PTR(t, nil, im.l->map); CT_EQ_PTR(t, nil, im.l->trans);