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