#include #include /* * Legacy request: [flags, modifiers, key byte 0, ..., key byte 3]. * Flags request preedit and distinguish lifecycle reset from physical Escape. * The server identifies the connection as the engine owner; that identity is * not sent on the wire. * Only Mmask modifier bits are retained. * Response: [eaten, commit-length-low, commit-length-high, commit...], * followed, when requested, by * [preedit-length-low, preedit-length-high, preedit...]. * Lengths are little-endian byte counts; fields are at most Ipcfieldmax bytes. * * Capability control is six bytes: [0x80|want, version, 0, 0, 0, 0]. * Caret control is sixteen bytes: [0x80, version, 1, valid, x, y, h], * with the signed coordinates and height encoded as little-endian 32-bit words. */ enum { Ipcreqwant = 1<<0, Ipcreqreset = 1<<1, Ipcext = 1<<7, Ipcversion = 1, Ipcopcap = 0, Ipcopcaret = 1, Kspec = 0x110000, Kback = Kspec|0x08, Ktab = Kspec|0x09, Kret = Kspec|0x0d, Kesc = Kspec|0x1b, Kup = Kspec|0x52, Kdown = Kspec|0x54, Kmodfirst = Kspec|0xe1, Kmodlast = Kspec|0xee, Mshift = 1<<0, Mctrl = 1<<2, Malt = 1<<3, Msuper = 1<<6, Mmask = Mshift|Mctrl|Malt|Msuper, Ipcreqsz = 6, Ipccaretsz = 16, Ipclensz = 2, Ipcresphdrsz = 1 + Ipclensz, Ipcfieldmax = 256, Ipcmaxresp = Ipcresphdrsz + Ipcfieldmax + Ipclensz + Ipcfieldmax, }; enum { Ipcunknown = -1, Ipclegacy, Ipccap, Ipccaret, }; typedef struct Ipcresp Ipcresp; struct Ipcresp { int eaten; size_t ncommit; size_t npreedit; }; void ipcpackreq(unsigned char[Ipcreqsz], int, uint32_t, uint32_t); void ipcpackreset(unsigned char[Ipcreqsz], int); void ipcpackcap(unsigned char[Ipcreqsz], int); int ipcpackcaret(unsigned char[Ipccaretsz], int, int32_t, int32_t, int32_t); void ipcunpackreq(const unsigned char[Ipcreqsz], int*, uint32_t*, uint32_t*); int ipcunpackcaret(const unsigned char[Ipccaretsz], int*, int32_t*, int32_t*, int32_t*); int ipcreqtype(const unsigned char[Ipcreqsz]); int ipcreqreset(const unsigned char[Ipcreqsz]); int ipcpackresp(unsigned char*, size_t, int, const char*, size_t, const char*, size_t, int); int ipcreadn(int, void*, size_t); int ipcsend(int, const void*, size_t); int ipcreadresp(int, int, char*, size_t, char*, size_t, Ipcresp*); int ipcpath(char*, size_t); int ipcconnect(void);