xref: /plan9/sys/src/cmd/acme/dat.h (revision 5ed2c76c4ae6767b76e6cf10a167e0e5a109d85d)
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