commit 20ae0b0fc25448245b75e0bd7b30b2fd29525165 from: rsc date: Fri Dec 16 15:12:38 2005 UTC Better window size management. commit - 9881c00260e55f2994ca16229cf89a7929293e49 commit + 20ae0b0fc25448245b75e0bd7b30b2fd29525165 blob - f375404f7666fbf95dbc65e70d635259836c07b9 blob + 487931ecfb345761f743c5196da158d54c8b0b8b --- src/cmd/acme/cols.c +++ src/cmd/acme/cols.c @@ -53,7 +53,7 @@ coladd(Column *c, Window *w, Window *clone, int y) { Rectangle r, r1; Window *v; - int i, t; + int i, j, minht, t; v = nil; r = c->r; @@ -74,15 +74,27 @@ coladd(Column *c, Window *w, Window *clone, int y) /* * if v's too small, grow it first. */ - if(!c->safe || v->body.fr.maxlines<=3){ + minht = v->tag.fr.font->height+Border+1; + j = 0; + while(!c->safe || v->body.fr.maxlines<=3 || Dy(v->body.all) <= minht){ + if(++j > 10){ +fprint(2, "oops: dy=%d\n", Dy(v->body.all)); + break; + } + if(j > 1) +fprint(2, "regrow\n"); colgrow(c, v, 1); - y = v->body.fr.r.min.y+Dy(v->body.fr.r)/2; } - r = v->r; if(i == c->nw) t = c->r.max.y; else t = c->w[i]->r.min.y-Border; + y = v->body.all.min.y+Dy(v->body.all)/2; + if(t - y < minht) + y = t - minht; + if(y < v->body.all.min.y) + y = v->body.all.min.y; + r = v->r; r.max.y = t; draw(screen, r, textcols[BACK], nil, ZP); r1 = r; @@ -209,6 +221,8 @@ colresize(Column *c, Rectangle r) r1.max.y = r.max.y; else r1.max.y = r1.min.y+(Dy(w->r)+Border)*Dy(r)/Dy(c->r); + if(Dy(r1) < Border+font->height) + r1.max.y = r1.min.y + Border+font->height; r2 = r1; r2.max.y = r2.min.y+Border; draw(screen, r2, display->black, nil, ZP); blob - 23a522285789b846c84ad18001c0c08e13145c5e blob + 34d561c5cb32bd753a2be9c17afd793ebceef92b --- src/cmd/acme/fns.h +++ src/cmd/acme/fns.h @@ -9,7 +9,7 @@ void warningew(Window*, Mntdir*, char*, ...); #define fbufalloc() emalloc(BUFSIZE) #define fbuffree(x) free(x) -void plumblook(Plumbmsg*m); +void plumblook(Plumbmsg *m); void plumbshow(Plumbmsg*m); void acmeputsnarf(void); void acmegetsnarf(void); blob - c22213f22a8a22fc10bd13316e74295dc185bad7 blob + 6abac6ca74a2b46101981978331f8c259836ea5a --- src/cmd/acme/look.c +++ src/cmd/acme/look.c @@ -16,7 +16,7 @@ CFid *plumbsendfid; CFid *plumbeditfid; -Window* openfile(Text*, Expand*); +Window* openfile(Text*, Expand*, int); int nuntitled; @@ -167,7 +167,7 @@ look3(Text *t, uint q0, uint q1, int external) if(expanded == FALSE) return; if(e.name || e.u.at) - openfile(t, &e); + openfile(t, &e, FALSE); else{ if(t->w == nil) return; @@ -207,6 +207,7 @@ plumblook(Plumbmsg *m) { Expand e; char *addr; + int newwindow; if(m->ndata >= BUFSIZE){ warning(nil, "insanely long file name (%d bytes) in plumb message (%.32s...)\n", m->ndata, m->data); @@ -227,7 +228,8 @@ plumblook(Plumbmsg *m) e.u.ar = bytetorune(addr, &e.a1); e.agetc = plumbgetc; } - openfile(nil, &e); + newwindow = plumblookup(m->attr, "newwindow") != nil; + openfile(nil, &e, newwindow); free(e.name); free(e.u.at); drawtopwindow(); @@ -688,7 +690,7 @@ lookid(int id, int dump) Window* -openfile(Text *t, Expand *e) +openfile(Text *t, Expand *e, int newwindow) { Range r; Window *w, *ow; @@ -705,6 +707,8 @@ openfile(Text *t, Expand *e) }else w = lookfile(e->name, e->nname); if(w){ + if(newwindow==TRUE && !w->isdir) + w = coladd(w->col, nil, w, -1); t = &w->body; if(!t->col->safe && t->fr.maxlines==0) /* window is obscured by full-column window */ colgrow(t->col, t->col->w[0], 1); @@ -785,7 +789,7 @@ new(Text *et, Text *t, Text *argt, int flag1, int flag e.nname = nf; e.bname = runetobyte(f, nf); e.jump = TRUE; - openfile(et, &e); + openfile(et, &e, FALSE); free(f); free(e.bname); arg = skipbl(a, na, &narg); blob - bceb41ee1b446ddec1a90aa12723afb47bf1289e blob + 4fb03ef9f52eb0a06899cc182f0fab8448157c04 --- src/cmd/acme/wind.c +++ src/cmd/acme/wind.c @@ -121,6 +121,7 @@ winresize(Window *w, Rectangle r, int safe, int keepex Image *b; Rectangle br, r1; +if(0) fprint(2, "winresize %d %R safe=%d keep=%d h=%d\n", w->id, r, safe, keepextra, font->height); w->tagtop = r; w->tagtop.max.y = r.min.y+font->height; @@ -128,7 +129,9 @@ winresize(Window *w, Rectangle r, int safe, int keepex r1.max.y = min(r.max.y, r1.min.y + w->taglines*font->height); y = r1.max.y; if(1 || !safe || !eqrect(w->tag.all, r1)){ +if(0) fprint(2, "resize tag %R => %R", w->tag.all, r1); textresize(&w->tag, r1, TRUE); +if(0) fprint(2, "=> %R (%R)\n", w->tag.all, w->tag.fr.r); y = w->tag.fr.r.max.y; b = button; if(w->body.file->mod && !w->isdir && !w->isscratch) @@ -141,7 +144,7 @@ winresize(Window *w, Rectangle r, int safe, int keepex r1 = r; r1.min.y = y; - if(!safe || !eqrect(w->body.all, r1)){ + if(1 || !safe || !eqrect(w->body.all, r1)){ if(y+1+w->body.fr.font->height <= r.max.y){ /* room for one line */ r1.min.y = y; r1.max.y = y+1; @@ -153,8 +156,10 @@ winresize(Window *w, Rectangle r, int safe, int keepex r1.min.y = y; r1.max.y = y; } +if(0) fprint(2, "resize body %R => %R", w->body.all, r1); w->r = r; w->r.max.y = textresize(&w->body, r1, keepextra); +if(0) fprint(2, " => %R (%R; %R)\n", w->body.all, w->body.fr.r, w->r); textscrdraw(&w->body); } w->maxlines = min(w->body.fr.nlines, max(w->maxlines, w->body.fr.maxlines));