xref: /plan9-contrib/sys/src/cmd/acme/dat.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 enum
2 {
3 	Qdir,
4 	Qacme,
5 	Qcons,
6 	Qconsctl,
7 	Qindex,
8 	Qlabel,
9 	Qnew,
10 
11 	QWaddr,
12 	QWbody,
13 	QWctl,
14 	QWdata,
15 	QWevent,
16 	QWtag,
17 	QMAX,
18 };
19 
20 enum
21 {
22 	Blockincr =	256,
23 	Maxblock = 	8*1024,
24 	NRange =		10,
25 	Infinity = 		0x7FFFFFFF,	/* huge value for regexp address */
26 };
27 
28 typedef	adt	Column;
29 typedef	adt	Row;
30 typedef	adt	Text;
31 typedef	adt	Window;
32 typedef	adt	Xfid;
33 typedef	adt	Reffont;
34 typedef	aggr	Dirlist;
35 typedef	aggr	Range;
36 typedef	aggr	Mntdir;
37 
38 aggr Range
39 {
40 	int	q0;
41 	int	q1;
42 };
43 
44 aggr Block
45 {
46 	uint		addr;	/* disk address in bytes */
47 	union
48 	{
49 		uint	n;		/* number of used runes in block */
50 		Block	*next;	/* pointer to next in free list */
51 	};
52 };
53 
54 adt Disk
55 {
56 		int		fd;
57 		uint	addr;	/* length of temp file */
58 		Block	*free[Maxblock/Blockincr+1];
59 
60 		Disk*	init();
61 		Block*	new(*Disk, uint);
62 		void	release(*Disk, Block*);
63 		void	read(*Disk, Block*, Rune*, uint);
64 		void	write(*Disk, Block**, Rune*, uint);
65 };
66 
67 adt Buffer
68 {
69 extern	uint	nc;
70 		Rune	*c;		/* cache */
71 		uint	cnc;	/* bytes in cache */
72 		uint	cmax;	/* size of allocated cache */
73 		uint	cq;		/* position of cache */
74 		int		cdirty;	/* cache needs to be written */
75 		uint	cbi;	/* index of cache Block */
76 		Block	**bl;	/* array of blocks */
77 		uint	nbl;	/* number of blocks */
78 
79 		void	insert(*Buffer, uint, Rune*, uint);
80 		void	delete(*Buffer, uint, uint);
81 		uint	load(*Buffer, uint, int, int*);
82 		void	read(*Buffer, uint, Rune*, uint);
83 		void	close(*Buffer);
84 		void	reset(*Buffer);
85 intern	void	sizecache(*Buffer, uint);
86 intern	void	flush(*Buffer);
87 intern	void	setcache(*Buffer, uint);
88 intern	void	addblock(*Buffer, uint, uint);
89 intern	void	delblock(*Buffer, uint);
90 };
91 
92 adt File
93 {
94 extern	Buffer;			/* the data */
95 extern	Buffer	delta;	/* transcript of changes */
96 extern	Buffer	epsilon;/* inversion of delta for redo */
97 extern	Rune		*name;	/* name of associated file */
98 extern	int		nname;	/* size of name */
99 
100 extern	int		seq;	/* if seq==0, File acts like Buffer */
101 extern	int		mod;
102 extern	Text		*curtext;	/* most recently used associated text */
103 extern	Text		**text;	/* list of associated texts */
104 extern	int		ntext;
105 extern	int		dumpid;	/* used in dumping zeroxed windows */
106 
107 		File*	addtext(*File, Text*);
108 		void	deltext(*File, Text*);
109 		void	insert(*File, uint, Rune*, uint);
110 		void	delete(*File, uint, uint);
111 		uint	load(*File, uint, int, int*);
112 		void	setname(*File, Rune*, int);
113 		(uint, uint)	undo(*File, int, uint, uint);
114 		void	mark(*File);
115 		void	reset(*File);
116 intern	void	close(*File);
117 intern	void	undelete(*File, Buffer*, uint, uint);
118 intern	void	uninsert(*File, Buffer*, uint, uint);
119 intern	void	unsetname(*File, Buffer*);
120 };
121 
122 enum	/* Text.what */
123 {
124 	Columntag,
125 	Rowtag,
126 	Tag,
127 	Body,
128 };
129 
130 adt Text
131 {
132 extern	File		*file;
133 extern	Frame;
134 extern	Reffont	*reffont;
135 extern	uint	org;
136 extern	uint	q0;
137 extern	uint	q1;
138 extern	int	what;
139 extern	Window	*w;
140 extern	Rectangle scrollr;
141 extern	Rectangle lastsr;
142 extern	Rectangle all;
143 extern	Row		*row;
144 extern	Column	*col;
145 
146 extern	uint	eq0;	/* start of typing for ESC */
147 		uint	cq0;	/* cache position */
148 extern	int		ncache;	/* storage for insert */
149 		int		ncachealloc;
150 		Rune	*cache;
151 		int	nofill;
152 
153 		void	init(*Text, File*, Rectangle, Reffont*);
154 		void	redraw(*Text, Rectangle, Font*, Bitmap*, int);
155 		void	insert(*Text, uint, Rune*, uint, int);
156 		(uint, int)	bsinsert(*Text, uint, Rune*, uint, int);
157 		void	delete(*Text, uint, uint, int);
158 		uint	load(*Text, uint, byte*);
159 		void	type(*Text, Rune);
160 		void	select(*Text);
161 		(int, Text*)	select2(*Text, uint*, uint*);
162 		int	select3(*Text, uint*, uint*);
163 		void	setselect(*Text, uint, uint);
164 		void	show(*Text, uint, uint);
165 		void	fill(*Text);
166 		void	commit(*Text, int);
167 		void	scroll(*Text, int);
168 		void	setorigin(*Text, uint, int);
169 		void	scrdraw(*Text);
170 		Rune	readc(*Text, uint);
171 		void	reset(*Text);
172 		int	reshape(*Text, Rectangle);
173 		void	close(*Text);
174 		void	framescroll(*Text, int);
175 intern	int	select23(*Text, uint*, uint*, Bitmap*, int);
176 intern	uint	backnl(*Text, uint, uint);
177 intern	int	bswidth(*Text, Rune);
178 intern	void	doubleclick(*Text, uint*, uint*);
179 intern	int	clickmatch(*Text, int, int, int, uint*);
180 intern	void	columnate(*Text, Dirlist**, int);
181 };
182 
183 adt Window
184 {
185 		QLock;
186 		Ref;
187 extern	Text		tag;
188 extern	Text		body;
189 extern	Rectangle	r;
190 extern	byte		isdir;
191 extern	byte		isscratch;
192 extern	byte		filemenu;
193 extern	byte		dirty;
194 extern	int		id;
195 extern	Range	addr;
196 extern	Range	limit;
197 extern	byte		nopen[QMAX];
198 extern	byte		nomark;
199 extern	byte		noscroll;
200 extern	Column	*col;
201 extern	Xfid		*eventx;
202 extern	byte		*events;
203 extern	int		nevents;
204 extern	int		owner;
205 extern	int		maxlines;
206 extern	Dirlist	**dlp;
207 extern	int		ndl;
208 extern	int		putseq;
209 extern	int		nincl;
210 extern	Rune		**incl;
211 extern	Reffont	*reffont;
212 extern	QLock	ctllock;
213 extern	uint		ctlfid;
214 extern	byte		*dumpstr;
215 extern	byte		*dumpdir;
216 extern	int		dumpid;
217 
218 		void	init(*Window, Window*, Rectangle);
219 		void	lock(*Window, int);
220 		void	lock1(*Window, int);
221 		void	unlock(*Window);
222 		void	type(*Window, Text*, Rune);
223 		void	undo(*Window, int);
224 		void	setname(*Window, Rune*, int);
225 		void	settag(*Window);
226 		void	settag1(*Window);
227 		void	commit(*Window, Text*);
228 		int	reshape(*Window, Rectangle, int);
229 		void	close(*Window);
230 		void	delete(*Window);
231 		int	clean(*Window, int);
232 		void	dirfree(*Window);
233 		void	event(*Window, byte*, ...);
234 		void	mousebut(*Window);
235 		void	addincl(*Window, Rune*, int);
236 		void	cleartag(*Window);
237 		void	ctlprint(*Window, byte*);
238 };
239 
240 adt Column
241 {
242 extern	Rectangle r;
243 extern	Text	tag;
244 extern	Row		*row;
245 extern	Window	**w;
246 extern	int		nw;
247 		int		safe;
248 
249 		void	init(*Column, Rectangle);
250 		Window*	add(*Column, Window*, Window*, int);
251 		void	close(*Column, Window*, int);
252 		void	closeall(*Column);
253 		void	reshape(*Column, Rectangle);
254 		Text*	which(*Column, Point);
255 		void	dragwin(*Column, Window*, int);
256 		void	grow(*Column, Window*, int);
257 		int	clean(*Column);
258 		void	sort(*Column);
259 		void	mousebut(*Column);
260 };
261 
262 adt Row
263 {
264 		QLock;
265 extern	Rectangle r;
266 extern	Text	tag;
267 extern	Column	**col;
268 extern	int		ncol;
269 
270 		void	init(*Row, Rectangle);
271 		Column*	add(*Row, Column *c, int);
272 		void	close(*Row, Column*, int);
273 		Text*	which(*Row, Point);
274 		Column*	whichcol(*Row, Point);
275 		void	reshape(*Row, Rectangle);
276 		Text*	type(*Row, Rune, Point);
277 		void	dragcol(*Row, Column*, int but);
278 		int		clean(*Row);
279 		void		dump(*Row, byte*);
280 		void		load(*Row, byte*, int);
281 };
282 
283 aggr Timer
284 {
285 	int		dt;
286 	chan(int)	c;
287 	Timer	*next;
288 };
289 
290 aggr Command
291 {
292 	int		pid;
293 	Rune		*name;
294 	int		nname;
295 	byte		*text;
296 	byte		**av;
297 	Mntdir	*md;
298 	Command	*next;
299 };
300 
301 aggr Dirtab
302 {
303 	byte	*name;
304 	uint	qid;
305 	uint	perm;
306 };
307 
308 aggr Mntdir
309 {
310 	int		id;
311 	int		ref;
312 	Rune		*dir;
313 	int		ndir;
314 	Mntdir	*next;
315 	int		nincl;
316 	Rune		**incl;
317 };
318 
319 aggr Fid
320 {
321 	uint		fid;
322 	int		busy;
323 	int		open;
324 	Qid		qid;
325 	Window	*w;
326 	Dirtab	*dir;
327 	Fid		*next;
328 	Mntdir	*mntdir;
329 	int		nrpart;
330 	byte		rpart[UTFmax];
331 };
332 
333 adt Xfid
334 {
335 		uint	tid;
336 extern	Fcall;
337 extern	Xfid	*next;
338 extern	chan(void(*)(Xfid*))	c;
339 extern	Fid	*f;
340 extern	byte	*buf;
341 		int	flushed;
342 
343 		void		ctl(*Xfid);
344 		void		flush(*Xfid);
345 		void		walk(*Xfid);
346 		void		open(*Xfid);
347 		void		close(*Xfid);
348 		void		read(*Xfid);
349 		void		write(*Xfid);
350 
351 		void		ctlwrite(*Xfid, Window*);
352 		void		eventread(*Xfid, Window*);
353 		void		eventwrite(*Xfid, Window*);
354 		void		indexread(*Xfid);
355 		void		utfread(*Xfid, Text*, uint, uint);
356 		int		runeread(*Xfid, Text*, uint, uint);
357 };
358 
359 adt
360 Reffont
361 {
362 		Ref;
363 extern	Font		*f;
364 
365 		Reffont*	get(int, int, int, byte*);
366 		void		close(*Reffont);
367 };
368 
369 aggr Rangeset
370 {
371 	Range	r[NRange];
372 };
373 
374 aggr Dirlist
375 {
376 	Rune	*r;
377 	int		nr;
378 	int		wid;
379 };
380 
381 aggr Expand
382 {
383 	uint	q0;
384 	uint	q1;
385 	Rune	*name;
386 	int	nname;
387 	byte	*bname;
388 	int	jump;
389 	Text	*at;
390 	int	a0;
391 	int	a1;
392 };
393 
394 enum
395 {
396 	/* fbufalloc() guarantees room off end of BUFSIZE */
397 	BUFSIZE = MAXRPC,	/* size from fbufalloc() */
398 	RBUFSIZE = BUFSIZE/sizeof(Rune),
399 	EVENTSIZE = 256,
400 	Scrollwid = 12,	/* width of scroll bar */
401 	Scrollgap = 4,	/* gap right of scroll bar */
402 	Margin = 4,	/* margin around text */
403 	Border = 2,	/* line between rows, cols, windows */
404 	Maxtab = 4,	/* size of a tab, in units of the '0' character */
405 };
406 
407 #define	QID(w,q)	((w<<8)|(q))
408 #define	WIN(q)	((((q).path&~CHDIR)>>8) & 0xFFFFFF)
409 #define	FILE(q)	((q).path & 0xFF)
410 
411 enum
412 {
413 	FALSE,
414 	TRUE,
415 	XXX,
416 };
417 
418 enum
419 {
420 	Null		= '-',
421 	Delete	= 'd',
422 	Insert	= 'i',
423 	Filename	= 'f',
424 };
425 
426 uint		seq;
427 
428 Mouse		mouse;
429 Bitmap		*darkgrey;
430 Bitmap		*lightgrey;
431 Reffont		reffont;
432 Bitmap		*modbutton;
433 Bitmap		*colbutton;
434 Bitmap		*button;
435 Cursor		boxcursor;
436 Row			row;
437 int			timerpid;
438 Disk			*disk;
439 Text			*seltext;
440 Text			*argtext;
441 Text			*mousetext;	/* global because Text.close needs to clear it */
442 Text			*typetext;		/* global because Text.close needs to clear it */
443 Text			*barttext;		/* shared between mousetask and keyboardtask */
444 int			bartflag;
445 Column		*activecol;
446 Rectangle		nullrect;
447 int			fsyspid;
448 byte			*cputype;
449 byte			*objtype;
450 byte			*home;
451 byte			*fontnames[2];
452 
453 chan(Rune)[10]	ckeyboard;
454 chan(Mouse)		cmouse;
455 chan(Waitmsg)	cwait;
456 chan(Command*)	ccommand;
457 chan(Rune*)	ckill;
458 chan(Xfid*)	cxfidalloc;
459 chan(Xfid*)	cxfidfree;
460 chan(int)		*mouseexit0;
461 chan(int)		*mouseexit1;
462 chan(byte*)	cerr;
463