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)
|
||||
{
|
||||
|
||||
@@ -12,4 +12,12 @@ ipc_masks_modifiers(struct ct *t)
|
||||
CT_EQ_INT(t, 1, want);
|
||||
CT_EQ_UINT(t, Mctrl|Malt, mod);
|
||||
CT_EQ_UINT(t, 0x1f642, key);
|
||||
CT_CHECK(t, !ipcreqreset(buf));
|
||||
|
||||
ipcpackreset(buf, 1);
|
||||
ipcunpackreq(buf, &want, &mod, &key);
|
||||
CT_EQ_INT(t, 1, want);
|
||||
CT_EQ_UINT(t, 0, mod);
|
||||
CT_EQ_UINT(t, 0, key);
|
||||
CT_CHECK(t, ipcreqreset(buf));
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ void engine_backspace_clears_candidates(struct ct*);
|
||||
void engine_selects_visible_candidate(struct ct*);
|
||||
void engine_candidate_shortcut_modifiers(struct ct*);
|
||||
void engine_dictionary_queue_latest_wins(struct ct*);
|
||||
void engine_active_owner_lifecycle(struct ct*);
|
||||
void engine_commit_contract(struct ct*);
|
||||
void engine_language_switch_state(struct ct*);
|
||||
void engine_telex_history_bound(struct ct*);
|
||||
|
||||
@@ -83,6 +83,7 @@ static const struct ct_test tests[] = {
|
||||
{ "engine/selects-visible-candidate", engine_selects_visible_candidate },
|
||||
{ "engine/candidate-shortcut-modifiers", engine_candidate_shortcut_modifiers },
|
||||
{ "engine/dictionary-queue-latest", engine_dictionary_queue_latest_wins },
|
||||
{ "engine/active-owner-lifecycle", engine_active_owner_lifecycle },
|
||||
{ "engine/commit-contract", engine_commit_contract },
|
||||
{ "engine/language-switch-state", engine_language_switch_state },
|
||||
{ "engine/telex-history-bound", engine_telex_history_bound },
|
||||
|
||||
Reference in New Issue
Block a user