/* Copyright (c) 2006 Russ Cox */

/*

tag[1] Rerror error[s]

tag[1] Trdmouse
tag[1] Rrdmouse x[4] y[4] button[4] msec[4] resized[1]

tag[1] Tmoveto x[4] y[4]
tag[1] Rmoveto

tag[1] Tcursor cursor[]
tag[1] Rcursor

tag[1] Tbouncemouse x[4] y[4] button[4]
tag[1] Rbouncemouse

tag[1] Trdkbd
tag[1] Rrdkbd rune[2]

tag[1] Tlabel label[s]
tag[1] Rlabel 

tag[1] Tinit winsize[s] label[s] font[s]
tag[1] Rinit

tag[1] Trdsnarf 
tag[1] Rrdsnarf snarf[s]

tag[1] Twrsnarf snarf[s]
tag[1] Rwrsnarf

tag[1] Trddraw count[4]
tag[1] Rrddraw count[4] data[count]

tag[1] Twrdraw count[4] data[count]
tag[1] Rwrdraw count[4]

tag[1] Ttop
tag[1] Rtop

tag[1] Tresize rect[4*4]
tag[1] Rresize 
*/

AUTOLIB(draw)

#define PUT(p, x) \
	(p)[0] = ((x) >> 24)&0xFF, \
	(p)[1] = ((x) >> 16)&0xFF, \
	(p)[2] = ((x) >> 8)&0xFF, \
	(p)[3] = (x)&0xFF

#define GET(p, x) \
	((x) = (u32int)(((p)[0] << 24) | ((p)[1] << 16) | ((p)[2] << 8) | ((p)[3])))

#define PUT2(p, x) \
	(p)[0] = ((x) >> 8)&0xFF, \
	(p)[1] = (x)&0xFF

#define GET2(p, x) \
	((x) = (((p)[0] << 8) | ((p)[1])))

enum {
	Rerror = 1,
	Trdmouse = 2,
	Rrdmouse,
	Tmoveto = 4,
	Rmoveto,
	Tcursor = 6,
	Rcursor,
	Tbouncemouse = 8,
	Rbouncemouse,
	Trdkbd = 10,
	Rrdkbd,
	Tlabel = 12,
	Rlabel,
	Tinit = 14,
	Rinit,
	Trdsnarf = 16,
	Rrdsnarf,
	Twrsnarf = 18,
	Rwrsnarf,
	Trddraw = 20,
	Rrddraw,
	Twrdraw = 22,
	Rwrdraw,
	Ttop = 24,
	Rtop,
	Tresize = 26,
	Rresize,
	Tmax,
};

enum {
	MAXWMSG = 4*1024*1024
};

typedef struct Wsysmsg Wsysmsg;
struct Wsysmsg
{
	uchar type;
	uchar tag;
	Mouse mouse;
	int resized;
	Cursor cursor;
	int arrowcursor;
	Rune rune;
	char *winsize;
	char *label;
	char *snarf;
	char *error;
	uchar *data;
	uint count;
	Rectangle rect;
};

uint	convW2M(Wsysmsg*, uchar*, uint);
uint	convM2W(uchar*, uint, Wsysmsg*);
uint	sizeW2M(Wsysmsg*);
int	readwsysmsg(int, uchar*, uint);

int	drawfcallfmt(Fmt*);
