fix: assign one active engine owner
This commit is contained in:
@@ -155,6 +155,75 @@ engine_dictionary_queue_latest_wins(struct ct *t)
|
||||
dictreqc = saved;
|
||||
}
|
||||
|
||||
static Keyres
|
||||
ownerrequest(uvlong owner, int op, Rune key, u32int mod)
|
||||
{
|
||||
Channel *reply;
|
||||
Keyreq req;
|
||||
Keyres res;
|
||||
|
||||
reply = chancreate(sizeof(Keyres), 1);
|
||||
memset(&req, 0, sizeof req);
|
||||
req.owner = owner;
|
||||
req.op = op;
|
||||
req.ks = key;
|
||||
req.mod = mod;
|
||||
req.want = 1;
|
||||
req.reply = reply;
|
||||
imhandlekey(&req);
|
||||
chanrecv(reply, &res);
|
||||
chanfree(reply);
|
||||
return res;
|
||||
}
|
||||
|
||||
void
|
||||
engine_active_owner_lifecycle(struct ct *t)
|
||||
{
|
||||
Keyres res;
|
||||
Str shown;
|
||||
uvlong a, b, c;
|
||||
|
||||
a = ownernew();
|
||||
b = ownernew();
|
||||
c = ownernew();
|
||||
CT_CHECK(t, a != 0 && b != 0 && c != 0);
|
||||
CT_CHECK(t, a != b && b != c && a != c);
|
||||
init();
|
||||
im.l = getlang(LangJP);
|
||||
res = ownerrequest(a, Keypress, 'k', 0);
|
||||
CT_CHECK(t, res.eaten);
|
||||
res = ownerrequest(a, Keypress, 'a', 0);
|
||||
checkstr(t, "first owner preedit", "か", &res.preedit);
|
||||
CT_EQ_UINT(t, a, activeowner);
|
||||
|
||||
res = ownerrequest(b, Keypress, 'n', 0);
|
||||
checkstr(t, "takeover resets old preedit", "ん", &res.preedit);
|
||||
CT_EQ_UINT(t, b, activeowner);
|
||||
res = ownerrequest(a, Keyreset, 0, 0);
|
||||
CT_EQ_INT(t, 0, res.preedit.n);
|
||||
shown = shownpre(&im);
|
||||
checkstr(t, "stale reset preserves owner", "ん", &shown);
|
||||
CT_EQ_UINT(t, b, activeowner);
|
||||
|
||||
res = ownerrequest(b, Keypress, 'y', 0);
|
||||
res = ownerrequest(b, Keypress, 'a', 0);
|
||||
checkstr(t, "current owner continues", "にゃ", &res.preedit);
|
||||
ownerrequest(a, Keyrelease, 0, 0);
|
||||
shown = shownpre(&im);
|
||||
checkstr(t, "stale release preserves owner", "にゃ", &shown);
|
||||
CT_EQ_UINT(t, b, activeowner);
|
||||
|
||||
ownerrequest(b, Keyrelease, 0, 0);
|
||||
CT_EQ_UINT(t, 0, activeowner);
|
||||
CT_EQ_INT(t, 0, im.pre.n);
|
||||
CT_EQ_INT(t, 0, im.raw.n);
|
||||
ownerrequest(c, Keypress, Kmodfirst, 0);
|
||||
CT_EQ_UINT(t, 0, activeowner);
|
||||
res = ownerrequest(c, Keypress, 'k', 0);
|
||||
CT_EQ_UINT(t, c, activeowner);
|
||||
checkstr(t, "next owner first key", "k", &res.preedit);
|
||||
}
|
||||
|
||||
void
|
||||
engine_commit_contract(struct ct *t)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user