diff options
author | rsc <devnull@localhost> | 2005-10-31 18:39:19 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2005-10-31 18:39:19 +0000 |
commit | 33dc4226a8c21e640bc1b4d7c56f41e2f0bdcc3f (patch) | |
tree | 0aaddf63eab7398ec2d0cdf3a57296770f1c3c09 /src/cmd/acme/wind.c | |
parent | a47fbb16412bbec1507d00be3cade04cce2536fe (diff) | |
download | plan9port-33dc4226a8c21e640bc1b4d7c56f41e2f0bdcc3f.tar.gz plan9port-33dc4226a8c21e640bc1b4d7c56f41e2f0bdcc3f.tar.bz2 plan9port-33dc4226a8c21e640bc1b4d7c56f41e2f0bdcc3f.zip |
Cleanup in preparation for multiline tags.
Diffstat (limited to 'src/cmd/acme/wind.c')
-rw-r--r-- | src/cmd/acme/wind.c | 78 |
1 files changed, 54 insertions, 24 deletions
diff --git a/src/cmd/acme/wind.c b/src/cmd/acme/wind.c index 2f015feb..84c518e8 100644 --- a/src/cmd/acme/wind.c +++ b/src/cmd/acme/wind.c @@ -23,6 +23,7 @@ wininit(Window *w, Window *clone, Rectangle r) int nc; w->tag.w = w; + w->taglines = 1; w->body.w = w; w->id = ++winid; incref(&w->ref); @@ -31,7 +32,11 @@ wininit(Window *w, Window *clone, Rectangle r) w->ctlfid = ~0; w->utflastqid = -1; r1 = r; - r1.max.y = r1.min.y + font->height; + + w->tagtop = r; + w->tagtop.max.y = r.min.y + font->height; + + r1.max.y = r1.min.y + w->taglines*font->height; incref(&reffont.ref); f = fileaddtext(nil, &w->tag); textinit(&w->tag, f, r1, &reffont, tagcols); @@ -49,7 +54,7 @@ wininit(Window *w, Window *clone, Rectangle r) } //assert(w->body.w == w); r1 = r; - r1.min.y += font->height + 1; + r1.min.y += w->taglines*font->height + 1; if(r1.max.y < r1.min.y) r1.max.y = r1.min.y; f = nil; @@ -69,7 +74,6 @@ wininit(Window *w, Window *clone, Rectangle r) draw(screen, r1, tagcols[BORD], nil, ZP); textscrdraw(&w->body); w->r = r; - w->r.max.y = w->body.fr.r.max.y; br.min = w->tag.scrollr.min; br.max.x = br.min.x + Dx(button->r); br.max.y = br.min.y + Dy(button->r); @@ -86,19 +90,45 @@ wininit(Window *w, Window *clone, Rectangle r) } } +/* + * Compute number of tag lines required + * to display entire tag text. + */ +int +wintaglines(Window *w, Rectangle r) +{ + int n; + Rune rune; + + if(!w->tagexpand) + return 1; + w->tag.fr.noredraw = 1; + textresize(&w->tag, r, TRUE); + w->tag.fr.noredraw = 0; + if(w->tag.fr.nlines >= w->tag.fr.maxlines) + return w->tag.fr.maxlines; + n = w->tag.fr.nlines; + bufread(&w->tag.file->b, w->tag.file->b.nc-1, &rune, 1); + if(rune == '\n') + n++; + return n; +} + int -winresize(Window *w, Rectangle r, int safe) +winresize(Window *w, Rectangle r, int safe, int keepextra) { - Rectangle r1; int y; Image *b; - Rectangle br; + Rectangle br, r1; + + w->tagtop = r; + w->tagtop.max.y = r.min.y+font->height; r1 = r; - r1.max.y = r1.min.y + font->height; + r1.max.y = min(r.max.y, r1.min.y + w->taglines*font->height); y = r1.max.y; - if(!safe || !eqrect(w->tag.fr.r, r1)){ - y = textresize(&w->tag, r1); + if(1 || !safe || !eqrect(w->tag.fr.r, r1)){ + y = textresize(&w->tag, r1, TRUE); b = button; if(w->body.file->mod && !w->isdir && !w->isscratch) b = modbutton; @@ -107,24 +137,23 @@ winresize(Window *w, Rectangle r, int safe) br.max.y = br.min.y + Dy(b->r); draw(screen, br, b, nil, b->r.min); } - if(!safe || !eqrect(w->body.fr.r, r1)){ - if(y+1+font->height > r.max.y){ /* no body */ + + r1 = r; + r1.min.y = y; + if(1 || !safe || !eqrect(w->body.fr.r, 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; + draw(screen, r1, tagcols[BORD], nil, ZP); + y++; + r1.min.y = min(y, r.max.y); + r1.max.y = r.max.y; + }else{ r1.min.y = y; r1.max.y = y; - textresize(&w->body, r1); - w->r = r; - w->r.max.y = y; - return y; } - r1 = r; - r1.min.y = y; - r1.max.y = y + 1; - draw(screen, r1, tagcols[BORD], nil, ZP); - r1.min.y = y + 1; - r1.max.y = r.max.y; - y = textresize(&w->body, r1); w->r = r; - w->r.max.y = y; + w->r.max.y = textresize(&w->body, r1, keepextra); textscrdraw(&w->body); } w->maxlines = min(w->body.fr.nlines, max(w->maxlines, w->body.fr.maxlines)); @@ -173,7 +202,8 @@ winunlock(Window *w) void winmousebut(Window *w) { - moveto(mousectl, divpt(addpt(w->tag.scrollr.min, w->tag.scrollr.max), 2)); + moveto(mousectl, addpt(w->tag.scrollr.min, + divpt(Pt(Dx(w->tag.scrollr), font->height), 2))); } void |