16 rowinit(Row *row, Rectangle r)
21 draw(screen, r, display->white, nil, ZP);
26 r1.max.y = r1.min.y + font->height;
28 textinit(t, fileaddtext(nil, t), r1, rfget(FALSE, FALSE, FALSE, nil), tagcols);
35 draw(screen, r1, display->black, nil, ZP);
36 textinsert(t, 0, L"Newcol Kill Putall Dump Exit ", 29, TRUE);
37 textsetselect(t, t->file->nc, t->file->nc);
41 rowadd(Row *row, Column *c, int x)
49 r.min.y = row->tag.r.max.y+Border;
50 if(x<r.min.x && row->ncol>0){ /*steal 40% of last column by default */
51 d = row->col[row->ncol-1];
52 x = d->r.min.x + 3*Dx(d->r)/5;
54 /* look for column we'll land on */
55 for(i=0; i<row->ncol; i++){
62 i++; /* new column will go after d */
66 draw(screen, r, display->white, nil, ZP);
68 r1.max.x = min(x, r.max.x-50);
70 r1.max.x = r1.min.x+50;
73 r1.max.x = r1.min.x+Border;
74 draw(screen, r1, display->black, nil, ZP);
78 c = emalloc(sizeof(Column));
85 row->col = realloc(row->col, (row->ncol+1)*sizeof(Column*));
86 memmove(row->col+i+1, row->col+i, (row->ncol-i)*sizeof(Column*));
94 rowresize(Row *row, Rectangle r)
104 r1.max.y = r1.min.y + font->height;
105 textresize(&row->tag, r1);
108 draw(screen, r1, display->black, nil, ZP);
112 for(i=0; i<row->ncol; i++){
118 r1.max.x = r1.min.x+Dx(c->r)*dx/odx;
121 r2.max.x = r2.min.x+Border;
122 draw(screen, r2, display->black, nil, ZP);
130 rowdragcol(Row *row, Column *c, int)
138 setcursor(mousectl, &boxcursor);
141 while(mouse->buttons == b)
143 setcursor(mousectl, nil);
145 while(mouse->buttons)
150 for(i=0; i<row->ncol; i++)
153 error("can't find column");
157 if((abs(p.x-op.x)<5 && abs(p.y-op.y)<5))
159 if((i>0 && p.x<row->col[i-1]->r.min.x) || (i<row->ncol-1 && p.x>c->r.max.x)){
162 rowclose(row, c, FALSE);
163 if(rowadd(row, c, p.x) == nil) /* whoops! */
164 if(rowadd(row, c, x) == nil) /* WHOOPS! */
165 if(rowadd(row, c, -1)==nil){ /* shit! */
166 rowclose(row, c, TRUE);
175 if(p.x < d->r.min.x+80+Scrollwid)
176 p.x = d->r.min.x+80+Scrollwid;
177 if(p.x > c->r.max.x-80-Scrollwid)
178 p.x = c->r.max.x-80-Scrollwid;
180 r.max.x = c->r.max.x;
181 draw(screen, r, display->white, nil, ZP);
188 draw(screen, r, display->black, nil, ZP);
190 r.max.x = c->r.max.x;
196 rowclose(Row *row, Column *c, int dofree)
201 for(i=0; i<row->ncol; i++)
204 error("can't find column");
209 memmove(row->col+i, row->col+i+1, (row->ncol-i)*sizeof(Column*));
211 row->col = realloc(row->col, row->ncol*sizeof(Column*));
213 draw(screen, r, display->white, nil, ZP);
216 if(i == row->ncol){ /* extend last column right */
218 r.min.x = c->r.min.x;
219 r.max.x = row->r.max.x;
220 }else{ /* extend next window left */
222 r.max.x = c->r.max.x;
224 draw(screen, r, display->white, nil, ZP);
229 rowwhichcol(Row *row, Point p)
234 for(i=0; i<row->ncol; i++){
236 if(ptinrect(p, c->r))
243 rowwhich(Row *row, Point p)
247 if(ptinrect(p, row->tag.all))
249 c = rowwhichcol(row, p);
251 return colwhich(c, p);
256 rowtype(Row *row, Rune r, Point p)
266 t = rowwhich(row, p);
267 if(t!=nil && !(t->what==Tag && ptinrect(p, t->scrollr))){
288 for(i=0; i<row->ncol; i++)
289 clean &= colclean(row->col[i]);
294 rowdump(Row *row, char *file)
296 int i, j, fd, m, n, dumped;
299 char *buf, *a, *fontname;
310 warning(nil, "can't find file for dump: $home not defined\n");
313 sprint(buf, "%s/acme.dump", home);
316 fd = create(file, OWRITE, 0600);
318 warning(nil, "can't open %s: %r\n", file);
321 b = emalloc(sizeof(Biobuf));
322 Binit(b, fd, OWRITE);
324 Bprint(b, "%s\n", wdir);
325 Bprint(b, "%s\n", fontnames[0]);
326 Bprint(b, "%s\n", fontnames[1]);
327 for(i=0; i<row->ncol; i++){
329 Bprint(b, "%11d", 100*(c->r.min.x-row->r.min.x)/Dx(row->r));
335 for(i=0; i<row->ncol; i++){
337 for(j=0; j<c->nw; j++)
338 c->w[j]->body.file->dumpid = 0;
340 for(i=0; i<row->ncol; i++){
342 for(j=0; j<c->nw; j++){
344 wincommit(w, &w->tag);
346 /* windows owned by others get special treatment */
347 if(w->nopen[QWevent] > 0)
348 if(w->dumpstr == nil)
350 /* zeroxes of external windows are tossed */
351 if(t->file->ntext > 1)
352 for(n=0; n<t->file->ntext; n++){
353 w1 = t->file->text[n]->w;
356 if(w1->nopen[QWevent])
360 if(t->reffont->f != font)
361 fontname = t->reffont->f->name;
363 a = runetobyte(t->file->name, t->file->nname);
368 Bprint(b, "x%11d %11d %11d %11d %11d %s\n", i, t->file->dumpid,
369 w->body.q0, w->body.q1,
370 100*(w->r.min.y-c->r.min.y)/Dy(c->r),
372 }else if(w->dumpstr){
374 Bprint(b, "e%11d %11d %11d %11d %11d %s\n", i, t->file->dumpid,
376 100*(w->r.min.y-c->r.min.y)/Dy(c->r),
378 }else if((w->dirty==FALSE && access(a, 0)==0) || w->isdir){
380 t->file->dumpid = w->id;
381 Bprint(b, "f%11d %11d %11d %11d %11d %s\n", i, w->id,
382 w->body.q0, w->body.q1,
383 100*(w->r.min.y-c->r.min.y)/Dy(c->r),
387 t->file->dumpid = w->id;
388 Bprint(b, "F%11d %11d %11d %11d %11d %11d %s\n", i, j,
389 w->body.q0, w->body.q1,
390 100*(w->r.min.y-c->r.min.y)/Dy(c->r),
391 w->body.file->nc, fontname);
394 winctlprint(w, buf, 0);
395 Bwrite(b, buf, strlen(buf));
396 m = min(RBUFSIZE, w->tag.file->nc);
397 bufread(w->tag.file, 0, r, m);
399 while(n<m && r[n]!='\n')
402 Bprint(b, "%.*S", n, r);
408 if(n > BUFSIZE/UTFmax)
410 bufread(t->file, q0, r, n);
411 Bprint(b, "%.*S", n, r);
417 Bprint(b, "%s\n%s\n", w->dumpdir, w->dumpstr);
419 Bprint(b, "\n%s\n", w->dumpstr);
435 rdline(Biobuf *b, int *linep)
439 l = Brdline(b, '\n');
446 * Get font names from load file so we don't load fonts we won't use
449 rowloadfonts(char *file)
455 b = Bopen(file, OREAD);
458 /* current directory */
459 l = Brdline(b, '\n');
464 l = Brdline(b, '\n');
467 l[Blinelen(b)-1] = 0;
468 if(*l && strcmp(l, fontnames[i])!=0){
470 fontnames[i] = estrdup(l);
478 rowload(Row *row, char *file, int initing)
480 int i, j, line, percent, y, nr, nfontr, n, ns, ndumped, dumpid, x, fd;
482 char *buf, *l, *t, *fontname;
483 Rune *r, rune, *fontr;
492 warning(nil, "can't find file for load: $home not defined\n");
495 sprint(buf, "%s/acme.dump", home);
498 b = Bopen(file, OREAD);
500 warning(nil, "can't open load file %s: %r\n", file);
503 /* current directory */
505 l = rdline(b, &line);
508 l[Blinelen(b)-1] = 0;
510 warning(nil, "can't chdir %s\n", l);
515 l = rdline(b, &line);
518 l[Blinelen(b)-1] = 0;
519 if(*l && strcmp(l, fontnames[i])!=0)
520 rfget(i, TRUE, i==0 && initing, l);
522 if(initing && row->ncol==0)
523 rowinit(row, screen->clipr);
524 l = rdline(b, &line);
531 percent = atoi(l+i*12);
532 if(percent<0 || percent>=100)
534 x = row->r.min.x+percent*Dx(row->r)/100;
544 if(Dx(r1) < 50 || Dx(r2) < 50)
546 draw(screen, Rpt(r1.min, r2.max), display->white, nil, ZP);
551 draw(screen, r2, display->black, nil, ZP);
557 l = rdline(b, &line);
563 if(Blinelen(b) < 1+5*12+1)
565 l = rdline(b, &line); /* ctl line; ignored */
568 l = rdline(b, &line); /* directory */
571 l[Blinelen(b)-1] = 0;
574 r = bytetorune("./", &nr);
576 t = emalloc(strlen(home)+1+1);
577 sprint(t, "%s/", home);
578 r = bytetorune(t, &nr);
582 r = bytetorune(l, &nr);
583 l = rdline(b, &line); /* command */
586 t = emalloc(Blinelen(b)+1);
587 memmove(t, l, Blinelen(b));
588 run(nil, t, r, nr, TRUE, nil, nil, FALSE);
589 /* r is freed in run() */
592 if(Blinelen(b) < 1+5*12+1)
598 if(Blinelen(b) < 1+6*12+1)
601 ndumped = atoi(l+1+5*12+1);
604 if(Blinelen(b) < 1+5*12+1)
608 dumpid = atoi(l+1+1*12);
613 l[Blinelen(b)-1] = 0;
617 fontr = bytetorune(fontname, &nfontr);
622 percent = atoi(l+1+4*12);
628 y = c->r.min.y+(percent*Dy(c->r))/100;
629 if(y<c->r.min.y || y>=c->r.max.y)
632 w = coladd(c, nil, nil, y);
634 w = coladd(c, nil, lookid(dumpid, TRUE), y);
638 l = rdline(b, &line);
641 l[Blinelen(b)-1] = 0;
642 r = bytetorune(l+5*12, &nr);
656 textinsert(&w->tag, w->tag.file->nc, r+n+1, nr-(n+1), TRUE);
658 /* simplest thing is to put it in a file and load that */
659 sprint(buf, "/tmp/d%d.%.4sacme", getpid(), getuser());
660 fd = create(buf, OWRITE|ORCLOSE, 0600);
663 warning(nil, "can't create temp file: %r\n");
666 bout = emalloc(sizeof(Biobuf));
667 Binit(bout, fd, OWRITE);
668 for(n=0; n<ndumped; n++){
672 if(rune == (Rune)Beof){
679 Bputrune(bout, rune);
683 textload(&w->body, 0, buf, 1);
685 w->body.file->mod = TRUE;
686 for(n=0; n<w->body.file->ntext; n++)
687 w->body.file->text[n]->w->dirty = TRUE;
689 }else if(dumpid==0 && r[ns+1]!='+' && r[ns+1]!='-')
690 get(&w->body, nil, nil, FALSE, XXX, nil, 0);
692 fontx(&w->body, nil, nil, 0, 0, fontr, nfontr);
696 if(q0>w->body.file->nc || q1>w->body.file->nc || q0>q1)
698 textshow(&w->body, q0, q1, 1);
699 w->maxlines = min(w->body.nlines, max(w->maxlines, w->body.maxlines));
706 warning(nil, "bad load file %s:%d\n", file, line);
714 allwindows(void (*f)(Window*, void*), void *arg)
719 for(i=0; i<row.ncol; i++){
721 for(j=0; j<c->nw; j++)