engine: route popup preedit by client capability
This commit is contained in:
@@ -192,7 +192,8 @@ engine_dictionary_queue_latest_wins(struct ct *t)
|
||||
}
|
||||
|
||||
static Keyres
|
||||
ownerrequestat(void *owner, int op, Rune key, u32int mod, Caret *caret)
|
||||
ownerrequestatcap(void *owner, int cap, int op, Rune key, u32int mod,
|
||||
Caret *caret)
|
||||
{
|
||||
Channel *reply;
|
||||
Keyreq req;
|
||||
@@ -201,6 +202,7 @@ ownerrequestat(void *owner, int op, Rune key, u32int mod, Caret *caret)
|
||||
reply = chancreate(sizeof(Keyres), 1);
|
||||
memset(&req, 0, sizeof req);
|
||||
req.owner = owner;
|
||||
req.cap = cap;
|
||||
req.op = op;
|
||||
req.ks = key;
|
||||
req.mod = mod;
|
||||
@@ -213,12 +215,24 @@ ownerrequestat(void *owner, int op, Rune key, u32int mod, Caret *caret)
|
||||
return res;
|
||||
}
|
||||
|
||||
static Keyres
|
||||
ownerrequestat(void *owner, int op, Rune key, u32int mod, Caret *caret)
|
||||
{
|
||||
return ownerrequestatcap(owner, 0, op, key, mod, caret);
|
||||
}
|
||||
|
||||
static Keyres
|
||||
ownerrequest(void *owner, int op, Rune key, u32int mod)
|
||||
{
|
||||
return ownerrequestat(owner, op, key, mod, nil);
|
||||
}
|
||||
|
||||
static Keyres
|
||||
ownerrequestcap(void *owner, int cap, int op, Rune key, u32int mod)
|
||||
{
|
||||
return ownerrequestatcap(owner, cap, op, key, mod, nil);
|
||||
}
|
||||
|
||||
void
|
||||
engine_active_owner_lifecycle(struct ct *t)
|
||||
{
|
||||
@@ -566,7 +580,7 @@ struct Searchfix
|
||||
Search search;
|
||||
Lang *dictlang;
|
||||
Hmap *dict;
|
||||
int popup;
|
||||
int activecap;
|
||||
int visible;
|
||||
};
|
||||
|
||||
@@ -601,7 +615,7 @@ searchsave(Searchfix *f, int lang)
|
||||
f->search = search;
|
||||
f->dictlang = getlang(lang);
|
||||
f->dict = f->dictlang->dict;
|
||||
f->popup = popup;
|
||||
f->activecap = activecap;
|
||||
f->visible = visible;
|
||||
draindraw(nil);
|
||||
}
|
||||
@@ -629,7 +643,7 @@ emojibegin(Searchfix *f, int showpre)
|
||||
"c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12");
|
||||
init();
|
||||
im.l = getlang(LangKO);
|
||||
popup = showpre;
|
||||
activecap = showpre ? 0 : Cclientpreedit;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -643,10 +657,54 @@ searchend(Searchfix *f)
|
||||
draindraw(nil);
|
||||
im = f->im;
|
||||
search = f->search;
|
||||
popup = f->popup;
|
||||
activecap = f->activecap;
|
||||
visible = f->visible;
|
||||
}
|
||||
|
||||
void
|
||||
engine_popup_preedit_capability(struct ct *t)
|
||||
{
|
||||
Dictres res;
|
||||
Drawcmd dc;
|
||||
char client, popupowner;
|
||||
|
||||
init();
|
||||
im.l = getlang(LangJP);
|
||||
draindraw(nil);
|
||||
ownerrequestcap(&client, Cclientpreedit, Keypress, 'k', 0);
|
||||
ownerrequestcap(&client, Cclientpreedit, Keypress, 'a', 0);
|
||||
memset(&res, 0, sizeof res);
|
||||
res.lang = LangJP;
|
||||
res.key = mkstr("か");
|
||||
res.kouho[0] = mkstr("家");
|
||||
res.nkouho = 1;
|
||||
dictresult(&res);
|
||||
if(CT_CHECK(t, draindraw(&dc) > 0)){
|
||||
CT_EQ_INT(t, 0, dc.pre.n);
|
||||
CT_EQ_INT(t, 1, dc.nkouho);
|
||||
checkstr(t, "client-preedit candidate", "家", &dc.kouho[0]);
|
||||
}
|
||||
|
||||
ownerrequestcap(&popupowner, 0, Keypress, 'n', 0);
|
||||
if(CT_CHECK(t, draindraw(&dc) > 0)){
|
||||
checkstr(t, "popup preedit", "ん", &dc.pre);
|
||||
CT_EQ_INT(t, 0, dc.nkouho);
|
||||
}
|
||||
memset(&res, 0, sizeof res);
|
||||
res.lang = LangJP;
|
||||
res.key = mkstr("ん");
|
||||
res.kouho[0] = mkstr("ン");
|
||||
res.nkouho = 1;
|
||||
dictresult(&res);
|
||||
if(CT_CHECK(t, draindraw(&dc) > 0)){
|
||||
checkstr(t, "async popup preedit", "ん", &dc.pre);
|
||||
CT_EQ_INT(t, 1, dc.nkouho);
|
||||
checkstr(t, "popup candidate", "ン", &dc.kouho[0]);
|
||||
}
|
||||
ownerrequest(&popupowner, Keyrelease, 0, 0);
|
||||
draindraw(nil);
|
||||
}
|
||||
|
||||
static void
|
||||
hanjabegin(Searchfix *f, int lang)
|
||||
{
|
||||
@@ -841,10 +899,8 @@ engine_emoji_single_candidate(struct ct *t)
|
||||
Searchfix f;
|
||||
Str com;
|
||||
|
||||
emojibegin(&f, 1);
|
||||
emojibegin(&f, 0);
|
||||
sclear(&com);
|
||||
CT_CHECK(t, keystroke('p', Mctrl, &com));
|
||||
CT_EQ_INT(t, 0, popup);
|
||||
CT_CHECK(t, keystroke('e', Mctrl, &com));
|
||||
CT_CHECK(t, search.lang);
|
||||
CT_EQ_INT(t, LangKO, im.l->lang);
|
||||
@@ -1083,7 +1139,6 @@ engine_emoji_preedit_languages(struct ct *t)
|
||||
{
|
||||
Searchfix f;
|
||||
Str com, shown;
|
||||
int p;
|
||||
|
||||
emojibegin(&f, 0);
|
||||
init();
|
||||
@@ -1105,15 +1160,10 @@ engine_emoji_preedit_languages(struct ct *t)
|
||||
CT_CHECK(t, keystroke('E', Mctrl|Mshift, &com));
|
||||
CT_EQ_INT(t, LangJP, im.l->lang);
|
||||
CT_CHECK(t, keystroke('a', 0, &com));
|
||||
p = popup;
|
||||
CT_CHECK(t, !keystroke(Kmodfirst+2, 0, &com));
|
||||
CT_CHECK(t, search.lang);
|
||||
checkstr(t, "modifier preserves search", "a", &search.text);
|
||||
CT_CHECK(t, keystroke('P', Mctrl|Mshift, &com));
|
||||
CT_EQ_INT(t, !p, popup);
|
||||
CT_CHECK(t, search.lang);
|
||||
CT_CHECK(t, !keystroke(Kmodfirst+2, 0, &com));
|
||||
CT_CHECK(t, keystroke('E', Mctrl|Mshift, &com));
|
||||
CT_CHECK(t, !keystroke('P', Mctrl|Mshift, &com));
|
||||
CT_CHECK(t, !search.lang);
|
||||
sclear(&com);
|
||||
if(typekeys(t, "na", &com)){
|
||||
|
||||
Reference in New Issue
Block a user