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