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:
8
dat.h
8
dat.h
@@ -173,10 +173,6 @@ struct Popup
|
|||||||
typedef struct Keyreq Keyreq;
|
typedef struct Keyreq Keyreq;
|
||||||
typedef struct Keyres Keyres;
|
typedef struct Keyres Keyres;
|
||||||
enum
|
enum
|
||||||
{
|
|
||||||
Cclientpreedit = 1<<0,
|
|
||||||
};
|
|
||||||
enum
|
|
||||||
{
|
{
|
||||||
Keypress,
|
Keypress,
|
||||||
Keyreset,
|
Keyreset,
|
||||||
@@ -186,7 +182,7 @@ enum
|
|||||||
};
|
};
|
||||||
struct Keyres
|
struct Keyres
|
||||||
{
|
{
|
||||||
int eaten; /* Keycap: caller is active and capability was applied. */
|
int eaten; /* Keycap: the caller is the owner and clientpre took. */
|
||||||
Str commit;
|
Str commit;
|
||||||
Str preedit;
|
Str preedit;
|
||||||
};
|
};
|
||||||
@@ -194,7 +190,7 @@ struct Keyres
|
|||||||
struct Keyreq
|
struct Keyreq
|
||||||
{
|
{
|
||||||
void *owner; /* stable until the context's release is acknowledged */
|
void *owner; /* stable until the context's release is acknowledged */
|
||||||
int cap;
|
int clientpre; /* the client draws the preedit; the popup does not */
|
||||||
int op;
|
int op;
|
||||||
u32int ks;
|
u32int ks;
|
||||||
u32int mod;
|
u32int mod;
|
||||||
|
|||||||
2
ibus.c
2
ibus.c
@@ -291,7 +291,7 @@ sendrequest(Ictx *ctx, int op, u32int ks, u32int mod, Keyres *res)
|
|||||||
|
|
||||||
memset(&kr, 0, sizeof kr);
|
memset(&kr, 0, sizeof kr);
|
||||||
kr.owner = ctx;
|
kr.owner = ctx;
|
||||||
kr.cap = clientpreedit(ctx) ? Cclientpreedit : 0;
|
kr.clientpre = clientpreedit(ctx);
|
||||||
kr.op = op;
|
kr.op = op;
|
||||||
kr.ks = ks;
|
kr.ks = ks;
|
||||||
kr.mod = mod;
|
kr.mod = mod;
|
||||||
|
|||||||
6
srv.c
6
srv.c
@@ -67,7 +67,7 @@ srvreadreq(int fd, Keyreq *kr, int *want)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* One Keyreq persists for the connection: the negotiated capability and
|
* One Keyreq persists for the connection: the negotiated preedit and
|
||||||
* the last caret ride along with every request, and the socket closing
|
* the last caret ride along with every request, and the socket closing
|
||||||
* releases the engine.
|
* releases the engine.
|
||||||
*/
|
*/
|
||||||
@@ -85,10 +85,10 @@ clientthread(void *arg)
|
|||||||
memset(&kr, 0, sizeof kr);
|
memset(&kr, 0, sizeof kr);
|
||||||
kr.reply = chancreate(sizeof(Keyres), 0);
|
kr.reply = chancreate(sizeof(Keyres), 0);
|
||||||
kr.owner = &fd;
|
kr.owner = &fd;
|
||||||
kr.cap = Cclientpreedit;
|
kr.clientpre = 1;
|
||||||
while(srvreadreq(fd, &kr, &want) >= 0){
|
while(srvreadreq(fd, &kr, &want) >= 0){
|
||||||
if(kr.op != Keycaret)
|
if(kr.op != Keycaret)
|
||||||
kr.cap = want ? Cclientpreedit : 0;
|
kr.clientpre = want;
|
||||||
chansend(keyc, &kr);
|
chansend(keyc, &kr);
|
||||||
chanrecv(kr.reply, &res);
|
chanrecv(kr.reply, &res);
|
||||||
if(kr.op == Keycaret)
|
if(kr.op == Keycaret)
|
||||||
|
|||||||
14
strans.c
14
strans.c
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
static Im im;
|
static Im im;
|
||||||
static void *activeowner;
|
static void *activeowner;
|
||||||
static int activecap;
|
static int clientpre; /* the owner draws its own preedit */
|
||||||
static Caret caret;
|
static Caret caret;
|
||||||
static Drawcmd lastdraw;
|
static Drawcmd lastdraw;
|
||||||
static Emit transjp(Im*, Rune);
|
static Emit transjp(Im*, Rune);
|
||||||
@@ -191,7 +191,7 @@ snapshot(Drawcmd *dc)
|
|||||||
pre = search.text;
|
pre = search.text;
|
||||||
else
|
else
|
||||||
impre(&im, &pre);
|
impre(&im, &pre);
|
||||||
if(!(activecap & Cclientpreedit))
|
if(!clientpre)
|
||||||
dc->pre = pre;
|
dc->pre = pre;
|
||||||
if(search.lang && pre.n == 0) /* a search just begun shows itself */
|
if(search.lang && pre.n == 0) /* a search just begun shows itself */
|
||||||
sputr(&dc->pre, search.lang == LangEMOJI ? L'☺' : L'漢');
|
sputr(&dc->pre, search.lang == LangEMOJI ? L'☺' : L'漢');
|
||||||
@@ -881,7 +881,7 @@ init(void)
|
|||||||
memset(&search, 0, sizeof search);
|
memset(&search, 0, sizeof search);
|
||||||
memset(&caret, 0, sizeof caret);
|
memset(&caret, 0, sizeof caret);
|
||||||
activeowner = nil;
|
activeowner = nil;
|
||||||
activecap = 0;
|
clientpre = 0;
|
||||||
memset(&lastdraw, 0, sizeof lastdraw);
|
memset(&lastdraw, 0, sizeof lastdraw);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -905,7 +905,7 @@ imhandlekey(Keyreq *kr)
|
|||||||
if(kr->owner == activeowner){
|
if(kr->owner == activeowner){
|
||||||
flush(&res.commit);
|
flush(&res.commit);
|
||||||
activeowner = nil;
|
activeowner = nil;
|
||||||
activecap = 0;
|
clientpre = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Keyreset:
|
case Keyreset:
|
||||||
@@ -919,17 +919,17 @@ imhandlekey(Keyreq *kr)
|
|||||||
case Keycap:
|
case Keycap:
|
||||||
res.eaten = kr->owner == activeowner;
|
res.eaten = kr->owner == activeowner;
|
||||||
if(res.eaten)
|
if(res.eaten)
|
||||||
activecap = kr->cap & Cclientpreedit;
|
clientpre = kr->clientpre;
|
||||||
break;
|
break;
|
||||||
case Keypress:
|
case Keypress:
|
||||||
res.eaten = 0;
|
res.eaten = 0;
|
||||||
if(kr->owner == activeowner)
|
if(kr->owner == activeowner)
|
||||||
activecap = kr->cap & Cclientpreedit;
|
clientpre = kr->clientpre;
|
||||||
if(keymeaningful(kr->ks)){
|
if(keymeaningful(kr->ks)){
|
||||||
if(kr->owner != activeowner){
|
if(kr->owner != activeowner){
|
||||||
reset();
|
reset();
|
||||||
activeowner = kr->owner;
|
activeowner = kr->owner;
|
||||||
activecap = kr->cap & Cclientpreedit;
|
clientpre = kr->clientpre;
|
||||||
}
|
}
|
||||||
caret = kr->caret;
|
caret = kr->caret;
|
||||||
res.eaten = transition(kr->ks, kr->mod, &res.commit);
|
res.eaten = transition(kr->ks, kr->mod, &res.commit);
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ ownerrequestatcap(void *owner, int cap, int op, Rune key, u32int mod,
|
|||||||
reply = chancreate(sizeof(Keyres), 1);
|
reply = chancreate(sizeof(Keyres), 1);
|
||||||
memset(&req, 0, sizeof req);
|
memset(&req, 0, sizeof req);
|
||||||
req.owner = owner;
|
req.owner = owner;
|
||||||
req.cap = cap;
|
req.clientpre = cap;
|
||||||
req.op = op;
|
req.op = op;
|
||||||
req.ks = key;
|
req.ks = key;
|
||||||
req.mod = mod;
|
req.mod = mod;
|
||||||
@@ -360,7 +360,7 @@ engine_vietnamese_client_preedit(struct ct *t)
|
|||||||
draindraw(nil);
|
draindraw(nil);
|
||||||
sclear(&com);
|
sclear(&com);
|
||||||
for(k = cases[i].keys; *k != '\0'; k++){
|
for(k = cases[i].keys; *k != '\0'; k++){
|
||||||
res = ownerrequestcap(&owner, Cclientpreedit,
|
res = ownerrequestcap(&owner, 1,
|
||||||
Keypress, *k, 0);
|
Keypress, *k, 0);
|
||||||
sappend(&com, &res.commit);
|
sappend(&com, &res.commit);
|
||||||
if(!res.eaten)
|
if(!res.eaten)
|
||||||
@@ -371,7 +371,7 @@ engine_vietnamese_client_preedit(struct ct *t)
|
|||||||
shown = com;
|
shown = com;
|
||||||
sappend(&shown, &res.preedit);
|
sappend(&shown, &res.preedit);
|
||||||
checkstr(t, "client preedit", cases[i].shown, &shown);
|
checkstr(t, "client preedit", cases[i].shown, &shown);
|
||||||
activecap = 0;
|
clientpre = 0;
|
||||||
redraw();
|
redraw();
|
||||||
if(CT_CHECK(t, draindraw(&dc) > 0))
|
if(CT_CHECK(t, draindraw(&dc) > 0))
|
||||||
CT_EQ_INT(t, 0, scmp(&dc.pre, &res.preedit));
|
CT_EQ_INT(t, 0, scmp(&dc.pre, &res.preedit));
|
||||||
@@ -403,7 +403,7 @@ engine_commit_contract(struct ct *t)
|
|||||||
im.l = getlang(LangKO);
|
im.l = getlang(LangKO);
|
||||||
sclear(&all);
|
sclear(&all);
|
||||||
for(i = 0; i < 3; i++){
|
for(i = 0; i < 3; i++){
|
||||||
res = ownerrequestcap(&owner, Cclientpreedit,
|
res = ownerrequestcap(&owner, 1,
|
||||||
Keypress, cases[j].key, 0);
|
Keypress, cases[j].key, 0);
|
||||||
CT_CHECK(t, res.eaten);
|
CT_CHECK(t, res.eaten);
|
||||||
checkstr(t, "repeated jamo commit",
|
checkstr(t, "repeated jamo commit",
|
||||||
@@ -692,7 +692,7 @@ struct Searchfix
|
|||||||
Search search;
|
Search search;
|
||||||
Lang *dictlang;
|
Lang *dictlang;
|
||||||
Trie *dict;
|
Trie *dict;
|
||||||
int activecap;
|
int clientpre;
|
||||||
Drawcmd lastdraw;
|
Drawcmd lastdraw;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -919,7 +919,7 @@ searchsave(Searchfix *f, int lang)
|
|||||||
f->search = search;
|
f->search = search;
|
||||||
f->dictlang = getlang(lang);
|
f->dictlang = getlang(lang);
|
||||||
f->dict = f->dictlang->dict;
|
f->dict = f->dictlang->dict;
|
||||||
f->activecap = activecap;
|
f->clientpre = clientpre;
|
||||||
f->lastdraw = lastdraw;
|
f->lastdraw = lastdraw;
|
||||||
draindraw(nil);
|
draindraw(nil);
|
||||||
}
|
}
|
||||||
@@ -947,7 +947,7 @@ emojibegin(Searchfix *f, int showpre)
|
|||||||
"c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12");
|
"c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12");
|
||||||
init();
|
init();
|
||||||
im.l = getlang(LangKO);
|
im.l = getlang(LangKO);
|
||||||
activecap = showpre ? 0 : Cclientpreedit;
|
clientpre = showpre ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -961,7 +961,7 @@ searchend(Searchfix *f)
|
|||||||
draindraw(nil);
|
draindraw(nil);
|
||||||
im = f->im;
|
im = f->im;
|
||||||
search = f->search;
|
search = f->search;
|
||||||
activecap = f->activecap;
|
clientpre = f->clientpre;
|
||||||
lastdraw = f->lastdraw;
|
lastdraw = f->lastdraw;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -981,8 +981,8 @@ engine_popup_preedit_capability(struct ct *t)
|
|||||||
init();
|
init();
|
||||||
im.l = jp;
|
im.l = jp;
|
||||||
draindraw(nil);
|
draindraw(nil);
|
||||||
ownerrequestcap(&client, Cclientpreedit, Keypress, 'k', 0);
|
ownerrequestcap(&client, 1, Keypress, 'k', 0);
|
||||||
ownerrequestcap(&client, Cclientpreedit, Keypress, 'a', 0);
|
ownerrequestcap(&client, 1, Keypress, 'a', 0);
|
||||||
CT_EQ_INT(t, 1, im.nkouho);
|
CT_EQ_INT(t, 1, im.nkouho);
|
||||||
redraw();
|
redraw();
|
||||||
if(CT_CHECK(t, draindraw(&dc) > 0)){
|
if(CT_CHECK(t, draindraw(&dc) > 0)){
|
||||||
@@ -1009,14 +1009,14 @@ engine_popup_preedit_capability(struct ct *t)
|
|||||||
CT_CHECK(t, kres.eaten);
|
CT_CHECK(t, kres.eaten);
|
||||||
CT_EQ_INT(t, 0, draindraw(nil));
|
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_CHECK(t, !kres.eaten);
|
||||||
CT_EQ_INT(t, 0, kres.preedit.n);
|
CT_EQ_INT(t, 0, kres.preedit.n);
|
||||||
CT_EQ_PTR(t, &client, activeowner);
|
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));
|
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);
|
CT_CHECK(t, kres.eaten);
|
||||||
checkstr(t, "restored client preedit", "か", &kres.preedit);
|
checkstr(t, "restored client preedit", "か", &kres.preedit);
|
||||||
if(CT_CHECK(t, draindraw(&dc) > 0)){
|
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.nkouho);
|
||||||
CT_EQ_INT(t, -1, im.sel);
|
CT_EQ_INT(t, -1, im.sel);
|
||||||
checkstr(t, "retained client candidate", "家", &im.kouho[0]);
|
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_CHECK(t, kres.eaten);
|
||||||
CT_EQ_INT(t, 0, draindraw(nil));
|
CT_EQ_INT(t, 0, draindraw(nil));
|
||||||
|
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ nexttrace(struct ct *t, Ibusfix *f, int op, Ictx *ctx)
|
|||||||
CT_EQ_INT(t, op, req.op);
|
CT_EQ_INT(t, op, req.op);
|
||||||
CT_EQ_PTR(t, ctx, req.owner);
|
CT_EQ_PTR(t, ctx, req.owner);
|
||||||
if(ctx != nil)
|
if(ctx != nil)
|
||||||
CT_EQ_INT(t, ctx->cap & 1 ? Cclientpreedit : 0, req.cap);
|
CT_EQ_INT(t, clientpreedit(ctx), req.clientpre);
|
||||||
CT_EQ_PTR(t, replyc, req.reply);
|
CT_EQ_PTR(t, replyc, req.reply);
|
||||||
return req;
|
return req;
|
||||||
}
|
}
|
||||||
@@ -178,7 +178,7 @@ ibus_capability_policy(struct ct *t)
|
|||||||
checkstr(t, "preedit", "k", &res.preedit);
|
checkstr(t, "preedit", "k", &res.preedit);
|
||||||
CT_EQ_PTR(t, a, testengineowner());
|
CT_EQ_PTR(t, a, testengineowner());
|
||||||
|
|
||||||
a->cap = Cclientpreedit;
|
a->cap = Ibuscappreedit;
|
||||||
memset(&res, 0, sizeof res);
|
memset(&res, 0, sizeof res);
|
||||||
sendrequest(a, Keycap, 0, 0, &res);
|
sendrequest(a, Keycap, 0, 0, &res);
|
||||||
nexttrace(t, &f, Keycap, a);
|
nexttrace(t, &f, Keycap, a);
|
||||||
@@ -186,7 +186,7 @@ ibus_capability_policy(struct ct *t)
|
|||||||
checkstr(t, "preedit", "k", &res.preedit);
|
checkstr(t, "preedit", "k", &res.preedit);
|
||||||
|
|
||||||
b->focused = 1;
|
b->focused = 1;
|
||||||
b->cap = Cclientpreedit;
|
b->cap = Ibuscappreedit;
|
||||||
memset(&res, 0, sizeof res);
|
memset(&res, 0, sizeof res);
|
||||||
sendrequest(b, Keycap, 0, 0, &res);
|
sendrequest(b, Keycap, 0, 0, &res);
|
||||||
nexttrace(t, &f, Keycap, b);
|
nexttrace(t, &f, Keycap, b);
|
||||||
@@ -229,7 +229,7 @@ ibus_private_input_policy(struct ct *t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ctx->focused = 1;
|
ctx->focused = 1;
|
||||||
ctx->cap = Cclientpreedit;
|
ctx->cap = 1;
|
||||||
ctx->purpose = 0;
|
ctx->purpose = 0;
|
||||||
contextkey(t, &f, ctx, 'n', Testctrlmask);
|
contextkey(t, &f, ctx, 'n', Testctrlmask);
|
||||||
res = contextkey(t, &f, ctx, 'k', 0);
|
res = contextkey(t, &f, ctx, 'k', 0);
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ void
|
|||||||
ipc_control_and_caret_frames(struct ct *t)
|
ipc_control_and_caret_frames(struct ct *t)
|
||||||
{
|
{
|
||||||
static const uchar capon[Ipcreqsz] = {
|
static const uchar capon[Ipcreqsz] = {
|
||||||
Ipcext|Cclientpreedit, Ipcversion, Ipcopcap, 0, 0, 0,
|
Ipcext|Ipcreqwant, Ipcversion, Ipcopcap, 0, 0, 0,
|
||||||
};
|
};
|
||||||
static const uchar capoff[Ipcreqsz] = {
|
static const uchar capoff[Ipcreqsz] = {
|
||||||
Ipcext, Ipcversion, Ipcopcap, 0, 0, 0,
|
Ipcext, Ipcversion, Ipcopcap, 0, 0, 0,
|
||||||
@@ -89,7 +89,7 @@ ipc_control_and_caret_frames(struct ct *t)
|
|||||||
int valid, want;
|
int valid, want;
|
||||||
int32_t x, y, h;
|
int32_t x, y, h;
|
||||||
|
|
||||||
ipcpackcap(buf, Cclientpreedit);
|
ipcpackcap(buf, 1);
|
||||||
CT_EQ_MEM(t, capon, buf, sizeof capon);
|
CT_EQ_MEM(t, capon, buf, sizeof capon);
|
||||||
CT_EQ_INT(t, Ipccap, ipcreqtype(buf));
|
CT_EQ_INT(t, Ipccap, ipcreqtype(buf));
|
||||||
/* The probe remains a harmless key-zero request to an old daemon. */
|
/* The probe remains a harmless key-zero request to an old daemon. */
|
||||||
|
|||||||
@@ -143,14 +143,14 @@ nextrequestcap(struct ct *t, Pump *p, int op, int cap)
|
|||||||
memset(&req, 0, sizeof req);
|
memset(&req, 0, sizeof req);
|
||||||
chanrecv(p->trace, &req);
|
chanrecv(p->trace, &req);
|
||||||
CT_EQ_INT(t, op, req.op);
|
CT_EQ_INT(t, op, req.op);
|
||||||
CT_EQ_INT(t, cap, req.cap);
|
CT_EQ_INT(t, cap, req.clientpre);
|
||||||
return req;
|
return req;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Keyreq
|
static Keyreq
|
||||||
nextrequest(struct ct *t, Pump *p, int op)
|
nextrequest(struct ct *t, Pump *p, int op)
|
||||||
{
|
{
|
||||||
return nextrequestcap(t, p, op, Cclientpreedit);
|
return nextrequestcap(t, p, op, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -387,7 +387,7 @@ server_extension_stream(struct ct *t)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Capability and caret frames may be split at any byte boundary. */
|
/* Capability and caret frames may be split at any byte boundary. */
|
||||||
ipcpackcap(frame, Cclientpreedit);
|
ipcpackcap(frame, 1);
|
||||||
if(!sendframe(t, &a, frame, Ipcreqsz, 1))
|
if(!sendframe(t, &a, frame, Ipcreqsz, 1))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
req = nextrequest(t, &f.pump, Keycap);
|
req = nextrequest(t, &f.pump, Keycap);
|
||||||
@@ -446,7 +446,7 @@ server_extension_stream(struct ct *t)
|
|||||||
allowrequest(&f.pump);
|
allowrequest(&f.pump);
|
||||||
CT_EQ_INT(t, 1, readreply(t, &a, 0, "k", preedit));
|
CT_EQ_INT(t, 1, readreply(t, &a, 0, "k", preedit));
|
||||||
|
|
||||||
ipcpackcap(frame, Cclientpreedit);
|
ipcpackcap(frame, 1);
|
||||||
if(!sendframe(t, &a, frame, Ipcreqsz, 0))
|
if(!sendframe(t, &a, frame, Ipcreqsz, 0))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
req = nextrequest(t, &f.pump, Keycap);
|
req = nextrequest(t, &f.pump, Keycap);
|
||||||
|
|||||||
@@ -437,7 +437,7 @@ nexttracecap(struct ct *t, Ximfix *f, int op, Ic *owner, int cap)
|
|||||||
return req;
|
return req;
|
||||||
CT_EQ_INT(t, op, req.op);
|
CT_EQ_INT(t, op, req.op);
|
||||||
CT_EQ_PTR(t, owner, req.owner);
|
CT_EQ_PTR(t, owner, req.owner);
|
||||||
CT_EQ_INT(t, cap, req.cap);
|
CT_EQ_INT(t, cap, req.clientpre);
|
||||||
CT_EQ_PTR(t, replyc, req.reply);
|
CT_EQ_PTR(t, replyc, req.reply);
|
||||||
return req;
|
return req;
|
||||||
}
|
}
|
||||||
@@ -445,7 +445,7 @@ nexttracecap(struct ct *t, Ximfix *f, int op, Ic *owner, int cap)
|
|||||||
static Keyreq
|
static Keyreq
|
||||||
nexttrace(struct ct *t, Ximfix *f, int op, Ic *state)
|
nexttrace(struct ct *t, Ximfix *f, int op, Ic *state)
|
||||||
{
|
{
|
||||||
return nexttracecap(t, f, op, state, state->cap);
|
return nexttracecap(t, f, op, state, state->clientpre);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -539,7 +539,7 @@ xim_adapter_release_lifecycle(struct ct *t)
|
|||||||
keypress(dead, 'n', 0, &res);
|
keypress(dead, 'n', 0, &res);
|
||||||
nexttrace(t, &f, Keypress, dead);
|
nexttrace(t, &f, Keypress, dead);
|
||||||
CT_EQ_PTR(t, dead, testengineowner());
|
CT_EQ_PTR(t, dead, testengineowner());
|
||||||
deadcap = dead->cap;
|
deadcap = dead->clientpre;
|
||||||
icfree(dead);
|
icfree(dead);
|
||||||
nexttracecap(t, &f, Keyrelease, dead, deadcap);
|
nexttracecap(t, &f, Keyrelease, dead, deadcap);
|
||||||
dead = nil;
|
dead = nil;
|
||||||
@@ -654,8 +654,8 @@ xim_adapter_styles(struct ct *t)
|
|||||||
state = icbindings[0].data;
|
state = icbindings[0].data;
|
||||||
if(!CT_CHECK(t, state != nil && state == ics))
|
if(!CT_CHECK(t, state != nil && state == ics))
|
||||||
continue;
|
continue;
|
||||||
CT_EQ_INT(t, want[i] & XCB_IM_PreeditCallbacks ? Cclientpreedit : 0,
|
CT_EQ_INT(t, want[i] & XCB_IM_PreeditCallbacks ? 1 : 0,
|
||||||
state->cap);
|
state->clientpre);
|
||||||
CT_EQ_PTR(t, ic, state->xic);
|
CT_EQ_PTR(t, ic, state->xic);
|
||||||
icunlink(state);
|
icunlink(state);
|
||||||
free(state);
|
free(state);
|
||||||
@@ -799,7 +799,7 @@ xim_adapter_callback_replacement(struct ct *t)
|
|||||||
ic = (xcb_im_input_context_t*)(uintptr)3;
|
ic = (xcb_im_input_context_t*)(uintptr)3;
|
||||||
memset(&state, 0, sizeof state);
|
memset(&state, 0, sizeof state);
|
||||||
state.xic = ic;
|
state.xic = ic;
|
||||||
state.cap = Cclientpreedit;
|
state.clientpre = 1;
|
||||||
wireclear();
|
wireclear();
|
||||||
sinit(&pre, "k", strlen("k"));
|
sinit(&pre, "k", strlen("k"));
|
||||||
updatepreedit(&state, &pre);
|
updatepreedit(&state, &pre);
|
||||||
@@ -848,7 +848,7 @@ xim_adapter_callback_unicode(struct ct *t)
|
|||||||
for(i = 0; i < nelem(text); i++){
|
for(i = 0; i < nelem(text); i++){
|
||||||
memset(&state, 0, sizeof state);
|
memset(&state, 0, sizeof state);
|
||||||
state.xic = (xcb_im_input_context_t*)(uintptr)(10+i);
|
state.xic = (xcb_im_input_context_t*)(uintptr)(10+i);
|
||||||
state.cap = Cclientpreedit;
|
state.clientpre = 1;
|
||||||
sinit(&pre, text[i], strlen(text[i]));
|
sinit(&pre, text[i], strlen(text[i]));
|
||||||
wireclear();
|
wireclear();
|
||||||
updatepreedit(&state, &pre);
|
updatepreedit(&state, &pre);
|
||||||
@@ -868,7 +868,7 @@ startstate(Ic *state, xcb_im_input_context_t *ic)
|
|||||||
|
|
||||||
memset(state, 0, sizeof *state);
|
memset(state, 0, sizeof *state);
|
||||||
state->xic = ic;
|
state->xic = ic;
|
||||||
state->cap = Cclientpreedit;
|
state->clientpre = 1;
|
||||||
sinit(&pre, "あ", strlen("あ"));
|
sinit(&pre, "あ", strlen("あ"));
|
||||||
updatepreedit(state, &pre);
|
updatepreedit(state, &pre);
|
||||||
}
|
}
|
||||||
@@ -896,7 +896,7 @@ xim_adapter_callback_cleanup(struct ct *t)
|
|||||||
wireclear();
|
wireclear();
|
||||||
wirebind(0, ic, &state);
|
wirebind(0, ic, &state);
|
||||||
state.xic = ic;
|
state.xic = ic;
|
||||||
state.cap = Cclientpreedit;
|
state.clientpre = 1;
|
||||||
keypress(&state, 'k', 0, &res);
|
keypress(&state, 'k', 0, &res);
|
||||||
nexttrace(t, &f, Keypress, &state);
|
nexttrace(t, &f, Keypress, &state);
|
||||||
keypress(&state, 'a', 0, &res);
|
keypress(&state, 'a', 0, &res);
|
||||||
@@ -984,7 +984,7 @@ xim_adapter_callback_transfer(struct ct *t)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
wireclear();
|
wireclear();
|
||||||
a.xic = aic;
|
a.xic = aic;
|
||||||
a.cap = Cclientpreedit;
|
a.clientpre = 1;
|
||||||
sinit(&pre, "あ", strlen("あ"));
|
sinit(&pre, "あ", strlen("あ"));
|
||||||
updatepreedit(&a, &pre);
|
updatepreedit(&a, &pre);
|
||||||
keypress(&b, 'x', 0, &res);
|
keypress(&b, 'x', 0, &res);
|
||||||
@@ -1021,7 +1021,7 @@ xim_adapter_callback_owner_loss(struct ct *t)
|
|||||||
wireclear();
|
wireclear();
|
||||||
wirebind(0, ic, &state);
|
wirebind(0, ic, &state);
|
||||||
state.xic = ic;
|
state.xic = ic;
|
||||||
state.cap = Cclientpreedit;
|
state.clientpre = 1;
|
||||||
keypress(&state, 'k', 0, &res);
|
keypress(&state, 'k', 0, &res);
|
||||||
nexttrace(t, &f, Keypress, &state);
|
nexttrace(t, &f, Keypress, &state);
|
||||||
updatepreedit(&state, &res.preedit);
|
updatepreedit(&state, &res.preedit);
|
||||||
|
|||||||
10
xim.c
10
xim.c
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* One XIM input context. Only PreeditCallbacks clients draw the preedit
|
* One XIM input context. Only PreeditCallbacks clients draw the preedit
|
||||||
* themselves (cap); the popup shows it for the others. engaged means the
|
* themselves (clientpre); the popup shows it for the others. engaged means the
|
||||||
* engine has seen a real key from this context and owes it a release.
|
* engine has seen a real key from this context and owes it a release.
|
||||||
*/
|
*/
|
||||||
typedef struct Ic Ic;
|
typedef struct Ic Ic;
|
||||||
@@ -26,7 +26,7 @@ struct Ic
|
|||||||
xcb_im_input_context_t *xic;
|
xcb_im_input_context_t *xic;
|
||||||
xcb_im_client_t *client;
|
xcb_im_client_t *client;
|
||||||
int engaged;
|
int engaged;
|
||||||
int cap;
|
int clientpre;
|
||||||
int prestarted;
|
int prestarted;
|
||||||
int nprerune;
|
int nprerune;
|
||||||
Caret caret;
|
Caret caret;
|
||||||
@@ -255,7 +255,7 @@ updatepreedit(Ic *state, Str *pre)
|
|||||||
size_t nwire;
|
size_t nwire;
|
||||||
int i, nbyte;
|
int i, nbyte;
|
||||||
|
|
||||||
if(!(state->cap & Cclientpreedit))
|
if(!state->clientpre)
|
||||||
return;
|
return;
|
||||||
if(pre->n == 0){
|
if(pre->n == 0){
|
||||||
clearpreedit(state);
|
clearpreedit(state);
|
||||||
@@ -291,7 +291,7 @@ sendrequest(Ic *state, int op, u32int key, u32int mod, Keyres *res)
|
|||||||
|
|
||||||
memset(&kr, 0, sizeof kr);
|
memset(&kr, 0, sizeof kr);
|
||||||
kr.owner = state;
|
kr.owner = state;
|
||||||
kr.cap = state->cap;
|
kr.clientpre = state->clientpre;
|
||||||
kr.op = op;
|
kr.op = op;
|
||||||
kr.ks = key;
|
kr.ks = key;
|
||||||
kr.mod = ipcmod(mod);
|
kr.mod = ipcmod(mod);
|
||||||
@@ -471,7 +471,7 @@ iccreate(xcb_im_client_t *client, xcb_im_input_context_t *ic)
|
|||||||
state->xic = ic;
|
state->xic = ic;
|
||||||
state->client = client;
|
state->client = client;
|
||||||
if(xcb_im_input_context_get_input_style(ic) & XCB_IM_PreeditCallbacks)
|
if(xcb_im_input_context_get_input_style(ic) & XCB_IM_PreeditCallbacks)
|
||||||
state->cap = Cclientpreedit;
|
state->clientpre = 1;
|
||||||
state->next = ics;
|
state->next = ics;
|
||||||
ics = state;
|
ics = state;
|
||||||
xcb_im_input_context_set_data(ic, state, icfree);
|
xcb_im_input_context_set_data(ic, state, icfree);
|
||||||
|
|||||||
Reference in New Issue
Block a user