engine: the one capability is a flag

Cclientpreedit was a one-bit mask that every producer set as "want ?
Cclientpreedit : 0" and every consumer masked out again; nothing else
was ever going to join it.  Keyreq carries clientpre, an int that says
whether the client draws the preedit, and the engine and the XIM
context keep it under that name.
This commit is contained in:
2026-08-17 10:57:15 +09:00
parent 33023d7f51
commit 88ad5f7630
10 changed files with 53 additions and 57 deletions

View File

@@ -184,7 +184,7 @@ ownerrequestatcap(void *owner, int cap, int op, Rune key, u32int mod,
reply = chancreate(sizeof(Keyres), 1);
memset(&req, 0, sizeof req);
req.owner = owner;
req.cap = cap;
req.clientpre = cap;
req.op = op;
req.ks = key;
req.mod = mod;
@@ -360,7 +360,7 @@ engine_vietnamese_client_preedit(struct ct *t)
draindraw(nil);
sclear(&com);
for(k = cases[i].keys; *k != '\0'; k++){
res = ownerrequestcap(&owner, Cclientpreedit,
res = ownerrequestcap(&owner, 1,
Keypress, *k, 0);
sappend(&com, &res.commit);
if(!res.eaten)
@@ -371,7 +371,7 @@ engine_vietnamese_client_preedit(struct ct *t)
shown = com;
sappend(&shown, &res.preedit);
checkstr(t, "client preedit", cases[i].shown, &shown);
activecap = 0;
clientpre = 0;
redraw();
if(CT_CHECK(t, draindraw(&dc) > 0))
CT_EQ_INT(t, 0, scmp(&dc.pre, &res.preedit));
@@ -403,7 +403,7 @@ engine_commit_contract(struct ct *t)
im.l = getlang(LangKO);
sclear(&all);
for(i = 0; i < 3; i++){
res = ownerrequestcap(&owner, Cclientpreedit,
res = ownerrequestcap(&owner, 1,
Keypress, cases[j].key, 0);
CT_CHECK(t, res.eaten);
checkstr(t, "repeated jamo commit",
@@ -692,7 +692,7 @@ struct Searchfix
Search search;
Lang *dictlang;
Trie *dict;
int activecap;
int clientpre;
Drawcmd lastdraw;
};
@@ -919,7 +919,7 @@ searchsave(Searchfix *f, int lang)
f->search = search;
f->dictlang = getlang(lang);
f->dict = f->dictlang->dict;
f->activecap = activecap;
f->clientpre = clientpre;
f->lastdraw = lastdraw;
draindraw(nil);
}
@@ -947,7 +947,7 @@ emojibegin(Searchfix *f, int showpre)
"c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12");
init();
im.l = getlang(LangKO);
activecap = showpre ? 0 : Cclientpreedit;
clientpre = showpre ? 0 : 1;
}
static void
@@ -961,7 +961,7 @@ searchend(Searchfix *f)
draindraw(nil);
im = f->im;
search = f->search;
activecap = f->activecap;
clientpre = f->clientpre;
lastdraw = f->lastdraw;
}
@@ -981,8 +981,8 @@ engine_popup_preedit_capability(struct ct *t)
init();
im.l = jp;
draindraw(nil);
ownerrequestcap(&client, Cclientpreedit, Keypress, 'k', 0);
ownerrequestcap(&client, Cclientpreedit, Keypress, 'a', 0);
ownerrequestcap(&client, 1, Keypress, 'k', 0);
ownerrequestcap(&client, 1, Keypress, 'a', 0);
CT_EQ_INT(t, 1, im.nkouho);
redraw();
if(CT_CHECK(t, draindraw(&dc) > 0)){
@@ -1009,14 +1009,14 @@ engine_popup_preedit_capability(struct ct *t)
CT_CHECK(t, kres.eaten);
CT_EQ_INT(t, 0, draindraw(nil));
kres = ownerrequestcap(&inactive, Cclientpreedit, Keycap, 0, 0);
kres = ownerrequestcap(&inactive, 1, Keycap, 0, 0);
CT_CHECK(t, !kres.eaten);
CT_EQ_INT(t, 0, kres.preedit.n);
CT_EQ_PTR(t, &client, activeowner);
CT_EQ_INT(t, 0, activecap & Cclientpreedit);
CT_EQ_INT(t, 0, clientpre);
CT_EQ_INT(t, 0, draindraw(nil));
kres = ownerrequestcap(&client, Cclientpreedit, Keycap, 0, 0);
kres = ownerrequestcap(&client, 1, Keycap, 0, 0);
CT_CHECK(t, kres.eaten);
checkstr(t, "restored client preedit", "", &kres.preedit);
if(CT_CHECK(t, draindraw(&dc) > 0)){
@@ -1028,7 +1028,7 @@ engine_popup_preedit_capability(struct ct *t)
CT_EQ_INT(t, 1, im.nkouho);
CT_EQ_INT(t, -1, im.sel);
checkstr(t, "retained client candidate", "", &im.kouho[0]);
kres = ownerrequestcap(&client, Cclientpreedit, Keycap, 0, 0);
kres = ownerrequestcap(&client, 1, Keycap, 0, 0);
CT_CHECK(t, kres.eaten);
CT_EQ_INT(t, 0, draindraw(nil));