ipc: negotiate preedit capability and caret messages
This commit is contained in:
@@ -27,6 +27,90 @@ ipc_masks_modifiers(struct ct *t)
|
||||
CT_CHECK(t, ipcreqreset(buf));
|
||||
}
|
||||
|
||||
void
|
||||
ipc_control_and_caret_frames(struct ct *t)
|
||||
{
|
||||
static const uchar capon[Ipcreqsz] = {
|
||||
Ipcext|Cclientpreedit, Ipcversion, Ipcopcap, 0, 0, 0,
|
||||
};
|
||||
static const uchar capoff[Ipcreqsz] = {
|
||||
Ipcext, Ipcversion, Ipcopcap, 0, 0, 0,
|
||||
};
|
||||
static const uchar caret[Ipccaretsz] = {
|
||||
Ipcext, Ipcversion, Ipcopcaret, 1,
|
||||
0xfe, 0xff, 0xff, 0xff,
|
||||
0x04, 0x03, 0x02, 0x01,
|
||||
0x06, 0x05, 0x00, 0x00,
|
||||
};
|
||||
static const uchar nocaret[Ipccaretsz] = {
|
||||
Ipcext, Ipcversion, Ipcopcaret, 0,
|
||||
};
|
||||
uchar buf[Ipccaretsz], bad[Ipccaretsz];
|
||||
u32int key, mod;
|
||||
int valid, want;
|
||||
int32_t x, y, h;
|
||||
|
||||
ipcpackcap(buf, Cclientpreedit);
|
||||
CT_EQ_MEM(t, capon, buf, sizeof capon);
|
||||
CT_EQ_INT(t, Ipccap, ipcreqtype(buf));
|
||||
/* The probe remains a harmless key-zero request to an old daemon. */
|
||||
ipcunpackreq(buf, &want, &mod, &key);
|
||||
CT_EQ_INT(t, 1, want);
|
||||
CT_EQ_UINT(t, 0, key);
|
||||
ipcpackcap(buf, 0);
|
||||
CT_EQ_MEM(t, capoff, buf, sizeof capoff);
|
||||
ipcunpackreq(buf, &want, &mod, &key);
|
||||
CT_EQ_INT(t, 0, want);
|
||||
CT_EQ_UINT(t, 0, key);
|
||||
|
||||
CT_EQ_INT(t, 0, ipcpackcaret(buf, 1, -2, 0x01020304, 0x506));
|
||||
CT_EQ_MEM(t, caret, buf, sizeof caret);
|
||||
CT_EQ_INT(t, Ipccaret, ipcreqtype(buf));
|
||||
if(CT_EQ_INT(t, 0, ipcunpackcaret(buf, &valid, &x, &y, &h))){
|
||||
CT_EQ_INT(t, 1, valid);
|
||||
CT_EQ_INT(t, -2, x);
|
||||
CT_EQ_INT(t, 0x01020304, y);
|
||||
CT_EQ_INT(t, 0x506, h);
|
||||
}
|
||||
CT_EQ_INT(t, 0, ipcpackcaret(buf, 1, INT32_MIN, INT32_MAX, 0));
|
||||
if(CT_EQ_INT(t, 0, ipcunpackcaret(buf, &valid, &x, &y, &h))){
|
||||
CT_EQ_INT(t, INT32_MIN, x);
|
||||
CT_EQ_INT(t, INT32_MAX, y);
|
||||
CT_EQ_INT(t, 0, h);
|
||||
}
|
||||
CT_EQ_INT(t, 0, ipcpackcaret(buf, 0, -2, 3, 4));
|
||||
CT_EQ_MEM(t, nocaret, buf, sizeof nocaret);
|
||||
if(CT_EQ_INT(t, 0, ipcunpackcaret(buf, &valid, &x, &y, &h)))
|
||||
CT_EQ_INT(t, 0, valid);
|
||||
CT_EQ_INT(t, -1, ipcpackcaret(buf, 1, 0, 0, -1));
|
||||
|
||||
memcpy(bad, caret, sizeof bad);
|
||||
bad[1]++;
|
||||
CT_EQ_INT(t, Ipcunknown, ipcreqtype(bad));
|
||||
CT_EQ_INT(t, -1, ipcunpackcaret(bad, &valid, &x, &y, &h));
|
||||
memcpy(bad, caret, sizeof bad);
|
||||
bad[2]++;
|
||||
CT_EQ_INT(t, Ipcunknown, ipcreqtype(bad));
|
||||
CT_EQ_INT(t, -1, ipcunpackcaret(bad, &valid, &x, &y, &h));
|
||||
memcpy(bad, caret, sizeof bad);
|
||||
bad[3] = 2;
|
||||
CT_EQ_INT(t, -1, ipcunpackcaret(bad, &valid, &x, &y, &h));
|
||||
memcpy(bad, caret, sizeof bad);
|
||||
bad[0] |= Ipcreqwant;
|
||||
CT_EQ_INT(t, Ipcunknown, ipcreqtype(bad));
|
||||
memcpy(bad, caret, sizeof bad);
|
||||
bad[15] = 0x80;
|
||||
CT_EQ_INT(t, -1, ipcunpackcaret(bad, &valid, &x, &y, &h));
|
||||
memcpy(bad, capon, sizeof capon);
|
||||
bad[3] = 1;
|
||||
CT_EQ_INT(t, Ipcunknown, ipcreqtype(bad));
|
||||
|
||||
ipcpackreq(buf, 1, 0, 'a');
|
||||
CT_EQ_INT(t, Ipclegacy, ipcreqtype(buf));
|
||||
ipcpackreset(buf, 1);
|
||||
CT_EQ_INT(t, Ipclegacy, ipcreqtype(buf));
|
||||
}
|
||||
|
||||
void
|
||||
ipc_runtime_path(struct ct *t)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user