Blob


1 enum
2 {
3 Qdir,
4 Qacme,
5 Qcons,
6 Qconsctl,
7 Qdraw,
8 Qeditout,
9 Qindex,
10 Qlabel,
11 Qnew,
13 QWaddr,
14 QWbody,
15 QWctl,
16 QWdata,
17 QWeditout,
18 QWevent,
19 QWrdsel,
20 QWwrsel,
21 QWtag,
22 QWxdata,
23 QMAX,
24 };
26 enum
27 {
28 Blockincr = 256,
29 Maxblock = 8*1024,
30 NRange = 10,
31 Infinity = 0x7FFFFFFF, /* huge value for regexp address */
32 };
34 #define Buffer AcmeBuffer
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;
57 struct Runestr
58 {
59 Rune *r;
60 int nr;
61 };
63 struct Range
64 {
65 int q0;
66 int q1;
67 };
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 } u;
77 };
79 struct Disk
80 {
81 int fd;
82 uint addr; /* length of temp file */
83 Block *free[Maxblock/Blockincr+1];
84 };
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);
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*);
111 struct Elog
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*);
126 struct File
128 Buffer b; /* 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 */
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*);
163 enum /* Text.what */
165 Columntag,
166 Rowtag,
167 Tag,
168 Body,
169 };
171 struct Text
173 File *file;
174 Frame fr;
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;
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 };
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);
226 struct Window
228 QLock lk;
229 Ref 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 };
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);
290 struct Column
292 Rectangle r;
293 Text tag;
294 Row *row;
295 Window **w;
296 int nw;
297 int safe;
298 };
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*);
312 struct Row
314 QLock lk;
315 Rectangle r;
316 Text tag;
317 Column **col;
318 int ncol;
320 };
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*);
335 struct Timer
337 int dt;
338 int cancel;
339 Channel *c; /* chan(int) */
340 Timer *next;
341 };
343 struct Command
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 };
355 struct Dirtab
357 char *name;
358 uchar type;
359 uint qid;
360 uint perm;
361 };
363 struct Mntdir
365 int id;
366 int ref;
367 Rune *dir;
368 int ndir;
369 Mntdir *next;
370 int nincl;
371 Rune **incl;
372 };
374 struct Fid
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 };
389 struct Xfid
391 void *arg; /* args to xfidinit */
392 Fcall fcall;
393 Xfid *next;
394 Channel *c; /* chan(void(*)(Xfid*)) */
395 Fid *f;
396 uchar *buf;
397 int flushed;
399 };
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);
414 struct Reffont
416 Ref ref;
417 Font *f;
419 };
420 Reffont *rfget(int, int, int, char*);
421 void rfclose(Reffont*);
423 struct Rangeset
425 Range r[NRange];
426 };
428 struct Dirlist
430 Rune *r;
431 int nr;
432 int wid;
433 };
435 struct Expand
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 } u;
447 int (*agetc)(void*, uint);
448 int a0;
449 int a1;
450 };
452 enum
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 };
464 #define QID(w,q) ((w<<8)|(q))
465 #define WIN(q) ((((ulong)(q).path)>>8) & 0xFFFFFF)
466 #define FILE(q) ((q).path & 0xFF)
468 enum
470 FALSE,
471 TRUE,
472 XXX,
473 };
475 enum
477 Empty = 0,
478 Null = '-',
479 Delete = 'd',
480 Insert = 'i',
481 Replace = 'r',
482 Filename = 'f',
483 };
485 enum /* editing */
487 Inactive = 0,
488 Inserting,
489 Collecting,
490 };
492 uint globalincref;
493 uint seq;
494 uint maxtab; /* size of a tab, in units of the '0' character */
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 Image *tagcols[NCOL];
528 Image *textcols[NCOL];
529 extern char wdir[]; /* must use extern because no dimension given */
530 int editing;
531 int erroutfd;
532 int messagesize; /* negotiated in 9P version setup */
533 int globalautoindent;
535 enum
537 Kscrolloneup = KF|0x20,
538 Kscrollonedown = KF|0x21,
539 };
541 Channel *ckeyboard; /* chan(Rune)[10] */
542 Channel *cplumb; /* chan(Plumbmsg*) */
543 Channel *cwait; /* chan(Waitmsg) */
544 Channel *ccommand; /* chan(Command*) */
545 Channel *ckill; /* chan(Rune*) */
546 Channel *cxfidalloc; /* chan(Xfid*) */
547 Channel *cxfidfree; /* chan(Xfid*) */
548 Channel *cnewwindow; /* chan(Channel*) */
549 Channel *mouseexit0; /* chan(int) */
550 Channel *mouseexit1; /* chan(int) */
551 Channel *cexit; /* chan(int) */
552 Channel *cerr; /* chan(char*) */
553 Channel *cedit; /* chan(int) */
554 Channel *cwarn; /* chan(void*)[1] (really chan(unit)[1]) */
556 #define STACK 32768