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