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, 18*673c3d8aSDavid du Colombier QWerrors, 19219b2ee8SDavid du Colombier QWevent, 207dd7cddfSDavid du Colombier QWrdsel, 217dd7cddfSDavid du Colombier QWwrsel, 22219b2ee8SDavid du Colombier QWtag, 23*673c3d8aSDavid 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, 30219b2ee8SDavid du Colombier Maxblock = 8*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*); 2147dd7cddfSDavid du Colombier int textresize(Text*, Rectangle); 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; 2387dd7cddfSDavid du Colombier int id; 2397dd7cddfSDavid du Colombier Range addr; 2407dd7cddfSDavid du Colombier Range limit; 2417dd7cddfSDavid du Colombier uchar nopen[QMAX]; 2427dd7cddfSDavid du Colombier uchar nomark; 2437dd7cddfSDavid du Colombier uchar noscroll; 2447dd7cddfSDavid du Colombier Range wrselrange; 2457dd7cddfSDavid du Colombier int rdselfd; 2467dd7cddfSDavid du Colombier Column *col; 2477dd7cddfSDavid du Colombier Xfid *eventx; 2487dd7cddfSDavid du Colombier char *events; 2497dd7cddfSDavid du Colombier int nevents; 2507dd7cddfSDavid du Colombier int owner; 2517dd7cddfSDavid du Colombier int maxlines; 2527dd7cddfSDavid du Colombier Dirlist **dlp; 2537dd7cddfSDavid du Colombier int ndl; 2547dd7cddfSDavid du Colombier int putseq; 2557dd7cddfSDavid du Colombier int nincl; 2567dd7cddfSDavid du Colombier Rune **incl; 2577dd7cddfSDavid du Colombier Reffont *reffont; 2587dd7cddfSDavid du Colombier QLock ctllock; 2597dd7cddfSDavid du Colombier uint ctlfid; 2607dd7cddfSDavid du Colombier char *dumpstr; 2617dd7cddfSDavid du Colombier char *dumpdir; 2627dd7cddfSDavid du Colombier int dumpid; 2637dd7cddfSDavid du Colombier int utflastqid; 2647dd7cddfSDavid du Colombier int utflastboff; 2657dd7cddfSDavid du Colombier int utflastq; 266219b2ee8SDavid du Colombier }; 267219b2ee8SDavid du Colombier 2687dd7cddfSDavid du Colombier void wininit(Window*, Window*, Rectangle); 2697dd7cddfSDavid du Colombier void winlock(Window*, int); 2707dd7cddfSDavid du Colombier void winlock1(Window*, int); 2717dd7cddfSDavid du Colombier void winunlock(Window*); 2727dd7cddfSDavid du Colombier void wintype(Window*, Text*, Rune); 2737dd7cddfSDavid du Colombier void winundo(Window*, int); 2747dd7cddfSDavid du Colombier void winsetname(Window*, Rune*, int); 2757dd7cddfSDavid du Colombier void winsettag(Window*); 2767dd7cddfSDavid du Colombier void winsettag1(Window*); 2777dd7cddfSDavid du Colombier void wincommit(Window*, Text*); 2787dd7cddfSDavid du Colombier int winresize(Window*, Rectangle, int); 2797dd7cddfSDavid du Colombier void winclose(Window*); 2807dd7cddfSDavid du Colombier void windelete(Window*); 2817dd7cddfSDavid du Colombier int winclean(Window*, int); 2827dd7cddfSDavid du Colombier void windirfree(Window*); 2837dd7cddfSDavid du Colombier void winevent(Window*, char*, ...); 2847dd7cddfSDavid du Colombier void winmousebut(Window*); 2857dd7cddfSDavid du Colombier void winaddincl(Window*, Rune*, int); 2867dd7cddfSDavid du Colombier void wincleartag(Window*); 2878a2c5ad0SDavid du Colombier char *winctlprint(Window*, char*, int); 2887dd7cddfSDavid du Colombier 2897dd7cddfSDavid du Colombier struct Column 290219b2ee8SDavid du Colombier { 2917dd7cddfSDavid du Colombier Rectangle r; 2927dd7cddfSDavid du Colombier Text tag; 2937dd7cddfSDavid du Colombier Row *row; 2947dd7cddfSDavid du Colombier Window **w; 2957dd7cddfSDavid du Colombier int nw; 296219b2ee8SDavid du Colombier int safe; 297219b2ee8SDavid du Colombier }; 298219b2ee8SDavid du Colombier 2997dd7cddfSDavid du Colombier void colinit(Column*, Rectangle); 3007dd7cddfSDavid du Colombier Window* coladd(Column*, Window*, Window*, int); 3017dd7cddfSDavid du Colombier void colclose(Column*, Window*, int); 3027dd7cddfSDavid du Colombier void colcloseall(Column*); 3037dd7cddfSDavid du Colombier void colresize(Column*, Rectangle); 3047dd7cddfSDavid du Colombier Text* colwhich(Column*, Point); 3057dd7cddfSDavid du Colombier void coldragwin(Column*, Window*, int); 3067dd7cddfSDavid du Colombier void colgrow(Column*, Window*, int); 3077dd7cddfSDavid du Colombier int colclean(Column*); 3087dd7cddfSDavid du Colombier void colsort(Column*); 3097dd7cddfSDavid du Colombier void colmousebut(Column*); 3107dd7cddfSDavid du Colombier 3117dd7cddfSDavid du Colombier struct Row 312219b2ee8SDavid du Colombier { 313219b2ee8SDavid du Colombier QLock; 3147dd7cddfSDavid du Colombier Rectangle r; 3157dd7cddfSDavid du Colombier Text tag; 3167dd7cddfSDavid du Colombier Column **col; 3177dd7cddfSDavid du Colombier int ncol; 318219b2ee8SDavid du Colombier 319219b2ee8SDavid du Colombier }; 320219b2ee8SDavid du Colombier 3217dd7cddfSDavid du Colombier void rowinit(Row*, Rectangle); 3227dd7cddfSDavid du Colombier Column* rowadd(Row*, Column *c, int); 3237dd7cddfSDavid du Colombier void rowclose(Row*, Column*, int); 3247dd7cddfSDavid du Colombier Text* rowwhich(Row*, Point); 3257dd7cddfSDavid du Colombier Column* rowwhichcol(Row*, Point); 3267dd7cddfSDavid du Colombier void rowresize(Row*, Rectangle); 3277dd7cddfSDavid du Colombier Text* rowtype(Row*, Rune, Point); 3287dd7cddfSDavid du Colombier void rowdragcol(Row*, Column*, int but); 3297dd7cddfSDavid du Colombier int rowclean(Row*); 3307dd7cddfSDavid du Colombier void rowdump(Row*, char*); 3314b30ca09SDavid du Colombier int rowload(Row*, char*, int); 3329a747e4fSDavid du Colombier void rowloadfonts(char*); 3337dd7cddfSDavid du Colombier 3347dd7cddfSDavid du Colombier struct Timer 335219b2ee8SDavid du Colombier { 336219b2ee8SDavid du Colombier int dt; 3377dd7cddfSDavid du Colombier int cancel; 3387dd7cddfSDavid du Colombier Channel *c; /* chan(int) */ 339219b2ee8SDavid du Colombier Timer *next; 340219b2ee8SDavid du Colombier }; 341219b2ee8SDavid du Colombier 3427dd7cddfSDavid du Colombier struct Command 343219b2ee8SDavid du Colombier { 344219b2ee8SDavid du Colombier int pid; 345219b2ee8SDavid du Colombier Rune *name; 346219b2ee8SDavid du Colombier int nname; 3477dd7cddfSDavid du Colombier char *text; 3487dd7cddfSDavid du Colombier char **av; 34959cc4ca5SDavid du Colombier int iseditcmd; 350219b2ee8SDavid du Colombier Mntdir *md; 351219b2ee8SDavid du Colombier Command *next; 352219b2ee8SDavid du Colombier }; 353219b2ee8SDavid du Colombier 3547dd7cddfSDavid du Colombier struct Dirtab 355219b2ee8SDavid du Colombier { 3567dd7cddfSDavid du Colombier char *name; 3579a747e4fSDavid du Colombier uchar type; 358219b2ee8SDavid du Colombier uint qid; 359219b2ee8SDavid du Colombier uint perm; 360219b2ee8SDavid du Colombier }; 361219b2ee8SDavid du Colombier 3627dd7cddfSDavid du Colombier struct Mntdir 363219b2ee8SDavid du Colombier { 364219b2ee8SDavid du Colombier int id; 365219b2ee8SDavid du Colombier int ref; 366219b2ee8SDavid du Colombier Rune *dir; 367219b2ee8SDavid du Colombier int ndir; 368219b2ee8SDavid du Colombier Mntdir *next; 369219b2ee8SDavid du Colombier int nincl; 370219b2ee8SDavid du Colombier Rune **incl; 371219b2ee8SDavid du Colombier }; 372219b2ee8SDavid du Colombier 3737dd7cddfSDavid du Colombier struct Fid 374219b2ee8SDavid du Colombier { 3757dd7cddfSDavid du Colombier int fid; 376219b2ee8SDavid du Colombier int busy; 377219b2ee8SDavid du Colombier int open; 378219b2ee8SDavid du Colombier Qid qid; 379219b2ee8SDavid du Colombier Window *w; 380219b2ee8SDavid du Colombier Dirtab *dir; 381219b2ee8SDavid du Colombier Fid *next; 382219b2ee8SDavid du Colombier Mntdir *mntdir; 383219b2ee8SDavid du Colombier int nrpart; 3847dd7cddfSDavid du Colombier uchar rpart[UTFmax]; 385219b2ee8SDavid du Colombier }; 386219b2ee8SDavid du Colombier 3877dd7cddfSDavid du Colombier 3887dd7cddfSDavid du Colombier struct Xfid 389219b2ee8SDavid du Colombier { 3907dd7cddfSDavid du Colombier void *arg; /* args to xfidinit */ 3917dd7cddfSDavid du Colombier Fcall; 3927dd7cddfSDavid du Colombier Xfid *next; 3937dd7cddfSDavid du Colombier Channel *c; /* chan(void(*)(Xfid*)) */ 3947dd7cddfSDavid du Colombier Fid *f; 3959a747e4fSDavid du Colombier uchar *buf; 396219b2ee8SDavid du Colombier int flushed; 397219b2ee8SDavid du Colombier 398219b2ee8SDavid du Colombier }; 399219b2ee8SDavid du Colombier 4007dd7cddfSDavid du Colombier void xfidctl(void *); 4017dd7cddfSDavid du Colombier void xfidflush(Xfid*); 4027dd7cddfSDavid du Colombier void xfidopen(Xfid*); 4037dd7cddfSDavid du Colombier void xfidclose(Xfid*); 4047dd7cddfSDavid du Colombier void xfidread(Xfid*); 4057dd7cddfSDavid du Colombier void xfidwrite(Xfid*); 4067dd7cddfSDavid du Colombier void xfidctlwrite(Xfid*, Window*); 4077dd7cddfSDavid du Colombier void xfideventread(Xfid*, Window*); 4087dd7cddfSDavid du Colombier void xfideventwrite(Xfid*, Window*); 4097dd7cddfSDavid du Colombier void xfidindexread(Xfid*); 4107dd7cddfSDavid du Colombier void xfidutfread(Xfid*, Text*, uint, int); 4117dd7cddfSDavid du Colombier int xfidruneread(Xfid*, Text*, uint, uint); 4127dd7cddfSDavid du Colombier 4137dd7cddfSDavid du Colombier struct Reffont 414219b2ee8SDavid du Colombier { 415219b2ee8SDavid du Colombier Ref; 4167dd7cddfSDavid du Colombier Font *f; 417219b2ee8SDavid du Colombier 418219b2ee8SDavid du Colombier }; 4197dd7cddfSDavid du Colombier Reffont *rfget(int, int, int, char*); 4207dd7cddfSDavid du Colombier void rfclose(Reffont*); 421219b2ee8SDavid du Colombier 4227dd7cddfSDavid du Colombier struct Rangeset 423219b2ee8SDavid du Colombier { 424219b2ee8SDavid du Colombier Range r[NRange]; 425219b2ee8SDavid du Colombier }; 426219b2ee8SDavid du Colombier 4277dd7cddfSDavid du Colombier struct Dirlist 428219b2ee8SDavid du Colombier { 429219b2ee8SDavid du Colombier Rune *r; 430219b2ee8SDavid du Colombier int nr; 431219b2ee8SDavid du Colombier int wid; 432219b2ee8SDavid du Colombier }; 433219b2ee8SDavid du Colombier 4347dd7cddfSDavid du Colombier struct Expand 435219b2ee8SDavid du Colombier { 436219b2ee8SDavid du Colombier uint q0; 437219b2ee8SDavid du Colombier uint q1; 438219b2ee8SDavid du Colombier Rune *name; 439219b2ee8SDavid du Colombier int nname; 4407dd7cddfSDavid du Colombier char *bname; 441219b2ee8SDavid du Colombier int jump; 4427dd7cddfSDavid du Colombier union{ 443219b2ee8SDavid du Colombier Text *at; 4447dd7cddfSDavid du Colombier Rune *ar; 4457dd7cddfSDavid du Colombier }; 4467dd7cddfSDavid du Colombier int (*agetc)(void*, uint); 447219b2ee8SDavid du Colombier int a0; 448219b2ee8SDavid du Colombier int a1; 449219b2ee8SDavid du Colombier }; 450219b2ee8SDavid du Colombier 451219b2ee8SDavid du Colombier enum 452219b2ee8SDavid du Colombier { 453219b2ee8SDavid du Colombier /* fbufalloc() guarantees room off end of BUFSIZE */ 4549a747e4fSDavid du Colombier BUFSIZE = Maxblock+IOHDRSZ, /* size from fbufalloc() */ 455219b2ee8SDavid du Colombier RBUFSIZE = BUFSIZE/sizeof(Rune), 456219b2ee8SDavid du Colombier EVENTSIZE = 256, 457219b2ee8SDavid du Colombier Scrollwid = 12, /* width of scroll bar */ 458219b2ee8SDavid du Colombier Scrollgap = 4, /* gap right of scroll bar */ 459219b2ee8SDavid du Colombier Margin = 4, /* margin around text */ 460219b2ee8SDavid du Colombier Border = 2, /* line between rows, cols, windows */ 461219b2ee8SDavid du Colombier }; 462219b2ee8SDavid du Colombier 463219b2ee8SDavid du Colombier #define QID(w,q) ((w<<8)|(q)) 4649a747e4fSDavid du Colombier #define WIN(q) ((((ulong)(q).path)>>8) & 0xFFFFFF) 465219b2ee8SDavid du Colombier #define FILE(q) ((q).path & 0xFF) 466219b2ee8SDavid du Colombier 467219b2ee8SDavid du Colombier enum 468219b2ee8SDavid du Colombier { 469219b2ee8SDavid du Colombier FALSE, 470219b2ee8SDavid du Colombier TRUE, 471219b2ee8SDavid du Colombier XXX, 472219b2ee8SDavid du Colombier }; 473219b2ee8SDavid du Colombier 474219b2ee8SDavid du Colombier enum 475219b2ee8SDavid du Colombier { 47659cc4ca5SDavid du Colombier Empty = 0, 477219b2ee8SDavid du Colombier Null = '-', 478219b2ee8SDavid du Colombier Delete = 'd', 479219b2ee8SDavid du Colombier Insert = 'i', 48059cc4ca5SDavid du Colombier Replace = 'r', 481219b2ee8SDavid du Colombier Filename = 'f', 482219b2ee8SDavid du Colombier }; 483219b2ee8SDavid du Colombier 48459cc4ca5SDavid du Colombier enum /* editing */ 48559cc4ca5SDavid du Colombier { 48659cc4ca5SDavid du Colombier Inactive = 0, 48759cc4ca5SDavid du Colombier Inserting, 48859cc4ca5SDavid du Colombier Collecting, 48959cc4ca5SDavid du Colombier }; 49059cc4ca5SDavid du Colombier 49106300895SDavid du Colombier uint globalincref; 492219b2ee8SDavid du Colombier uint seq; 4937dd7cddfSDavid du Colombier uint maxtab; /* size of a tab, in units of the '0' character */ 494219b2ee8SDavid du Colombier 4957dd7cddfSDavid du Colombier Display *display; 4967dd7cddfSDavid du Colombier Image *screen; 4977dd7cddfSDavid du Colombier Font *font; 4987dd7cddfSDavid du Colombier Mouse *mouse; 4997dd7cddfSDavid du Colombier Mousectl *mousectl; 5007dd7cddfSDavid du Colombier Keyboardctl *keyboardctl; 501219b2ee8SDavid du Colombier Reffont reffont; 5027dd7cddfSDavid du Colombier Image *modbutton; 5037dd7cddfSDavid du Colombier Image *colbutton; 5047dd7cddfSDavid du Colombier Image *button; 5057dd7cddfSDavid du Colombier Image *but2col; 5067dd7cddfSDavid du Colombier Image *but3col; 507219b2ee8SDavid du Colombier Cursor boxcursor; 508219b2ee8SDavid du Colombier Row row; 509219b2ee8SDavid du Colombier int timerpid; 510219b2ee8SDavid du Colombier Disk *disk; 511219b2ee8SDavid du Colombier Text *seltext; 512219b2ee8SDavid du Colombier Text *argtext; 513219b2ee8SDavid du Colombier Text *mousetext; /* global because Text.close needs to clear it */ 514219b2ee8SDavid du Colombier Text *typetext; /* global because Text.close needs to clear it */ 5157dd7cddfSDavid du Colombier Text *barttext; /* shared between mousetask and keyboardthread */ 516219b2ee8SDavid du Colombier int bartflag; 5177dd7cddfSDavid du Colombier Window *activewin; 518219b2ee8SDavid du Colombier Column *activecol; 5197dd7cddfSDavid du Colombier Buffer snarfbuf; 520219b2ee8SDavid du Colombier Rectangle nullrect; 521219b2ee8SDavid du Colombier int fsyspid; 5227dd7cddfSDavid du Colombier char *cputype; 5237dd7cddfSDavid du Colombier char *objtype; 5247dd7cddfSDavid du Colombier char *home; 5257dd7cddfSDavid du Colombier char *fontnames[2]; 5267dd7cddfSDavid du Colombier char acmeerrorfile[128]; 5277dd7cddfSDavid du Colombier Image *tagcols[NCOL]; 5287dd7cddfSDavid du Colombier Image *textcols[NCOL]; 5297dd7cddfSDavid du Colombier int plumbsendfd; 5307dd7cddfSDavid du Colombier int plumbeditfd; 5317dd7cddfSDavid du Colombier char wdir[]; 53259cc4ca5SDavid du Colombier int editing; 5339a747e4fSDavid du Colombier int messagesize; /* negotiated in 9P version setup */ 5344fec87e5SDavid du Colombier int globalautoindent; 535219b2ee8SDavid du Colombier 536a8453668SDavid du Colombier enum 537a8453668SDavid du Colombier { 538a8453668SDavid du Colombier Kscrolloneup = KF|0x20, 539a8453668SDavid du Colombier Kscrollonedown = KF|0x21, 540a8453668SDavid du Colombier }; 541a8453668SDavid du Colombier 5427dd7cddfSDavid du Colombier Channel *cplumb; /* chan(Plumbmsg*) */ 5437dd7cddfSDavid du Colombier Channel *cwait; /* chan(Waitmsg) */ 5447dd7cddfSDavid du Colombier Channel *ccommand; /* chan(Command*) */ 5457dd7cddfSDavid du Colombier Channel *ckill; /* chan(Rune*) */ 5467dd7cddfSDavid du Colombier Channel *cxfidalloc; /* chan(Xfid*) */ 5477dd7cddfSDavid du Colombier Channel *cxfidfree; /* chan(Xfid*) */ 5489a747e4fSDavid du Colombier Channel *cnewwindow; /* chan(Channel*) */ 5497dd7cddfSDavid du Colombier Channel *mouseexit0; /* chan(int) */ 5507dd7cddfSDavid du Colombier Channel *mouseexit1; /* chan(int) */ 5517dd7cddfSDavid du Colombier Channel *cexit; /* chan(int) */ 5527dd7cddfSDavid du Colombier Channel *cerr; /* chan(char*) */ 55359cc4ca5SDavid du Colombier Channel *cedit; /* chan(int) */ 5545316891fSDavid du Colombier Channel *cwarn; /* chan(void*)[1] (really chan(unit)[1]) */ 5557dd7cddfSDavid du Colombier 5567dd7cddfSDavid du Colombier #define STACK 8192 557