hanja: separate temporary search mode

This commit is contained in:
2026-08-12 21:23:10 +09:00
parent 4e1c15dde4
commit 136695a900
6 changed files with 216 additions and 195 deletions

View File

@@ -16,20 +16,12 @@ static int maplookup(Trie*, Str*, Str*);
typedef struct Search Search;
struct Search
{
int kind;
int lang;
Str raw;
Str text;
};
static Search search;
enum
{
SearchOff,
SearchEmoji,
SearchHanja,
Hanjakey = 0x08,
};
uvlong
ownernew(void)
{
@@ -47,7 +39,8 @@ Lang langs[] = {
{LangEN, nil, nil, nil, nil, nil, nil, nil},
{LangJP, "hira", "kanji", transmap, backjp, dictqjp, nil, nil},
{LangJPK, "kata", nil, transmap, backjp, dictqjp, nil, nil},
{LangKO, nil, "hanja", transko, backko, nil, nil, nil},
{LangKO, nil, nil, transko, backko, nil, nil, nil},
{LangHANJA, nil, "hanja", nil, nil, nil, nil, nil},
{LangEMOJI, nil, "emoji", nil, nil, nil, nil, nil},
{LangVI, "telex", nil, transvi, backvi, dictqmap, nil, nil},
};
@@ -123,12 +116,12 @@ show(void)
int i, first, n;
sclear(&dc.pre);
if(search.kind)
if(search.lang)
pre = search.text;
else
impre(&pre);
if(popup){
if(search.kind || isjp(&im) || im.l->map == nil ||
if(search.lang || isjp(&im) || im.l->map == nil ||
!mapget(im.l->map, &pre, &dc.pre))
dc.pre = pre;
}
@@ -154,7 +147,7 @@ reset(void)
{
sclear(&im.pre);
sclear(&im.raw);
search.kind = SearchOff;
search.lang = 0;
sclear(&search.raw);
sclear(&search.text);
memset(&caret, 0, sizeof caret);
@@ -511,38 +504,39 @@ hanjaquery(void)
static Dictres res;
Str key;
transstr(getlang(LangKO), &search.raw, &key);
transstr(im.l, &search.raw, &key);
search.text = key;
searchlookup(LangKO, &key, &res);
setkouho(&res);
if(key.n == 1 && key.r[0] >= 0xac00 && key.r[0] <= 0xd7a3){
searchlookup(LangHANJA, &key, &res);
setkouho(&res);
}else
clearkouho();
show();
}
static void
searchquery(void)
{
if(search.kind == SearchEmoji)
if(search.lang == LangEMOJI)
emojiquery();
else if(search.kind == SearchHanja)
else if(search.lang == LangHANJA)
hanjaquery();
}
static int
searchkind(Rune c, u32int mod)
searchlang(Rune c, u32int mod)
{
if(c == LangEMOJI)
return SearchEmoji;
if(mod & (Malt|Msuper))
return SearchOff;
if(c == Hanjakey && im.l->lang == LangKO)
return SearchHanja;
return SearchOff;
return 0;
if(c == LangEMOJI || c == LangHANJA)
return c;
return 0;
}
static void
endsearch(void)
{
search.kind = SearchOff;
search.lang = 0;
sclear(&search.raw);
sclear(&search.text);
clearkouho();
@@ -550,14 +544,14 @@ endsearch(void)
}
static void
startsearch(int kind, Str *com)
startsearch(int lang, Str *com)
{
if(haspre(&im))
commit(com);
sclear(&im.pre);
sclear(&im.raw);
clearkouho();
search.kind = kind;
search.lang = lang;
sclear(&search.raw);
sclear(&search.text);
show();
@@ -636,11 +630,16 @@ searchkey(u32int ks, u32int mod, Str *com)
endsearch();
return 1;
}
if(ks >= Kspec || (ks < ' ' && !(mod & Mctrl)) ||
(mod & (Malt|Msuper))){
commitsearch(com);
return 0;
}
if(mod & Mctrl){
c = ctrlkey(ks);
n = searchkind(c, mod);
if(n != SearchOff){
if(n == search.kind)
n = searchlang(c, mod);
if(n != 0){
if(n == search.lang)
endsearch();
else
startsearch(n, com);
@@ -656,15 +655,11 @@ searchkey(u32int ks, u32int mod, Str *com)
return 1;
return 0;
}
if(ks >= Kspec || ks < ' ' || (mod & (Malt|Msuper))){
commitsearch(com);
return 0;
}
if(search.raw.n >= Maxrunes){
commitsearch(com);
return 0;
}
if(search.kind == SearchHanja)
if(im.l->lang == LangKO)
ks = kokey(ks, mod);
sputr(&search.raw, ks);
searchquery();
@@ -679,7 +674,7 @@ keystroke(u32int ks, u32int mod, Str *com)
if(ismodkey(ks))
return 0;
if(search.kind)
if(search.lang)
return searchkey(ks, mod, com);
if(ks == Kdown || ks == Kup){
if(im.nkouho == 0)
@@ -738,8 +733,8 @@ keystroke(u32int ks, u32int mod, Str *com)
}
if(mod & Mctrl){
c = ctrlkey(ks);
n = searchkind(c, mod);
if(n != SearchOff){
n = searchlang(c, mod);
if(n != 0){
startsearch(n, com);
return 1;
}
@@ -844,7 +839,7 @@ imhandlekey(Keyreq *kr)
break;
}
if(kr->want && kr->owner == activeowner){
if(search.kind)
if(search.lang)
res.preedit = search.text;
else
impre(&res.preedit);
@@ -858,7 +853,7 @@ dictresult(Dictres *res)
Str pre;
impre(&pre);
if(search.kind || res->lang != im.l->lang ||
if(search.lang || res->lang != im.l->lang ||
scmp(&res->key, &pre) != 0)
return;
setkouho(res);