xref: /plan9/sys/src/cmd/acme/dat.h (revision 6b8bc68243dff965faa99f64fe710965ebee6f8f)
1 enum
2 {
3 	Qdir,
4 	Qacme,
5 	Qcons,
6 	Qconsctl,
7 	Qdraw,
8 	Qeditout,
9 	Qindex,
10 	Qlabel,
11 	Qnew,
12 
13 	QWaddr,
14 	QWbody,
15 	QWctl,
16 	QWdata,
17 	QWeditout,
18 	QWerrors,
19 	QWevent,
20 	QWrdsel,
21 	QWwrsel,
22 	QWtag,
23 	QWxdata,
24 	QMAX,
25 };
26 
27 enum
28 {
29 	Blockincr =	256,
30 	Maxblock = 	8*1024,
31 	NRange =		10,
32 	Infinity = 		0x7FFFFFFF,	/* huge value for regexp address */
33 };
34 
35 typedef	struct	Block Block;
36 typedef	struct	Buffer Buffer;
37 typedef	struct	Command Command;
38 typedef	struct	Column Column;
39 typedef	struct	Dirlist Dirlist;
40 typedef	struct	Dirtab Dirtab;
41 typedef	struct	Disk Disk;
42 typedef	struct	Expand Expand;
43 typedef	struct	Fid Fid;
44 typedef	struct	File File;
45 typedef	struct	Elog Elog;
46 typedef	struct	Mntdir Mntdir;
47 typedef	struct	Range Range;
48 typedef	struct	Rangeset Rangeset;
49 typedef	struct	Reffont Reffont;
50 typedef	struct	Row Row;
51 typedef	struct	Runestr Runestr;
52 typedef	struct	Text Text;
53 typedef	struct	Timer Timer;
54 typedef	struct	Window Window;
55 typedef	struct	Xfid Xfid;
56 
57 struct Runestr
58 {
59 	Rune	*r;
60 	int	nr;
61 };
62 
63 struct Range
64 {
65 	int	q0;
66 	int	q1;
67 };
68 
69 struct Block
70 {
71 	uint		addr;	/* disk address in bytes */
72 	union
73 	{
74 		uint	n;		/* number of used runes in block */
75 		Block	*next;	/* pointer to next in free list */
76 	};
77 };
78 
79 struct Disk
80 {
81 	int		fd;
82 	uint		addr;	/* length of temp file */
83 	Block	*free[Maxblock/Blockincr+1];
84 };
85 
86 Disk*	diskinit(void);
87 Block*	disknewblock(Disk*, uint);
88 void		diskrelease(Disk*, Block*);
89 void		diskread(Disk*, Block*, Rune*, uint);
90 void		diskwrite(Disk*, Block**, Rune*, uint);
91 
92 struct Buffer
93 {
94 	uint	nc;
95 	Rune	*c;			/* cache */
96 	uint	cnc;			/* bytes in cache */
97 	uint	cmax;		/* size of allocated cache */
98 	uint	cq;			/* position of cache */
99 	int		cdirty;	/* cache needs to be written */
100 	uint	cbi;			/* index of cache Block */
101 	Block	**bl;		/* array of blocks */
102 	uint	nbl;			/* number of blocks */
103 };
104 void		bufinsert(Buffer*, uint, Rune*, uint);
105 void		bufdelete(Buffer*, uint, uint);
106 uint		bufload(Buffer*, uint, int, int*);
107 void		bufread(Buffer*, uint, Rune*, uint);
108 void		bufclose(Buffer*);
109 void		bufreset(Buffer*);
110 
111 struct Elog
112 {
113 	short	type;		/* Delete, Insert, Filename */
114 	uint		q0;		/* location of change (unused in f) */
115 	uint		nd;		/* number of deleted characters */
116 	uint		nr;		/* # runes in string or file name */
117 	Rune		*r;
118 };
119 void	elogterm(File*);
120 void	elogclose(File*);
121 void	eloginsert(File*, int, Rune*, int);
122 void	elogdelete(File*, int, int);
123 void	elogreplace(File*, int, int, Rune*, int);
124 void	elogapply(File*);
125 
126 struct File
127 {
128 	Buffer;			/* the data */
129 	Buffer	delta;	/* transcript of changes */
130 	Buffer	epsilon;	/* inversion of delta for redo */
131 	Buffer	*elogbuf;	/* log of pending editor changes */
132 	Elog		elog;		/* current pending change */
133 	Rune		*name;	/* name of associated file */
134 	int		nname;	/* size of name */
135 	uvlong	qidpath;	/* of file when read */
136 	uint		mtime;	/* of file when read */
137 	int		dev;		/* of file when read */
138 	int		unread;	/* file has not been read from disk */
139 	int		editclean;	/* mark clean after edit command */
140 
141 	int		seq;		/* if seq==0, File acts like Buffer */
142 	int		mod;
143 	Text		*curtext;	/* most recently used associated text */
144 	Text		**text;	/* list of associated texts */
145 	int		ntext;
146 	int		dumpid;	/* used in dumping zeroxed windows */
147 };
148 File*		fileaddtext(File*, Text*);
149 void		fileclose(File*);
150 void		filedelete(File*, uint, uint);
151 void		filedeltext(File*, Text*);
152 void		fileinsert(File*, uint, Rune*, uint);
153 uint		fileload(File*, uint, int, int*);
154 void		filemark(File*);
155 void		filereset(File*);
156 void		filesetname(File*, Rune*, int);
157 void		fileundelete(File*, Buffer*, uint, uint);
158 void		fileuninsert(File*, Buffer*, uint, uint);
159 void		fileunsetname(File*, Buffer*);
160 void		fileundo(File*, int, uint*, uint*);
161 uint		fileredoseq(File*);
162 
163 enum	/* Text.what */
164 {
165 	Columntag,
166 	Rowtag,
167 	Tag,
168 	Body,
169 };
170 
171 struct Text
172 {
173 	File		*file;
174 	Frame;
175 	Reffont	*reffont;
176 	uint	org;
177 	uint	q0;
178 	uint	q1;
179 	int	what;
180 	int	tabstop;
181 	Window	*w;
182 	Rectangle scrollr;
183 	Rectangle lastsr;
184 	Rectangle all;
185 	Row		*row;
186 	Column	*col;
187 
188 	uint	eq0;	/* start of typing for ESC */
189 	uint	cq0;	/* cache position */
190 	int		ncache;	/* storage for insert */
191 	int		ncachealloc;
192 	Rune	*cache;
193 	int	nofill;
194 };
195 
196 uint		textbacknl(Text*, uint, uint);
197 uint		textbsinsert(Text*, uint, Rune*, uint, int, int*);
198 int		textbswidth(Text*, Rune);
199 int		textclickmatch(Text*, int, int, int, uint*);
200 void		textclose(Text*);
201 void		textcolumnate(Text*, Dirlist**, int);
202 void		textcommit(Text*, int);
203 void		textconstrain(Text*, uint, uint, uint*, uint*);
204 void		textdelete(Text*, uint, uint, int);
205 void		textdoubleclick(Text*, uint*, uint*);
206 void		textfill(Text*);
207 void		textframescroll(Text*, int);
208 void		textinit(Text*, File*, Rectangle, Reffont*, Image**);
209 void		textinsert(Text*, uint, Rune*, uint, int);
210 uint		textload(Text*, uint, char*, int);
211 Rune		textreadc(Text*, uint);
212 void		textredraw(Text*, Rectangle, Font*, Image*, int);
213 void		textreset(Text*);
214 int		textresize(Text*, Rectangle);
215 void		textscrdraw(Text*);
216 void		textscroll(Text*, int);
217 void		textselect(Text*);
218 int		textselect2(Text*, uint*, uint*, Text**);
219 int		textselect23(Text*, uint*, uint*, Image*, int);
220 int		textselect3(Text*, uint*, uint*);
221 void		textsetorigin(Text*, uint, int);
222 void		textsetselect(Text*, uint, uint);
223 void		textshow(Text*, uint, uint, int);
224 void		texttype(Text*, Rune);
225 
226 struct Window
227 {
228 		QLock;
229 		Ref;
230 	Text		tag;
231 	Text		body;
232 	Rectangle	r;
233 	uchar	isdir;
234 	uchar	isscratch;
235 	uchar	filemenu;
236 	uchar	dirty;
237 	uchar	autoindent;
238 	int		id;
239 	Range	addr;
240 	Range	limit;
241 	uchar	nopen[QMAX];
242 	uchar	nomark;
243 	uchar	noscroll;
244 	Range	wrselrange;
245 	int		rdselfd;
246 	int		neditwrsel;
247 	Column	*col;
248 	Xfid		*eventx;
249 	char		*events;
250 	int		nevents;
251 	int		owner;
252 	int		maxlines;
253 	Dirlist	**dlp;
254 	int		ndl;
255 	int		putseq;
256 	int		nincl;
257 	Rune		**incl;
258 	Reffont	*reffont;
259 	QLock	ctllock;
260 	uint		ctlfid;
261 	char		*dumpstr;
262 	char		*dumpdir;
263 	int		dumpid;
264 	int		utflastqid;
265 	int		utflastboff;
266 	int		utflastq;
267 };
268 
269 void	wininit(Window*, Window*, Rectangle);
270 void	winlock(Window*, int);
271 void	winlock1(Window*, int);
272 void	winunlock(Window*);
273 void	wintype(Window*, Text*, Rune);
274 void	winundo(Window*, int);
275 void	winsetname(Window*, Rune*, int);
276 void	winsettag(Window*);
277 void	winsettag1(Window*);
278 void	wincommit(Window*, Text*);
279 int	winresize(Window*, Rectangle, int);
280 void	winclose(Window*);
281 void	windelete(Window*);
282 int	winclean(Window*, int);
283 void	windirfree(Window*);
284 void	winevent(Window*, char*, ...);
285 void	winmousebut(Window*);
286 void	winaddincl(Window*, Rune*, int);
287 void	wincleartag(Window*);
288 char	*winctlprint(Window*, char*, int);
289 
290 struct Column
291 {
292 	Rectangle r;
293 	Text	tag;
294 	Row		*row;
295 	Window	**w;
296 	int		nw;
297 	int		safe;
298 };
299 
300 void		colinit(Column*, Rectangle);
301 Window*	coladd(Column*, Window*, Window*, int);
302 void		colclose(Column*, Window*, int);
303 void		colcloseall(Column*);
304 void		colresize(Column*, Rectangle);
305 Text*	colwhich(Column*, Point);
306 void		coldragwin(Column*, Window*, int);
307 void		colgrow(Column*, Window*, int);
308 int		colclean(Column*);
309 void		colsort(Column*);
310 void		colmousebut(Column*);
311 
312 struct Row
313 {
314 	QLock;
315 	Rectangle r;
316 	Text	tag;
317 	Column	**col;
318 	int		ncol;
319 
320 };
321 
322 void		rowinit(Row*, Rectangle);
323 Column*	rowadd(Row*, Column *c, int);
324 void		rowclose(Row*, Column*, int);
325 Text*	rowwhich(Row*, Point);
326 Column*	rowwhichcol(Row*, Point);
327 void		rowresize(Row*, Rectangle);
328 Text*	rowtype(Row*, Rune, Point);
329 void		rowdragcol(Row*, Column*, int but);
330 int		rowclean(Row*);
331 void		rowdump(Row*, char*);
332 int		rowload(Row*, char*, int);
333 void		rowloadfonts(char*);
334 
335 struct Timer
336 {
337 	int		dt;
338 	int		cancel;
339 	Channel	*c;	/* chan(int) */
340 	Timer	*next;
341 };
342 
343 struct Command
344 {
345 	int		pid;
346 	Rune		*name;
347 	int		nname;
348 	char		*text;
349 	char		**av;
350 	int		iseditcmd;
351 	Mntdir	*md;
352 	Command	*next;
353 };
354 
355 struct Dirtab
356 {
357 	char	*name;
358 	uchar	type;
359 	uint	qid;
360 	uint	perm;
361 };
362 
363 struct Mntdir
364 {
365 	int		id;
366 	int		ref;
367 	Rune		*dir;
368 	int		ndir;
369 	Mntdir	*next;
370 	int		nincl;
371 	Rune		**incl;
372 };
373 
374 struct Fid
375 {
376 	int		fid;
377 	int		busy;
378 	int		open;
379 	Qid		qid;
380 	Window	*w;
381 	Dirtab	*dir;
382 	Fid		*next;
383 	Mntdir	*mntdir;
384 	int		nrpart;
385 	uchar	rpart[UTFmax];
386 };
387 
388 
389 struct Xfid
390 {
391 	void		*arg;	/* args to xfidinit */
392 	Fcall;
393 	Xfid	*next;
394 	Channel	*c;		/* chan(void(*)(Xfid*)) */
395 	Fid	*f;
396 	uchar	*buf;
397 	int	flushed;
398 
399 };
400 
401 void		xfidctl(void *);
402 void		xfidflush(Xfid*);
403 void		xfidopen(Xfid*);
404 void		xfidclose(Xfid*);
405 void		xfidread(Xfid*);
406 void		xfidwrite(Xfid*);
407 void		xfidctlwrite(Xfid*, Window*);
408 void		xfideventread(Xfid*, Window*);
409 void		xfideventwrite(Xfid*, Window*);
410 void		xfidindexread(Xfid*);
411 void		xfidutfread(Xfid*, Text*, uint, int);
412 int		xfidruneread(Xfid*, Text*, uint, uint);
413 
414 struct Reffont
415 {
416 	Ref;
417 	Font		*f;
418 
419 };
420 Reffont	*rfget(int, int, int, char*);
421 void		rfclose(Reffont*);
422 
423 struct Rangeset
424 {
425 	Range	r[NRange];
426 };
427 
428 struct Dirlist
429 {
430 	Rune	*r;
431 	int		nr;
432 	int		wid;
433 };
434 
435 struct Expand
436 {
437 	uint	q0;
438 	uint	q1;
439 	Rune	*name;
440 	int	nname;
441 	char	*bname;
442 	int	jump;
443 	union{
444 		Text	*at;
445 		Rune	*ar;
446 	};
447 	int	(*agetc)(void*, uint);
448 	int	a0;
449 	int	a1;
450 };
451 
452 enum
453 {
454 	/* fbufalloc() guarantees room off end of BUFSIZE */
455 	BUFSIZE = Maxblock+IOHDRSZ,	/* size from fbufalloc() */
456 	RBUFSIZE = BUFSIZE/sizeof(Rune),
457 	EVENTSIZE = 256,
458 	Scrollwid = 12,	/* width of scroll bar */
459 	Scrollgap = 4,	/* gap right of scroll bar */
460 	Margin = 4,	/* margin around text */
461 	Border = 2,	/* line between rows, cols, windows */
462 };
463 
464 #define	QID(w,q)	((w<<8)|(q))
465 #define	WIN(q)	((((ulong)(q).path)>>8) & 0xFFFFFF)
466 #define	FILE(q)	((q).path & 0xFF)
467 
468 enum
469 {
470 	FALSE,
471 	TRUE,
472 	XXX,
473 };
474 
475 enum
476 {
477 	Empty	= 0,
478 	Null		= '-',
479 	Delete	= 'd',
480 	Insert	= 'i',
481 	Replace	= 'r',
482 	Filename	= 'f',
483 };
484 
485 enum	/* editing */
486 {
487 	Inactive	= 0,
488 	Inserting,
489 	Collecting,
490 };
491 
492 uint		globalincref;
493 uint		seq;
494 uint		maxtab;	/* size of a tab, in units of the '0' character */
495 
496 Display		*display;
497 Image		*screen;
498 Font			*font;
499 Mouse		*mouse;
500 Mousectl		*mousectl;
501 Keyboardctl	*keyboardctl;
502 Reffont		reffont;
503 Image		*modbutton;
504 Image		*colbutton;
505 Image		*button;
506 Image		*but2col;
507 Image		*but3col;
508 Cursor		boxcursor;
509 Row			row;
510 int			timerpid;
511 Disk			*disk;
512 Text			*seltext;
513 Text			*argtext;
514 Text			*mousetext;	/* global because Text.close needs to clear it */
515 Text			*typetext;		/* global because Text.close needs to clear it */
516 Text			*barttext;		/* shared between mousetask and keyboardthread */
517 int			bartflag;
518 Window		*activewin;
519 Column		*activecol;
520 Buffer		snarfbuf;
521 Rectangle		nullrect;
522 int			fsyspid;
523 char			*cputype;
524 char			*objtype;
525 char			*home;
526 char			*fontnames[2];
527 char			acmeerrorfile[128];
528 Image		*tagcols[NCOL];
529 Image		*textcols[NCOL];
530 int			plumbsendfd;
531 int			plumbeditfd;
532 char			wdir[];
533 int			editing;
534 int			messagesize;		/* negotiated in 9P version setup */
535 int			globalautoindent;
536 
537 enum
538 {
539 	Kscrolloneup		= KF|0x20,
540 	Kscrollonedown	= KF|0x21,
541 };
542 
543 Channel	*ckeyboard;	/* chan(Rune)[10] */
544 Channel	*cplumb;		/* chan(Plumbmsg*) */
545 Channel	*cwait;		/* chan(Waitmsg) */
546 Channel	*ccommand;	/* chan(Command*) */
547 Channel	*ckill;		/* chan(Rune*) */
548 Channel	*cxfidalloc;	/* chan(Xfid*) */
549 Channel	*cxfidfree;	/* chan(Xfid*) */
550 Channel	*cnewwindow;	/* chan(Channel*) */
551 Channel	*mouseexit0;	/* chan(int) */
552 Channel	*mouseexit1;	/* chan(int) */
553 Channel	*cexit;		/* chan(int) */
554 Channel	*cerr;		/* chan(char*) */
555 Channel	*cedit;		/* chan(int) */
556 Channel	*cwarn;		/* chan(void*)[1] (really chan(unit)[1]) */
557 
558 #define	STACK	8192
559