cleanup: simplify frontend request ownership
This commit is contained in:
@@ -161,7 +161,7 @@ engine_dictionary_queue_latest_wins(struct ct *t)
|
||||
}
|
||||
|
||||
static Keyres
|
||||
ownerrequestat(uvlong owner, int op, Rune key, u32int mod, Caret *caret)
|
||||
ownerrequestat(void *owner, int op, Rune key, u32int mod, Caret *caret)
|
||||
{
|
||||
Channel *reply;
|
||||
Keyreq req;
|
||||
@@ -175,7 +175,6 @@ ownerrequestat(uvlong owner, int op, Rune key, u32int mod, Caret *caret)
|
||||
req.mod = mod;
|
||||
if(caret != nil)
|
||||
req.caret = *caret;
|
||||
req.want = 1;
|
||||
req.reply = reply;
|
||||
imhandlekey(&req);
|
||||
chanrecv(reply, &res);
|
||||
@@ -184,7 +183,7 @@ ownerrequestat(uvlong owner, int op, Rune key, u32int mod, Caret *caret)
|
||||
}
|
||||
|
||||
static Keyres
|
||||
ownerrequest(uvlong owner, int op, Rune key, u32int mod)
|
||||
ownerrequest(void *owner, int op, Rune key, u32int mod)
|
||||
{
|
||||
return ownerrequestat(owner, op, key, mod, nil);
|
||||
}
|
||||
@@ -194,57 +193,75 @@ engine_active_owner_lifecycle(struct ct *t)
|
||||
{
|
||||
Keyres res;
|
||||
Str shown;
|
||||
uvlong a, b, c;
|
||||
char 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);
|
||||
res = ownerrequest(&a, Keypress, 'k', 0);
|
||||
CT_CHECK(t, res.eaten);
|
||||
res = ownerrequest(a, Keypress, 'a', 0);
|
||||
res = ownerrequest(&a, Keypress, 'a', 0);
|
||||
checkstr(t, "first owner preedit", "か", &res.preedit);
|
||||
CT_EQ_UINT(t, a, activeowner);
|
||||
CT_EQ_PTR(t, &a, activeowner);
|
||||
|
||||
res = ownerrequest(b, Keypress, 'n', 0);
|
||||
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_PTR(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);
|
||||
CT_EQ_PTR(t, &b, activeowner);
|
||||
|
||||
res = ownerrequest(b, Keypress, 'y', 0);
|
||||
res = ownerrequest(b, Keypress, 'a', 0);
|
||||
res = ownerrequest(&b, Keypress, 'y', 0);
|
||||
res = ownerrequest(&b, Keypress, 'a', 0);
|
||||
checkstr(t, "current owner continues", "にゃ", &res.preedit);
|
||||
ownerrequest(a, Keyrelease, 0, 0);
|
||||
ownerrequest(&a, Keyrelease, 0, 0);
|
||||
shown = shownpre(&im);
|
||||
checkstr(t, "stale release preserves owner", "にゃ", &shown);
|
||||
CT_EQ_UINT(t, b, activeowner);
|
||||
CT_EQ_PTR(t, &b, activeowner);
|
||||
|
||||
ownerrequest(b, Keyrelease, 0, 0);
|
||||
CT_EQ_UINT(t, 0, activeowner);
|
||||
ownerrequest(&b, Keyrelease, 0, 0);
|
||||
CT_EQ_PTR(t, nil, 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);
|
||||
ownerrequest(&c, Keypress, Kmodfirst, 0);
|
||||
CT_EQ_PTR(t, nil, activeowner);
|
||||
res = ownerrequest(&c, Keypress, 'k', 0);
|
||||
CT_EQ_PTR(t, &c, activeowner);
|
||||
checkstr(t, "next owner first key", "k", &res.preedit);
|
||||
}
|
||||
|
||||
void
|
||||
engine_active_owner_reset(struct ct *t)
|
||||
{
|
||||
Caret at;
|
||||
Keyres res;
|
||||
char owner;
|
||||
|
||||
memset(&at, 0, sizeof at);
|
||||
at.valid = 1;
|
||||
at.x = 10;
|
||||
at.y = 20;
|
||||
at.h = 14;
|
||||
init();
|
||||
im.l = getlang(LangJP);
|
||||
ownerrequestat(&owner, Keypress, 'k', 0, &at);
|
||||
res = ownerrequest(&owner, Keypress, 'a', 0);
|
||||
checkstr(t, "preedit before reset", "か", &res.preedit);
|
||||
res = ownerrequest(&owner, Keyreset, 0, 0);
|
||||
CT_EQ_PTR(t, &owner, activeowner);
|
||||
CT_EQ_INT(t, 0, res.preedit.n);
|
||||
CT_CHECK(t, !caret.valid);
|
||||
res = ownerrequest(&owner, Keypress, 'n', 0);
|
||||
checkstr(t, "same owner after reset", "ん", &res.preedit);
|
||||
}
|
||||
|
||||
void
|
||||
engine_active_owner_caret(struct ct *t)
|
||||
{
|
||||
Caret a, moved;
|
||||
uvlong one, two;
|
||||
char one, two;
|
||||
|
||||
one = ownernew();
|
||||
two = ownernew();
|
||||
memset(&a, 0, sizeof a);
|
||||
a.valid = 1;
|
||||
a.x = 10;
|
||||
@@ -254,15 +271,15 @@ engine_active_owner_caret(struct ct *t)
|
||||
moved.x = 80;
|
||||
init();
|
||||
im.l = getlang(LangJP);
|
||||
ownerrequestat(one, Keypress, 'k', 0, &a);
|
||||
ownerrequestat(&one, Keypress, 'k', 0, &a);
|
||||
CT_CHECK(t, caret.valid);
|
||||
CT_EQ_INT(t, 10, caret.x);
|
||||
ownerrequestat(two, Keycaret, 0, 0, &moved);
|
||||
ownerrequestat(&two, Keycaret, 0, 0, &moved);
|
||||
CT_EQ_INT(t, 10, caret.x);
|
||||
ownerrequestat(one, Keycaret, 0, 0, &moved);
|
||||
ownerrequestat(&one, Keycaret, 0, 0, &moved);
|
||||
CT_EQ_INT(t, 80, caret.x);
|
||||
ownerrequest(two, Keypress, 'n', 0);
|
||||
CT_EQ_UINT(t, two, activeowner);
|
||||
ownerrequest(&two, Keypress, 'n', 0);
|
||||
CT_EQ_PTR(t, &two, activeowner);
|
||||
CT_CHECK(t, !caret.valid);
|
||||
}
|
||||
|
||||
@@ -1430,7 +1447,8 @@ engine_randomized_stress(struct ct *t)
|
||||
Keyres res;
|
||||
Caret pos;
|
||||
u32int rnd, mod;
|
||||
uvlong owners[3], owner;
|
||||
char contexts[3];
|
||||
void *owner, *owners[3];
|
||||
int i, j, op;
|
||||
|
||||
vi = getlang(LangVI);
|
||||
@@ -1439,9 +1457,9 @@ engine_randomized_stress(struct ct *t)
|
||||
vimap = vi->map;
|
||||
vi->map = testvi.map;
|
||||
emojibegin(&f, 0);
|
||||
owners[0] = ownernew();
|
||||
owners[1] = ownernew();
|
||||
owners[2] = ownernew();
|
||||
owners[0] = &contexts[0];
|
||||
owners[1] = &contexts[1];
|
||||
owners[2] = &contexts[2];
|
||||
rnd = 0x5eed1234U;
|
||||
for(i = 0; i < 16000; i++){
|
||||
rnd = stressrand(&rnd);
|
||||
@@ -1506,7 +1524,7 @@ engine_randomized_stress(struct ct *t)
|
||||
i = 16000;
|
||||
break;
|
||||
}
|
||||
if(activeowner != 0 && activeowner != owners[0] &&
|
||||
if(activeowner != nil && activeowner != owners[0] &&
|
||||
activeowner != owners[1] && activeowner != owners[2]){
|
||||
CT_ERRORF(t, "unknown active owner after stress operation %d", i);
|
||||
break;
|
||||
|
||||
@@ -34,6 +34,7 @@ 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_active_owner_reset(struct ct*);
|
||||
void engine_active_owner_caret(struct ct*);
|
||||
void engine_commit_contract(struct ct*);
|
||||
void engine_language_switch_state(struct ct*);
|
||||
|
||||
@@ -88,6 +88,7 @@ static const struct ct_test tests[] = {
|
||||
{ "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/active-owner-reset", engine_active_owner_reset },
|
||||
{ "engine/active-owner-caret", engine_active_owner_caret },
|
||||
{ "engine/commit-contract", engine_commit_contract },
|
||||
{ "engine/language-switch-state", engine_language_switch_state },
|
||||
|
||||
Reference in New Issue
Block a user