hanja: separate temporary search mode
This commit is contained in:
77
strans.c
77
strans.c
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user