#pragma src "/sys/src/libdraw" typedef struct Channel Channel; typedef struct Cursor Cursor; typedef struct Menu Menu; typedef struct Mousectl Mousectl; #pragma varargck type "M" int extern int Mfmt(Fmt*); enum { MBUTTONS = 7, /* ones on buttons bits */ // cooked event flags MCLICK = 0x00000100, MDOUBLE = 0x00000200, MSELECT = 0x00000400, MCHORD = 0x00000800, MEND = 0x00001000, MFLAGS = 0x00001f00, MCHORD0 = 0x00700000, // 1st chord button MCHORD1 = 0x07000000, // 2nd chord button MCHORD2 = 0x70000000, // 3rd chord button MCHORDALL = 0xfff00000, // chord button order // setmousemode args MRAW = 0, MCOOKED = 1 }; #define MCHORDB(b,nth) (((b)>>(20 +(nth)*4))&0xf) struct Mouse { int buttons; /* bit array: LMR=124 and flags */ Point xy; ulong msec; }; struct Mousectl { Mouse; Channel *c; /* chan(Mouse) */ Channel *resizec; /* chan(int)[2] */ /* buffered in case client is waiting for a mouse action before handling resize */ char *file; int mfd; /* to mouse file */ int cfd; /* to cursor file */ int pid; /* of slave proc */ Image* image; /* of associated window/display */ }; struct Menu { char **item; char *(*gen)(int); int lasthit; }; /* * Mouse */ extern Mousectl* initmouse(char*, Image*); extern int setmousemode(Mousectl*, int); extern void moveto(Mousectl*, Point); extern int readmouse(Mousectl*); extern void closemouse(Mousectl*); extern void setcursor(Mousectl*, Cursor*); extern void drawgetrect(Rectangle, int); extern Rectangle getrect(int, Mousectl*); extern int menuhit(int, Mousectl*, Menu*, Screen*); extern int verbstate;