1219b2ee8SDavid du Colombier enum 2219b2ee8SDavid du Colombier { 3219b2ee8SDavid du Colombier Qdir, 4219b2ee8SDavid du Colombier Qacme, 5219b2ee8SDavid du Colombier Qcons, 6219b2ee8SDavid du Colombier Qconsctl, 77dd7cddfSDavid du Colombier Qdraw, 859cc4ca5SDavid du Colombier Qeditout, 9219b2ee8SDavid du Colombier Qindex, 10219b2ee8SDavid du Colombier Qlabel, 11219b2ee8SDavid du Colombier Qnew, 12219b2ee8SDavid du Colombier 13219b2ee8SDavid du Colombier QWaddr, 14219b2ee8SDavid du Colombier QWbody, 15219b2ee8SDavid du Colombier QWctl, 16219b2ee8SDavid du Colombier QWdata, 1759cc4ca5SDavid du Colombier QWeditout, 18673c3d8aSDavid du Colombier QWerrors, 19219b2ee8SDavid du Colombier QWevent, 207dd7cddfSDavid du Colombier QWrdsel, 217dd7cddfSDavid du Colombier QWwrsel, 22219b2ee8SDavid du Colombier QWtag, 23673c3d8aSDavid du Colombier QWxdata, 24219b2ee8SDavid du Colombier QMAX, 25219b2ee8SDavid du Colombier }; 26219b2ee8SDavid du Colombier 27219b2ee8SDavid du Colombier enum 28219b2ee8SDavid du Colombier { 29219b2ee8SDavid du Colombier Blockincr = 256, 30*9bcb9353SDavid du Colombier Maxblock = 16*1024, 31219b2ee8SDavid du Colombier NRange = 10, 32219b2ee8SDavid du Colombier Infinity = 0x7FFFFFFF, /* huge value for regexp address */ 33219b2ee8SDavid du Colombier }; 34219b2ee8SDavid du Colombier 357dd7cddfSDavid du Colombier typedef struct Block Block; 367dd7cddfSDavid du Colombier typedef struct Buffer Buffer; 377dd7cddfSDavid du Colombier typedef struct Command Command; 387dd7cddfSDavid du Colombier typedef struct Column Column; 397dd7cddfSDavid du Colombier typedef struct Dirlist Dirlist; 407dd7cddfSDavid du Colombier typedef struct Dirtab Dirtab; 417dd7cddfSDavid du Colombier typedef struct Disk Disk; 427dd7cddfSDavid du Colombier typedef struct Expand Expand; 437dd7cddfSDavid du Colombier typedef struct Fid Fid; 447dd7cddfSDavid du Colombier typedef struct File File; 4559cc4ca5SDavid du Colombier typedef struct Elog Elog; 467dd7cddfSDavid du Colombier typedef struct Mntdir Mntdir; 477dd7cddfSDavid du Colombier typedef struct Range Range; 487dd7cddfSDavid du Colombier typedef struct Rangeset Rangeset; 497dd7cddfSDavid du Colombier typedef struct Reffont Reffont; 507dd7cddfSDavid du Colombier typedef struct Row Row; 517dd7cddfSDavid du Colombier typedef struct Runestr Runestr; 527dd7cddfSDavid du Colombier typedef struct Text Text; 537dd7cddfSDavid du Colombier typedef struct Timer Timer; 547dd7cddfSDavid du Colombier typedef struct Window Window; 557dd7cddfSDavid du Colombier typedef struct Xfid Xfid; 56219b2ee8SDavid du Colombier 577dd7cddfSDavid du Colombier struct Runestr 587dd7cddfSDavid du Colombier { 597dd7cddfSDavid du Colombier Rune *r; 607dd7cddfSDavid du Colombier int nr; 617dd7cddfSDavid du Colombier }; 627dd7cddfSDavid du Colombier 637dd7cddfSDavid du Colombier struct Range 64219b2ee8SDavid du Colombier { 65219b2ee8SDavid du Colombier int q0; 66219b2ee8SDavid du Colombier int q1; 67219b2ee8SDavid du Colombier }; 68219b2ee8SDavid du Colombier 697dd7cddfSDavid du Colombier struct Block 70219b2ee8SDavid du Colombier { 71219b2ee8SDavid du Colombier uint addr; /* disk address in bytes */ 72219b2ee8SDavid du Colombier union 73219b2ee8SDavid du Colombier { 74219b2ee8SDavid du Colombier uint n; /* number of used runes in block */ 75219b2ee8SDavid du Colombier Block *next; /* pointer to next in free list */ 76219b2ee8SDavid du Colombier }; 77219b2ee8SDavid du Colombier }; 78219b2ee8SDavid du Colombier 797dd7cddfSDavid du Colombier struct Disk 80219b2ee8SDavid du Colombier { 81219b2ee8SDavid du Colombier int fd; 82219b2ee8SDavid du Colombier uint addr; /* length of temp file */ 83219b2ee8SDavid du Colombier Block *free[Maxblock/Blockincr+1]; 84219b2ee8SDavid du Colombier }; 85219b2ee8SDavid du Colombier 867dd7cddfSDavid du Colombier Disk* diskinit(void); 877dd7cddfSDavid du Colombier Block* disknewblock(Disk*, uint); 887dd7cddfSDavid du Colombier void diskrelease(Disk*, Block*); 897dd7cddfSDavid du Colombier void diskread(Disk*, Block*, Rune*, uint); 907dd7cddfSDavid du Colombier void diskwrite(Disk*, Block**, Rune*, uint); 917dd7cddfSDavid du Colombier 927dd7cddfSDavid du Colombier struct Buffer 93219b2ee8SDavid du Colombier { 947dd7cddfSDavid du Colombier uint nc; 95219b2ee8SDavid du Colombier Rune *c; /* cache */ 96219b2ee8SDavid du Colombier uint cnc; /* bytes in cache */ 97219b2ee8SDavid du Colombier uint cmax; /* size of allocated cache */ 98219b2ee8SDavid du Colombier uint cq; /* position of cache */ 99219b2ee8SDavid du Colombier int cdirty; /* cache needs to be written */ 100219b2ee8SDavid du Colombier uint cbi; /* index of cache Block */ 101219b2ee8SDavid du Colombier Block **bl; /* array of blocks */ 102219b2ee8SDavid du Colombier uint nbl; /* number of blocks */ 103219b2ee8SDavid du Colombier }; 1047dd7cddfSDavid du Colombier void bufinsert(Buffer*, uint, Rune*, uint); 1057dd7cddfSDavid du Colombier void bufdelete(Buffer*, uint, uint); 1067dd7cddfSDavid du Colombier uint bufload(Buffer*, uint, int, int*); 1077dd7cddfSDavid du Colombier void bufread(Buffer*, uint, Rune*, uint); 1087dd7cddfSDavid du Colombier void bufclose(Buffer*); 1097dd7cddfSDavid du Colombier void bufreset(Buffer*); 110219b2ee8SDavid du Colombier 11159cc4ca5SDavid du Colombier struct Elog 11259cc4ca5SDavid du Colombier { 11359cc4ca5SDavid du Colombier short type; /* Delete, Insert, Filename */ 11459cc4ca5SDavid du Colombier uint q0; /* location of change (unused in f) */ 11559cc4ca5SDavid du Colombier uint nd; /* number of deleted characters */ 11659cc4ca5SDavid du Colombier uint nr; /* # runes in string or file name */ 11759cc4ca5SDavid du Colombier Rune *r; 11859cc4ca5SDavid du Colombier }; 11959cc4ca5SDavid du Colombier void elogterm(File*); 12059cc4ca5SDavid du Colombier void elogclose(File*); 12159cc4ca5SDavid du Colombier void eloginsert(File*, int, Rune*, int); 12259cc4ca5SDavid du Colombier void elogdelete(File*, int, int); 12359cc4ca5SDavid du Colombier void elogreplace(File*, int, int, Rune*, int); 12459cc4ca5SDavid du Colombier void elogapply(File*); 12559cc4ca5SDavid du Colombier 1267dd7cddfSDavid du Colombier struct File 127219b2ee8SDavid du Colombier { 1287dd7cddfSDavid du Colombier Buffer; /* the data */ 1297dd7cddfSDavid du Colombier Buffer delta; /* transcript of changes */ 1307dd7cddfSDavid du Colombier Buffer epsilon; /* inversion of delta for redo */ 13159cc4ca5SDavid du Colombier Buffer *elogbuf; /* log of pending editor changes */ 13259cc4ca5SDavid du Colombier Elog elog; /* current pending change */ 1337dd7cddfSDavid du Colombier Rune *name; /* name of associated file */ 1347dd7cddfSDavid du Colombier int nname; /* size of name */ 1359a747e4fSDavid du Colombier uvlong qidpath; /* of file when read */ 1367dd7cddfSDavid du Colombier uint mtime; /* of file when read */ 1377dd7cddfSDavid du Colombier int dev; /* of file when read */ 1387dd7cddfSDavid du Colombier int unread; /* file has not been read from disk */ 13959cc4ca5SDavid du Colombier int editclean; /* mark clean after edit command */ 140219b2ee8SDavid du Colombier 1417dd7cddfSDavid du Colombier int seq; /* if seq==0, File acts like Buffer */ 1427dd7cddfSDavid du Colombier int mod; 1437dd7cddfSDavid du Colombier Text *curtext; /* most recently used associated text */ 1447dd7cddfSDavid du Colombier Text **text; /* list of associated texts */ 1457dd7cddfSDavid du Colombier int ntext; 1467dd7cddfSDavid du Colombier int dumpid; /* used in dumping zeroxed windows */ 147219b2ee8SDavid du Colombier }; 1487dd7cddfSDavid du Colombier File* fileaddtext(File*, Text*); 1497dd7cddfSDavid du Colombier void fileclose(File*); 1507dd7cddfSDavid du Colombier void filedelete(File*, uint, uint); 1517dd7cddfSDavid du Colombier void filedeltext(File*, Text*); 1527dd7cddfSDavid du Colombier void fileinsert(File*, uint, Rune*, uint); 1537dd7cddfSDavid du Colombier uint fileload(File*, uint, int, int*); 1547dd7cddfSDavid du Colombier void filemark(File*); 1557dd7cddfSDavid du Colombier void filereset(File*); 1567dd7cddfSDavid du Colombier void filesetname(File*, Rune*, int); 1577dd7cddfSDavid du Colombier void fileundelete(File*, Buffer*, uint, uint); 1587dd7cddfSDavid du Colombier void fileuninsert(File*, Buffer*, uint, uint); 1597dd7cddfSDavid du Colombier void fileunsetname(File*, Buffer*); 1607dd7cddfSDavid du Colombier void fileundo(File*, int, uint*, uint*); 16159cc4ca5SDavid du Colombier uint fileredoseq(File*); 162219b2ee8SDavid du Colombier 163219b2ee8SDavid du Colombier enum /* Text.what */ 164219b2ee8SDavid du Colombier { 165219b2ee8SDavid du Colombier Columntag, 166219b2ee8SDavid du Colombier Rowtag, 167219b2ee8SDavid du Colombier Tag, 168219b2ee8SDavid du Colombier Body, 169219b2ee8SDavid du Colombier }; 170219b2ee8SDavid du Colombier 1717dd7cddfSDavid du Colombier struct Text 172219b2ee8SDavid du Colombier { 1737dd7cddfSDavid du Colombier File *file; 1747dd7cddfSDavid du Colombier Frame; 1757dd7cddfSDavid du Colombier Reffont *reffont; 1767dd7cddfSDavid du Colombier uint org; 1777dd7cddfSDavid du Colombier uint q0; 1787dd7cddfSDavid du Colombier uint q1; 1797dd7cddfSDavid du Colombier int what; 1807dd7cddfSDavid du Colombier int tabstop; 1817dd7cddfSDavid du Colombier Window *w; 1827dd7cddfSDavid du Colombier Rectangle scrollr; 1837dd7cddfSDavid du Colombier Rectangle lastsr; 1847dd7cddfSDavid du Colombier Rectangle all; 1857dd7cddfSDavid du Colombier Row *row; 1867dd7cddfSDavid du Colombier Column *col; 187219b2ee8SDavid du Colombier 1887dd7cddfSDavid du Colombier uint eq0; /* start of typing for ESC */ 189219b2ee8SDavid du Colombier uint cq0; /* cache position */ 1907dd7cddfSDavid du Colombier int ncache; /* storage for insert */ 191219b2ee8SDavid du Colombier int ncachealloc; 192219b2ee8SDavid du Colombier Rune *cache; 193219b2ee8SDavid du Colombier int nofill; 194219b2ee8SDavid du Colombier }; 195219b2ee8SDavid du Colombier 1967dd7cddfSDavid du Colombier uint textbacknl(Text*, uint, uint); 1977dd7cddfSDavid du Colombier uint textbsinsert(Text*, uint, Rune*, uint, int, int*); 1987dd7cddfSDavid du Colombier int textbswidth(Text*, Rune); 1997dd7cddfSDavid du Colombier int textclickmatch(Text*, int, int, int, uint*); 2007dd7cddfSDavid du Colombier void textclose(Text*); 2017dd7cddfSDavid du Colombier void textcolumnate(Text*, Dirlist**, int); 2027dd7cddfSDavid du Colombier void textcommit(Text*, int); 2036b6b9ac8SDavid du Colombier void textconstrain(Text*, uint, uint, uint*, uint*); 2047dd7cddfSDavid du Colombier void textdelete(Text*, uint, uint, int); 2057dd7cddfSDavid du Colombier void textdoubleclick(Text*, uint*, uint*); 2067dd7cddfSDavid du Colombier void textfill(Text*); 2077dd7cddfSDavid du Colombier void textframescroll(Text*, int); 2087dd7cddfSDavid du Colombier void textinit(Text*, File*, Rectangle, Reffont*, Image**); 2097dd7cddfSDavid du Colombier void textinsert(Text*, uint, Rune*, uint, int); 2107dd7cddfSDavid du Colombier uint textload(Text*, uint, char*, int); 2117dd7cddfSDavid du Colombier Rune textreadc(Text*, uint); 2127dd7cddfSDavid du Colombier void textredraw(Text*, Rectangle, Font*, Image*, int); 2137dd7cddfSDavid du Colombier void textreset(Text*); 2142c2299ceSDavid du Colombier int textresize(Text*, Rectangle, int); 2157dd7cddfSDavid du Colombier void textscrdraw(Text*); 2167dd7cddfSDavid du Colombier void textscroll(Text*, int); 2177dd7cddfSDavid du Colombier void textselect(Text*); 2187dd7cddfSDavid du Colombier int textselect2(Text*, uint*, uint*, Text**); 2197dd7cddfSDavid du Colombier int textselect23(Text*, uint*, uint*, Image*, int); 2207dd7cddfSDavid du Colombier int textselect3(Text*, uint*, uint*); 2217dd7cddfSDavid du Colombier void textsetorigin(Text*, uint, int); 2227dd7cddfSDavid du Colombier void textsetselect(Text*, uint, uint); 2239a747e4fSDavid du Colombier void textshow(Text*, uint, uint, int); 2247dd7cddfSDavid du Colombier void texttype(Text*, Rune); 2257dd7cddfSDavid du Colombier 2267dd7cddfSDavid du Colombier struct Window 227219b2ee8SDavid du Colombier { 228219b2ee8SDavid du Colombier QLock; 229219b2ee8SDavid du Colombier Ref; 2307dd7cddfSDavid du Colombier Text tag; 2317dd7cddfSDavid du Colombier Text body; 2327dd7cddfSDavid du Colombier Rectangle r; 2337dd7cddfSDavid du Colombier uchar isdir; 2347dd7cddfSDavid du Colombier uchar isscratch; 2357dd7cddfSDavid du Colombier uchar filemenu; 2367dd7cddfSDavid du Colombier uchar dirty; 2374fec87e5SDavid du Colombier uchar autoindent; 2382c2299ceSDavid du Colombier uchar showdel; 2397dd7cddfSDavid du Colombier int id; 2407dd7cddfSDavid du Colombier Range addr; 2417dd7cddfSDavid du Colombier Range limit; 2427dd7cddfSDavid du Colombier uchar nopen[QMAX]; 2437dd7cddfSDavid du Colombier uchar nomark; 2447dd7cddfSDavid du Colombier uchar noscroll; 2457dd7cddfSDavid du Colombier Range wrselrange; 2467dd7cddfSDavid du Colombier int rdselfd; 2477dd7cddfSDavid du Colombier Column *col; 2487dd7cddfSDavid du Colombier Xfid *eventx; 2497dd7cddfSDavid du Colombier char *events; 2507dd7cddfSDavid du Colombier int nevents; 2517dd7cddfSDavid du Colombier int owner; 2527dd7cddfSDavid du Colombier int maxlines; 2537dd7cddfSDavid du Colombier Dirlist **dlp; 2547dd7cddfSDavid du Colombier int ndl; 2557dd7cddfSDavid du Colombier int putseq; 2567dd7cddfSDavid du Colombier int nincl; 2577dd7cddfSDavid du Colombier Rune **incl; 2587dd7cddfSDavid du Colombier Reffont *reffont; 2597dd7cddfSDavid du Colombier QLock ctllock; 2607dd7cddfSDavid du Colombier uint ctlfid; 2617dd7cddfSDavid du Colombier char *dumpstr; 2627dd7cddfSDavid du Colombier char *dumpdir; 2637dd7cddfSDavid du Colombier int dumpid; 2647dd7cddfSDavid du Colombier int utflastqid; 2657dd7cddfSDavid du Colombier int utflastboff; 2667dd7cddfSDavid du Colombier int utflastq; 2672c2299ceSDavid du Colombier int tagsafe; /* taglines is correct */ 2682c2299ceSDavid du Colombier int tagexpand; 2692c2299ceSDavid du Colombier int taglines; 2702c2299ceSDavid du Colombier Rectangle tagtop; 2712c2299ceSDavid du Colombier QLock editoutlk; 272219b2ee8SDavid du Colombier }; 273219b2ee8SDavid du Colombier 2747dd7cddfSDavid du Colombier void wininit(Window*, Window*, Rectangle); 2757dd7cddfSDavid du Colombier void winlock(Window*, int); 2767dd7cddfSDavid du Colombier void winlock1(Window*, int); 2777dd7cddfSDavid du Colombier void winunlock(Window*); 2787dd7cddfSDavid du Colombier void wintype(Window*, Text*, Rune); 2797dd7cddfSDavid du Colombier void winundo(Window*, int); 2807dd7cddfSDavid du Colombier void winsetname(Window*, Rune*, int); 2817dd7cddfSDavid du Colombier void winsettag(Window*); 2827dd7cddfSDavid du Colombier void winsettag1(Window*); 2837dd7cddfSDavid du Colombier void wincommit(Window*, Text*); 2842c2299ceSDavid du Colombier int winresize(Window*, Rectangle, int, int); 2857dd7cddfSDavid du Colombier void winclose(Window*); 2867dd7cddfSDavid du Colombier void windelete(Window*); 2877dd7cddfSDavid du Colombier int winclean(Window*, int); 2887dd7cddfSDavid du Colombier void windirfree(Window*); 2897dd7cddfSDavid du Colombier void winevent(Window*, char*, ...); 2907dd7cddfSDavid du Colombier void winmousebut(Window*); 2917dd7cddfSDavid du Colombier void winaddincl(Window*, Rune*, int); 2927dd7cddfSDavid du Colombier void wincleartag(Window*); 2938a2c5ad0SDavid du Colombier char *winctlprint(Window*, char*, int); 2947dd7cddfSDavid du Colombier 2957dd7cddfSDavid du Colombier struct Column 296219b2ee8SDavid du Colombier { 2977dd7cddfSDavid du Colombier Rectangle r; 2987dd7cddfSDavid du Colombier Text tag; 2997dd7cddfSDavid du Colombier Row *row; 3007dd7cddfSDavid du Colombier Window **w; 3017dd7cddfSDavid du Colombier int nw; 302219b2ee8SDavid du Colombier int safe; 303219b2ee8SDavid du Colombier }; 304219b2ee8SDavid du Colombier 3057dd7cddfSDavid du Colombier void colinit(Column*, Rectangle); 3067dd7cddfSDavid du Colombier Window* coladd(Column*, Window*, Window*, int); 3077dd7cddfSDavid du Colombier void colclose(Column*, Window*, int); 3087dd7cddfSDavid du Colombier void colcloseall(Column*); 3097dd7cddfSDavid du Colombier void colresize(Column*, Rectangle); 3107dd7cddfSDavid du Colombier Text* colwhich(Column*, Point); 3117dd7cddfSDavid du Colombier void coldragwin(Column*, Window*, int); 3127dd7cddfSDavid du Colombier void colgrow(Column*, Window*, int); 3137dd7cddfSDavid du Colombier int colclean(Column*); 3147dd7cddfSDavid du Colombier void colsort(Column*); 3157dd7cddfSDavid du Colombier void colmousebut(Column*); 3167dd7cddfSDavid du Colombier 3177dd7cddfSDavid du Colombier struct Row 318219b2ee8SDavid du Colombier { 319219b2ee8SDavid du Colombier QLock; 3207dd7cddfSDavid du Colombier Rectangle r; 3217dd7cddfSDavid du Colombier Text tag; 3227dd7cddfSDavid du Colombier Column **col; 3237dd7cddfSDavid du Colombier int ncol; 324219b2ee8SDavid du Colombier 325219b2ee8SDavid du Colombier }; 326219b2ee8SDavid du Colombier 3277dd7cddfSDavid du Colombier void rowinit(Row*, Rectangle); 3287dd7cddfSDavid du Colombier Column* rowadd(Row*, Column *c, int); 3297dd7cddfSDavid du Colombier void rowclose(Row*, Column*, int); 3307dd7cddfSDavid du Colombier Text* rowwhich(Row*, Point); 3317dd7cddfSDavid du Colombier Column* rowwhichcol(Row*, Point); 3327dd7cddfSDavid du Colombier void rowresize(Row*, Rectangle); 3337dd7cddfSDavid du Colombier Text* rowtype(Row*, Rune, Point); 3347dd7cddfSDavid du Colombier void rowdragcol(Row*, Column*, int but); 3357dd7cddfSDavid du Colombier int rowclean(Row*); 3367dd7cddfSDavid du Colombier void rowdump(Row*, char*); 3374b30ca09SDavid du Colombier int rowload(Row*, char*, int); 3389a747e4fSDavid du Colombier void rowloadfonts(char*); 3397dd7cddfSDavid du Colombier 3407dd7cddfSDavid du Colombier struct Timer 341219b2ee8SDavid du Colombier { 342219b2ee8SDavid du Colombier int dt; 3437dd7cddfSDavid du Colombier int cancel; 3447dd7cddfSDavid du Colombier Channel *c; /* chan(int) */ 345219b2ee8SDavid du Colombier Timer *next; 346219b2ee8SDavid du Colombier }; 347219b2ee8SDavid du Colombier 3487dd7cddfSDavid du Colombier struct Command 349219b2ee8SDavid du Colombier { 350219b2ee8SDavid du Colombier int pid; 351219b2ee8SDavid du Colombier Rune *name; 352219b2ee8SDavid du Colombier int nname; 3537dd7cddfSDavid du Colombier char *text; 3547dd7cddfSDavid du Colombier char **av; 35559cc4ca5SDavid du Colombier int iseditcmd; 356219b2ee8SDavid du Colombier Mntdir *md; 357219b2ee8SDavid du Colombier Command *next; 358219b2ee8SDavid du Colombier }; 359219b2ee8SDavid du Colombier 3607dd7cddfSDavid du Colombier struct Dirtab 361219b2ee8SDavid du Colombier { 3627dd7cddfSDavid du Colombier char *name; 3639a747e4fSDavid du Colombier uchar type; 364219b2ee8SDavid du Colombier uint qid; 365219b2ee8SDavid du Colombier uint perm; 366219b2ee8SDavid du Colombier }; 367219b2ee8SDavid du Colombier 3687dd7cddfSDavid du Colombier struct Mntdir 369219b2ee8SDavid du Colombier { 370219b2ee8SDavid du Colombier int id; 371219b2ee8SDavid du Colombier int ref; 372219b2ee8SDavid du Colombier Rune *dir; 373219b2ee8SDavid du Colombier int ndir; 374219b2ee8SDavid du Colombier Mntdir *next; 375219b2ee8SDavid du Colombier int nincl; 376219b2ee8SDavid du Colombier Rune **incl; 377219b2ee8SDavid du Colombier }; 378219b2ee8SDavid du Colombier 3797dd7cddfSDavid du Colombier struct Fid 380219b2ee8SDavid du Colombier { 3817dd7cddfSDavid du Colombier int fid; 382219b2ee8SDavid du Colombier int busy; 383219b2ee8SDavid du Colombier int open; 384219b2ee8SDavid du Colombier Qid qid; 385219b2ee8SDavid du Colombier Window *w; 386219b2ee8SDavid du Colombier Dirtab *dir; 387219b2ee8SDavid du Colombier Fid *next; 388219b2ee8SDavid du Colombier Mntdir *mntdir; 389219b2ee8SDavid du Colombier int nrpart; 3907dd7cddfSDavid du Colombier uchar rpart[UTFmax]; 391219b2ee8SDavid du Colombier }; 392219b2ee8SDavid du Colombier 3937dd7cddfSDavid du Colombier 3947dd7cddfSDavid du Colombier struct Xfid 395219b2ee8SDavid du Colombier { 3967dd7cddfSDavid du Colombier void *arg; /* args to xfidinit */ 3977dd7cddfSDavid du Colombier Fcall; 3987dd7cddfSDavid du Colombier Xfid *next; 3997dd7cddfSDavid du Colombier Channel *c; /* chan(void(*)(Xfid*)) */ 4007dd7cddfSDavid du Colombier Fid *f; 4019a747e4fSDavid du Colombier uchar *buf; 402219b2ee8SDavid du Colombier int flushed; 403219b2ee8SDavid du Colombier 404219b2ee8SDavid du Colombier }; 405219b2ee8SDavid du Colombier 4067dd7cddfSDavid du Colombier void xfidctl(void *); 4077dd7cddfSDavid du Colombier void xfidflush(Xfid*); 4087dd7cddfSDavid du Colombier void xfidopen(Xfid*); 4097dd7cddfSDavid du Colombier void xfidclose(Xfid*); 4107dd7cddfSDavid du Colombier void xfidread(Xfid*); 4117dd7cddfSDavid du Colombier void xfidwrite(Xfid*); 4127dd7cddfSDavid du Colombier void xfidctlwrite(Xfid*, Window*); 4137dd7cddfSDavid du Colombier void xfideventread(Xfid*, Window*); 4147dd7cddfSDavid du Colombier void xfideventwrite(Xfid*, Window*); 4157dd7cddfSDavid du Colombier void xfidindexread(Xfid*); 4167dd7cddfSDavid du Colombier void xfidutfread(Xfid*, Text*, uint, int); 4177dd7cddfSDavid du Colombier int xfidruneread(Xfid*, Text*, uint, uint); 4187dd7cddfSDavid du Colombier 4197dd7cddfSDavid du Colombier struct Reffont 420219b2ee8SDavid du Colombier { 421219b2ee8SDavid du Colombier Ref; 4227dd7cddfSDavid du Colombier Font *f; 423219b2ee8SDavid du Colombier 424219b2ee8SDavid du Colombier }; 4257dd7cddfSDavid du Colombier Reffont *rfget(int, int, int, char*); 4267dd7cddfSDavid du Colombier void rfclose(Reffont*); 427219b2ee8SDavid du Colombier 4287dd7cddfSDavid du Colombier struct Rangeset 429219b2ee8SDavid du Colombier { 430219b2ee8SDavid du Colombier Range r[NRange]; 431219b2ee8SDavid du Colombier }; 432219b2ee8SDavid du Colombier 4337dd7cddfSDavid du Colombier struct Dirlist 434219b2ee8SDavid du Colombier { 435219b2ee8SDavid du Colombier Rune *r; 436219b2ee8SDavid du Colombier int nr; 437219b2ee8SDavid du Colombier int wid; 438219b2ee8SDavid du Colombier }; 439219b2ee8SDavid du Colombier 4407dd7cddfSDavid du Colombier struct Expand 441219b2ee8SDavid du Colombier { 442219b2ee8SDavid du Colombier uint q0; 443219b2ee8SDavid du Colombier uint q1; 444219b2ee8SDavid du Colombier Rune *name; 445219b2ee8SDavid du Colombier int nname; 4467dd7cddfSDavid du Colombier char *bname; 447219b2ee8SDavid du Colombier int jump; 4487dd7cddfSDavid du Colombier union{ 449219b2ee8SDavid du Colombier Text *at; 4507dd7cddfSDavid du Colombier Rune *ar; 4517dd7cddfSDavid du Colombier }; 4527dd7cddfSDavid du Colombier int (*agetc)(void*, uint); 453219b2ee8SDavid du Colombier int a0; 454219b2ee8SDavid du Colombier int a1; 455219b2ee8SDavid du Colombier }; 456219b2ee8SDavid du Colombier 457219b2ee8SDavid du Colombier enum 458219b2ee8SDavid du Colombier { 459219b2ee8SDavid du Colombier /* fbufalloc() guarantees room off end of BUFSIZE */ 4609a747e4fSDavid du Colombier BUFSIZE = Maxblock+IOHDRSZ, /* size from fbufalloc() */ 461219b2ee8SDavid du Colombier RBUFSIZE = BUFSIZE/sizeof(Rune), 462219b2ee8SDavid du Colombier EVENTSIZE = 256, 463219b2ee8SDavid du Colombier Scrollwid = 12, /* width of scroll bar */ 464219b2ee8SDavid du Colombier Scrollgap = 4, /* gap right of scroll bar */ 465219b2ee8SDavid du Colombier Margin = 4, /* margin around text */ 466219b2ee8SDavid du Colombier Border = 2, /* line between rows, cols, windows */ 467219b2ee8SDavid du Colombier }; 468219b2ee8SDavid du Colombier 469219b2ee8SDavid du Colombier #define QID(w,q) ((w<<8)|(q)) 4709a747e4fSDavid du Colombier #define WIN(q) ((((ulong)(q).path)>>8) & 0xFFFFFF) 471219b2ee8SDavid du Colombier #define FILE(q) ((q).path & 0xFF) 472219b2ee8SDavid du Colombier 473219b2ee8SDavid du Colombier enum 474219b2ee8SDavid du Colombier { 475219b2ee8SDavid du Colombier FALSE, 476219b2ee8SDavid du Colombier TRUE, 477219b2ee8SDavid du Colombier XXX, 478219b2ee8SDavid du Colombier }; 479219b2ee8SDavid du Colombier 480219b2ee8SDavid du Colombier enum 481219b2ee8SDavid du Colombier { 48259cc4ca5SDavid du Colombier Empty = 0, 483219b2ee8SDavid du Colombier Null = '-', 484219b2ee8SDavid du Colombier Delete = 'd', 485219b2ee8SDavid du Colombier Insert = 'i', 48659cc4ca5SDavid du Colombier Replace = 'r', 487219b2ee8SDavid du Colombier Filename = 'f', 488219b2ee8SDavid du Colombier }; 489219b2ee8SDavid du Colombier 49059cc4ca5SDavid du Colombier enum /* editing */ 49159cc4ca5SDavid du Colombier { 49259cc4ca5SDavid du Colombier Inactive = 0, 49359cc4ca5SDavid du Colombier Inserting, 49459cc4ca5SDavid du Colombier Collecting, 49559cc4ca5SDavid du Colombier }; 49659cc4ca5SDavid du Colombier 49706300895SDavid du Colombier uint globalincref; 498219b2ee8SDavid du Colombier uint seq; 4997dd7cddfSDavid du Colombier uint maxtab; /* size of a tab, in units of the '0' character */ 500219b2ee8SDavid du Colombier 5017dd7cddfSDavid du Colombier Display *display; 5027dd7cddfSDavid du Colombier Image *screen; 5037dd7cddfSDavid du Colombier Font *font; 5047dd7cddfSDavid du Colombier Mouse *mouse; 5057dd7cddfSDavid du Colombier Mousectl *mousectl; 5067dd7cddfSDavid du Colombier Keyboardctl *keyboardctl; 507219b2ee8SDavid du Colombier Reffont reffont; 5087dd7cddfSDavid du Colombier Image *modbutton; 5097dd7cddfSDavid du Colombier Image *colbutton; 5107dd7cddfSDavid du Colombier Image *button; 5117dd7cddfSDavid du Colombier Image *but2col; 5127dd7cddfSDavid du Colombier Image *but3col; 513219b2ee8SDavid du Colombier Cursor boxcursor; 514219b2ee8SDavid du Colombier Row row; 515219b2ee8SDavid du Colombier int timerpid; 516219b2ee8SDavid du Colombier Disk *disk; 517219b2ee8SDavid du Colombier Text *seltext; 518219b2ee8SDavid du Colombier Text *argtext; 519219b2ee8SDavid du Colombier Text *mousetext; /* global because Text.close needs to clear it */ 520219b2ee8SDavid du Colombier Text *typetext; /* global because Text.close needs to clear it */ 5217dd7cddfSDavid du Colombier Text *barttext; /* shared between mousetask and keyboardthread */ 522219b2ee8SDavid du Colombier int bartflag; 5237dd7cddfSDavid du Colombier Window *activewin; 524219b2ee8SDavid du Colombier Column *activecol; 5257dd7cddfSDavid du Colombier Buffer snarfbuf; 526219b2ee8SDavid du Colombier Rectangle nullrect; 527219b2ee8SDavid du Colombier int fsyspid; 5287dd7cddfSDavid du Colombier char *cputype; 5297dd7cddfSDavid du Colombier char *objtype; 5307dd7cddfSDavid du Colombier char *home; 5317dd7cddfSDavid du Colombier char *fontnames[2]; 5327dd7cddfSDavid du Colombier char acmeerrorfile[128]; 5337dd7cddfSDavid du Colombier Image *tagcols[NCOL]; 5347dd7cddfSDavid du Colombier Image *textcols[NCOL]; 5357dd7cddfSDavid du Colombier int plumbsendfd; 5367dd7cddfSDavid du Colombier int plumbeditfd; 5377dd7cddfSDavid du Colombier char wdir[]; 53859cc4ca5SDavid du Colombier int editing; 5399a747e4fSDavid du Colombier int messagesize; /* negotiated in 9P version setup */ 5404fec87e5SDavid du Colombier int globalautoindent; 541219b2ee8SDavid du Colombier 542a8453668SDavid du Colombier enum 543a8453668SDavid du Colombier { 544a8453668SDavid du Colombier Kscrolloneup = KF|0x20, 545a8453668SDavid du Colombier Kscrollonedown = KF|0x21, 546a8453668SDavid du Colombier }; 547a8453668SDavid du Colombier 5487dd7cddfSDavid du Colombier Channel *cplumb; /* chan(Plumbmsg*) */ 5497dd7cddfSDavid du Colombier Channel *cwait; /* chan(Waitmsg) */ 5507dd7cddfSDavid du Colombier Channel *ccommand; /* chan(Command*) */ 5517dd7cddfSDavid du Colombier Channel *ckill; /* chan(Rune*) */ 5527dd7cddfSDavid du Colombier Channel *cxfidalloc; /* chan(Xfid*) */ 5537dd7cddfSDavid du Colombier Channel *cxfidfree; /* chan(Xfid*) */ 5549a747e4fSDavid du Colombier Channel *cnewwindow; /* chan(Channel*) */ 5557dd7cddfSDavid du Colombier Channel *mouseexit0; /* chan(int) */ 5567dd7cddfSDavid du Colombier Channel *mouseexit1; /* chan(int) */ 5577dd7cddfSDavid du Colombier Channel *cexit; /* chan(int) */ 5587dd7cddfSDavid du Colombier Channel *cerr; /* chan(char*) */ 55959cc4ca5SDavid du Colombier Channel *cedit; /* chan(int) */ 5605316891fSDavid du Colombier Channel *cwarn; /* chan(void*)[1] (really chan(unit)[1]) */ 5617dd7cddfSDavid du Colombier 5627dd7cddfSDavid du Colombier #define STACK 8192 563