85 lines
2.3 KiB
C
85 lines
2.3 KiB
C
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
/*
|
|
* 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,
|
|
Kpgup = Kspec|0x55,
|
|
Kpgdown = Kspec|0x56,
|
|
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);
|