17dd7cddfSDavid du Colombier enum 27dd7cddfSDavid du Colombier { 37dd7cddfSDavid du Colombier Qdir, /* /dev for this window */ 47dd7cddfSDavid du Colombier Qcons, 57dd7cddfSDavid du Colombier Qconsctl, 67dd7cddfSDavid du Colombier Qcursor, 77dd7cddfSDavid du Colombier Qwdir, 87dd7cddfSDavid du Colombier Qwinid, 97dd7cddfSDavid du Colombier Qwinname, 1080ee5cbfSDavid du Colombier Qkbdin, 117dd7cddfSDavid du Colombier Qlabel, 127dd7cddfSDavid du Colombier Qmouse, 137dd7cddfSDavid du Colombier Qnew, 147dd7cddfSDavid du Colombier Qscreen, 157dd7cddfSDavid du Colombier Qsnarf, 167dd7cddfSDavid du Colombier Qtext, 177dd7cddfSDavid du Colombier Qwctl, 187dd7cddfSDavid du Colombier Qwindow, 197dd7cddfSDavid du Colombier Qwsys, /* directory of window directories */ 207dd7cddfSDavid du Colombier Qwsysdir, /* window directory, child of wsys */ 217dd7cddfSDavid du Colombier 227dd7cddfSDavid du Colombier QMAX, 237dd7cddfSDavid du Colombier }; 247dd7cddfSDavid du Colombier 25*a8453668SDavid du Colombier enum 26*a8453668SDavid du Colombier { 27*a8453668SDavid du Colombier Kscrolloneup = KF|0x20, 28*a8453668SDavid du Colombier Kscrollonedown = KF|0x21, 29*a8453668SDavid du Colombier }; 30*a8453668SDavid du Colombier 317dd7cddfSDavid du Colombier #define STACK 8192 327dd7cddfSDavid du Colombier 337dd7cddfSDavid du Colombier typedef struct Consreadmesg Consreadmesg; 347dd7cddfSDavid du Colombier typedef struct Conswritemesg Conswritemesg; 357dd7cddfSDavid du Colombier typedef struct Stringpair Stringpair; 367dd7cddfSDavid du Colombier typedef struct Dirtab Dirtab; 377dd7cddfSDavid du Colombier typedef struct Fid Fid; 387dd7cddfSDavid du Colombier typedef struct Filsys Filsys; 397dd7cddfSDavid du Colombier typedef struct Mouseinfo Mouseinfo; 407dd7cddfSDavid du Colombier typedef struct Mousereadmesg Mousereadmesg; 417dd7cddfSDavid du Colombier typedef struct Mousestate Mousestate; 427dd7cddfSDavid du Colombier typedef struct Ref Ref; 437dd7cddfSDavid du Colombier typedef struct Timer Timer; 447dd7cddfSDavid du Colombier typedef struct Wctlmesg Wctlmesg; 457dd7cddfSDavid du Colombier typedef struct Window Window; 467dd7cddfSDavid du Colombier typedef struct Xfid Xfid; 477dd7cddfSDavid du Colombier 487dd7cddfSDavid du Colombier enum 497dd7cddfSDavid du Colombier { 507dd7cddfSDavid du Colombier Selborder = 4, /* border of selected window */ 517dd7cddfSDavid du Colombier Unselborder = 1, /* border of unselected window */ 527dd7cddfSDavid du Colombier Scrollwid = 12, /* width of scroll bar */ 537dd7cddfSDavid du Colombier Scrollgap = 4, /* gap right of scroll bar */ 5459cc4ca5SDavid du Colombier BIG = 3, /* factor by which window dimension can exceed screen */ 557dd7cddfSDavid du Colombier TRUE = 1, 567dd7cddfSDavid du Colombier FALSE = 0, 577dd7cddfSDavid du Colombier }; 587dd7cddfSDavid du Colombier 597dd7cddfSDavid du Colombier #define QID(w,q) ((w<<8)|(q)) 609a747e4fSDavid du Colombier #define WIN(q) ((((ulong)(q).path)>>8) & 0xFFFFFF) 619a747e4fSDavid du Colombier #define FILE(q) (((ulong)(q).path) & 0xFF) 627dd7cddfSDavid du Colombier 637dd7cddfSDavid du Colombier enum /* control messages */ 647dd7cddfSDavid du Colombier { 657dd7cddfSDavid du Colombier Wakeup, 667dd7cddfSDavid du Colombier Reshaped, 677dd7cddfSDavid du Colombier Moved, 687dd7cddfSDavid du Colombier Refresh, 697dd7cddfSDavid du Colombier Movemouse, 707dd7cddfSDavid du Colombier Rawon, 717dd7cddfSDavid du Colombier Rawoff, 727dd7cddfSDavid du Colombier Holdon, 737dd7cddfSDavid du Colombier Holdoff, 747dd7cddfSDavid du Colombier Deleted, 757dd7cddfSDavid du Colombier Exited, 767dd7cddfSDavid du Colombier }; 777dd7cddfSDavid du Colombier 787dd7cddfSDavid du Colombier struct Wctlmesg 797dd7cddfSDavid du Colombier { 807dd7cddfSDavid du Colombier int type; 817dd7cddfSDavid du Colombier Rectangle r; 827dd7cddfSDavid du Colombier Image *image; 837dd7cddfSDavid du Colombier }; 847dd7cddfSDavid du Colombier 857dd7cddfSDavid du Colombier struct Conswritemesg 867dd7cddfSDavid du Colombier { 877dd7cddfSDavid du Colombier Channel *cw; /* chan(Stringpair) */ 887dd7cddfSDavid du Colombier }; 897dd7cddfSDavid du Colombier 907dd7cddfSDavid du Colombier struct Consreadmesg 917dd7cddfSDavid du Colombier { 927dd7cddfSDavid du Colombier Channel *c1; /* chan(tuple(char*, int) == Stringpair) */ 937dd7cddfSDavid du Colombier Channel *c2; /* chan(tuple(char*, int) == Stringpair) */ 947dd7cddfSDavid du Colombier }; 957dd7cddfSDavid du Colombier 967dd7cddfSDavid du Colombier struct Mousereadmesg 977dd7cddfSDavid du Colombier { 987dd7cddfSDavid du Colombier Channel *cm; /* chan(Mouse) */ 997dd7cddfSDavid du Colombier }; 1007dd7cddfSDavid du Colombier 1017dd7cddfSDavid du Colombier struct Stringpair /* rune and nrune or byte and nbyte */ 1027dd7cddfSDavid du Colombier { 1037dd7cddfSDavid du Colombier void *s; 1047dd7cddfSDavid du Colombier int ns; 1057dd7cddfSDavid du Colombier }; 1067dd7cddfSDavid du Colombier 1077dd7cddfSDavid du Colombier struct Mousestate 1087dd7cddfSDavid du Colombier { 1097dd7cddfSDavid du Colombier Mouse; 1107dd7cddfSDavid du Colombier ulong counter; /* serial no. of mouse event */ 1117dd7cddfSDavid du Colombier }; 1127dd7cddfSDavid du Colombier 1137dd7cddfSDavid du Colombier struct Mouseinfo 1147dd7cddfSDavid du Colombier { 1157dd7cddfSDavid du Colombier Mousestate queue[16]; 1167dd7cddfSDavid du Colombier int ri; /* read index into queue */ 1177dd7cddfSDavid du Colombier int wi; /* write index */ 1187dd7cddfSDavid du Colombier ulong counter; /* serial no. of last mouse event we received */ 1197dd7cddfSDavid du Colombier ulong lastcounter; /* serial no. of last mouse event sent to client */ 1207dd7cddfSDavid du Colombier int lastb; /* last button state we received */ 1217dd7cddfSDavid du Colombier uchar qfull; /* filled the queue; no more recording until client comes back */ 1227dd7cddfSDavid du Colombier }; 1237dd7cddfSDavid du Colombier 1247dd7cddfSDavid du Colombier struct Window 1257dd7cddfSDavid du Colombier { 1267dd7cddfSDavid du Colombier Ref; 1277dd7cddfSDavid du Colombier QLock; 1287dd7cddfSDavid du Colombier Frame; 1297dd7cddfSDavid du Colombier Image *i; 1307dd7cddfSDavid du Colombier Mousectl mc; 1317dd7cddfSDavid du Colombier Mouseinfo mouse; 1327dd7cddfSDavid du Colombier Channel *ck; /* chan(Rune[10]) */ 1337dd7cddfSDavid du Colombier Channel *cctl; /* chan(Wctlmesg)[20] */ 1347dd7cddfSDavid du Colombier Channel *conswrite; /* chan(Conswritemesg) */ 1357dd7cddfSDavid du Colombier Channel *consread; /* chan(Consreadmesg) */ 1367dd7cddfSDavid du Colombier Channel *mouseread; /* chan(Mousereadmesg) */ 13759cc4ca5SDavid du Colombier Channel *wctlread; /* chan(Consreadmesg) */ 1387dd7cddfSDavid du Colombier uint nr; /* number of runes in window */ 1397dd7cddfSDavid du Colombier uint maxr; /* number of runes allocated in r */ 1407dd7cddfSDavid du Colombier Rune *r; 1417dd7cddfSDavid du Colombier uint nraw; 1427dd7cddfSDavid du Colombier Rune *raw; 1437dd7cddfSDavid du Colombier uint org; 1447dd7cddfSDavid du Colombier uint q0; 1457dd7cddfSDavid du Colombier uint q1; 1467dd7cddfSDavid du Colombier uint qh; 1477dd7cddfSDavid du Colombier int id; 1487dd7cddfSDavid du Colombier char name[32]; 1497dd7cddfSDavid du Colombier uint namecount; 1507dd7cddfSDavid du Colombier Rectangle scrollr; 1517dd7cddfSDavid du Colombier /* 1527dd7cddfSDavid du Colombier * Rio once used originwindow, so screenr could be different from i->r. 1537dd7cddfSDavid du Colombier * Now they're always the same but the code doesn't assume so. 1547dd7cddfSDavid du Colombier */ 1557dd7cddfSDavid du Colombier Rectangle screenr; /* screen coordinates of window */ 1567dd7cddfSDavid du Colombier int resized; 15759cc4ca5SDavid du Colombier int wctlready; 1587dd7cddfSDavid du Colombier Rectangle lastsr; 1597dd7cddfSDavid du Colombier int topped; 1607dd7cddfSDavid du Colombier int notefd; 1617dd7cddfSDavid du Colombier uchar scrolling; 1627dd7cddfSDavid du Colombier Cursor cursor; 1637dd7cddfSDavid du Colombier Cursor *cursorp; 1647dd7cddfSDavid du Colombier uchar holding; 1657dd7cddfSDavid du Colombier uchar rawing; 1667dd7cddfSDavid du Colombier uchar ctlopen; 16759cc4ca5SDavid du Colombier uchar wctlopen; 1687dd7cddfSDavid du Colombier uchar deleted; 1697dd7cddfSDavid du Colombier uchar mouseopen; 1709a747e4fSDavid du Colombier char *label; 1717dd7cddfSDavid du Colombier int pid; 1727dd7cddfSDavid du Colombier char *dir; 1737dd7cddfSDavid du Colombier }; 1747dd7cddfSDavid du Colombier 1757dd7cddfSDavid du Colombier int winborder(Window*, Point); 1767dd7cddfSDavid du Colombier void winctl(void*); 1777dd7cddfSDavid du Colombier void winshell(void*); 1787dd7cddfSDavid du Colombier Window* wlookid(int); 1793ff48bf5SDavid du Colombier Window* wmk(Image*, Mousectl*, Channel*, Channel*, int); 1807dd7cddfSDavid du Colombier Window* wpointto(Point); 1817dd7cddfSDavid du Colombier Window* wtop(Point); 1827dd7cddfSDavid du Colombier void wtopme(Window*); 1837dd7cddfSDavid du Colombier void wbottomme(Window*); 1847dd7cddfSDavid du Colombier char* wcontents(Window*, int*); 1857dd7cddfSDavid du Colombier int wbswidth(Window*, Rune); 1867dd7cddfSDavid du Colombier int wclickmatch(Window*, int, int, int, uint*); 1877dd7cddfSDavid du Colombier int wclose(Window*); 1887dd7cddfSDavid du Colombier int wctlmesg(Window*, int, Rectangle, Image*); 1897dd7cddfSDavid du Colombier int wctlmesg(Window*, int, Rectangle, Image*); 1907dd7cddfSDavid du Colombier uint wbacknl(Window*, uint, uint); 1917dd7cddfSDavid du Colombier uint winsert(Window*, Rune*, int, uint); 1927dd7cddfSDavid du Colombier void waddraw(Window*, Rune*, int); 1937dd7cddfSDavid du Colombier void wborder(Window*, int); 1947dd7cddfSDavid du Colombier void wclosewin(Window*); 1957dd7cddfSDavid du Colombier void wcurrent(Window*); 1967dd7cddfSDavid du Colombier void wcut(Window*); 1977dd7cddfSDavid du Colombier void wdelete(Window*, uint, uint); 1987dd7cddfSDavid du Colombier void wdoubleclick(Window*, uint*, uint*); 1997dd7cddfSDavid du Colombier void wfill(Window*); 2007dd7cddfSDavid du Colombier void wframescroll(Window*, int); 2017dd7cddfSDavid du Colombier void wkeyctl(Window*, Rune); 2027dd7cddfSDavid du Colombier void wmousectl(Window*); 2037dd7cddfSDavid du Colombier void wmovemouse(Window*, Point); 2047dd7cddfSDavid du Colombier void wpaste(Window*); 2057dd7cddfSDavid du Colombier void wplumb(Window*); 2067dd7cddfSDavid du Colombier void wrefresh(Window*, Rectangle); 2077dd7cddfSDavid du Colombier void wrepaint(Window*); 2087dd7cddfSDavid du Colombier void wresize(Window*, Image*, int); 2097dd7cddfSDavid du Colombier void wscrdraw(Window*); 2107dd7cddfSDavid du Colombier void wscroll(Window*, int); 2117dd7cddfSDavid du Colombier void wselect(Window*); 2127dd7cddfSDavid du Colombier void wsendctlmesg(Window*, int, Rectangle, Image*); 2137dd7cddfSDavid du Colombier void wsetcursor(Window*, int); 2147dd7cddfSDavid du Colombier void wsetname(Window*); 2157dd7cddfSDavid du Colombier void wsetorigin(Window*, uint, int); 2169a747e4fSDavid du Colombier void wsetpid(Window*, int, int); 2177dd7cddfSDavid du Colombier void wsetselect(Window*, uint, uint); 2187dd7cddfSDavid du Colombier void wshow(Window*, uint); 2197dd7cddfSDavid du Colombier void wsnarf(Window*); 2207dd7cddfSDavid du Colombier void wscrsleep(Window*, uint); 2217dd7cddfSDavid du Colombier void wsetcols(Window*); 2227dd7cddfSDavid du Colombier 2237dd7cddfSDavid du Colombier struct Dirtab 2247dd7cddfSDavid du Colombier { 2257dd7cddfSDavid du Colombier char *name; 2269a747e4fSDavid du Colombier uchar type; 2277dd7cddfSDavid du Colombier uint qid; 2287dd7cddfSDavid du Colombier uint perm; 2297dd7cddfSDavid du Colombier }; 2307dd7cddfSDavid du Colombier 2317dd7cddfSDavid du Colombier struct Fid 2327dd7cddfSDavid du Colombier { 2337dd7cddfSDavid du Colombier int fid; 2347dd7cddfSDavid du Colombier int busy; 2357dd7cddfSDavid du Colombier int open; 2367dd7cddfSDavid du Colombier int mode; 2377dd7cddfSDavid du Colombier Qid qid; 2387dd7cddfSDavid du Colombier Window *w; 2397dd7cddfSDavid du Colombier Dirtab *dir; 2407dd7cddfSDavid du Colombier Fid *next; 2417dd7cddfSDavid du Colombier int nrpart; 2427dd7cddfSDavid du Colombier uchar rpart[UTFmax]; 2437dd7cddfSDavid du Colombier }; 2447dd7cddfSDavid du Colombier 2457dd7cddfSDavid du Colombier struct Xfid 2467dd7cddfSDavid du Colombier { 2477dd7cddfSDavid du Colombier Ref; 2487dd7cddfSDavid du Colombier Xfid *next; 2497dd7cddfSDavid du Colombier Xfid *free; 2507dd7cddfSDavid du Colombier Fcall; 2517dd7cddfSDavid du Colombier Channel *c; /* chan(void(*)(Xfid*)) */ 2527dd7cddfSDavid du Colombier Fid *f; 2539a747e4fSDavid du Colombier uchar *buf; 2547dd7cddfSDavid du Colombier Filsys *fs; 2557dd7cddfSDavid du Colombier QLock active; 25680ee5cbfSDavid du Colombier int flushing; /* another Xfid is trying to flush us */ 25780ee5cbfSDavid du Colombier int flushtag; /* our tag, so flush can find us */ 25880ee5cbfSDavid du Colombier Channel *flushc; /* channel(int) to notify us we're being flushed */ 2597dd7cddfSDavid du Colombier }; 2607dd7cddfSDavid du Colombier 2617dd7cddfSDavid du Colombier Channel* xfidinit(void); 2627dd7cddfSDavid du Colombier void xfidctl(void*); 2637dd7cddfSDavid du Colombier void xfidflush(Xfid*); 2647dd7cddfSDavid du Colombier void xfidattach(Xfid*); 2657dd7cddfSDavid du Colombier void xfidopen(Xfid*); 2667dd7cddfSDavid du Colombier void xfidclose(Xfid*); 2677dd7cddfSDavid du Colombier void xfidread(Xfid*); 2687dd7cddfSDavid du Colombier void xfidwrite(Xfid*); 2697dd7cddfSDavid du Colombier 2707dd7cddfSDavid du Colombier enum 2717dd7cddfSDavid du Colombier { 2727dd7cddfSDavid du Colombier Nhash = 16, 2737dd7cddfSDavid du Colombier }; 2747dd7cddfSDavid du Colombier 2757dd7cddfSDavid du Colombier struct Filsys 2767dd7cddfSDavid du Colombier { 2777dd7cddfSDavid du Colombier int cfd; 2787dd7cddfSDavid du Colombier int sfd; 2797dd7cddfSDavid du Colombier int pid; 2809a747e4fSDavid du Colombier char *user; 2817dd7cddfSDavid du Colombier Channel *cxfidalloc; /* chan(Xfid*) */ 2827dd7cddfSDavid du Colombier Fid *fids[Nhash]; 2837dd7cddfSDavid du Colombier }; 2847dd7cddfSDavid du Colombier 2857dd7cddfSDavid du Colombier Filsys* filsysinit(Channel*); 2867dd7cddfSDavid du Colombier int filsysmount(Filsys*, int); 2877dd7cddfSDavid du Colombier Xfid* filsysrespond(Filsys*, Xfid*, Fcall*, char*); 2887dd7cddfSDavid du Colombier void filsyscancel(Xfid*); 2897dd7cddfSDavid du Colombier 2907dd7cddfSDavid du Colombier void wctlproc(void*); 2917dd7cddfSDavid du Colombier void wctlthread(void*); 2927dd7cddfSDavid du Colombier 2937dd7cddfSDavid du Colombier void deletetimeoutproc(void*); 2947dd7cddfSDavid du Colombier 2957dd7cddfSDavid du Colombier struct Timer 2967dd7cddfSDavid du Colombier { 2977dd7cddfSDavid du Colombier int dt; 2987dd7cddfSDavid du Colombier int cancel; 2997dd7cddfSDavid du Colombier Channel *c; /* chan(int) */ 3007dd7cddfSDavid du Colombier Timer *next; 3017dd7cddfSDavid du Colombier }; 3027dd7cddfSDavid du Colombier 3037dd7cddfSDavid du Colombier Font *font; 3047dd7cddfSDavid du Colombier Mousectl *mousectl; 3057dd7cddfSDavid du Colombier Mouse *mouse; 3067dd7cddfSDavid du Colombier Keyboardctl *keyboardctl; 3077dd7cddfSDavid du Colombier Display *display; 3087dd7cddfSDavid du Colombier Image *view; 3097dd7cddfSDavid du Colombier Screen *wscreen; 3107dd7cddfSDavid du Colombier Cursor boxcursor; 3117dd7cddfSDavid du Colombier Cursor crosscursor; 3127dd7cddfSDavid du Colombier Cursor sightcursor; 3137dd7cddfSDavid du Colombier Cursor whitearrow; 3147dd7cddfSDavid du Colombier Cursor query; 3157dd7cddfSDavid du Colombier Cursor *corners[9]; 3167dd7cddfSDavid du Colombier Image *background; 3177dd7cddfSDavid du Colombier Image *lightgrey; 3187dd7cddfSDavid du Colombier Image *red; 3197dd7cddfSDavid du Colombier Window **window; 32080ee5cbfSDavid du Colombier Window *wkeyboard; /* window of simulated keyboard */ 3217dd7cddfSDavid du Colombier int nwindow; 3227dd7cddfSDavid du Colombier int snarffd; 3237dd7cddfSDavid du Colombier Window *input; 3247dd7cddfSDavid du Colombier QLock all; /* BUG */ 3257dd7cddfSDavid du Colombier Filsys *filsys; 3267dd7cddfSDavid du Colombier Window *hidden[100]; 3277dd7cddfSDavid du Colombier int nhidden; 3287dd7cddfSDavid du Colombier int nsnarf; 3297dd7cddfSDavid du Colombier Rune* snarf; 3307dd7cddfSDavid du Colombier int scrolling; 3317dd7cddfSDavid du Colombier int maxtab; 3327dd7cddfSDavid du Colombier Channel* winclosechan; 3337dd7cddfSDavid du Colombier Channel* deletechan; 3347dd7cddfSDavid du Colombier char *startdir; 3357dd7cddfSDavid du Colombier int sweeping; 3367dd7cddfSDavid du Colombier int wctlfd; 3377dd7cddfSDavid du Colombier char srvpipe[]; 3387dd7cddfSDavid du Colombier char srvwctl[]; 3397dd7cddfSDavid du Colombier int errorshouldabort; 34059cc4ca5SDavid du Colombier int menuing; /* menu action is pending; waiting for window to be indicated */ 34180ee5cbfSDavid du Colombier int snarfversion; /* updated each time it is written */ 3429a747e4fSDavid du Colombier int messagesize; /* negotiated in 9P version setup */ 343