#include #include /* * 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. */ enum { Ipcreqwant = 1<<0, Ipcreqreset = 1<<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, Ipclensz = 2, Ipcresphdrsz = 1 + Ipclensz, Ipcfieldmax = 256, Ipcmaxresp = Ipcresphdrsz + Ipcfieldmax + Ipclensz + Ipcfieldmax, }; 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 ipcunpackreq(const unsigned char[Ipcreqsz], int*, uint32_t*, uint32_t*); 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);