fix: assign one active engine owner

This commit is contained in:
2026-08-12 15:41:46 +09:00
parent 9c244d1dd1
commit 5ba5cf209c
14 changed files with 212 additions and 13 deletions

View File

@@ -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)
{