aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/acme/cols.c
diff options
context:
space:
mode:
authorRuss Cox <rsc@swtch.com>2008-03-07 11:07:17 -0500
committerRuss Cox <rsc@swtch.com>2008-03-07 11:07:17 -0500
commita2db69c8bda889f30ea38dae5473689cde108458 (patch)
treed026037e56b0b584469cc200d447e4280779a367 /src/cmd/acme/cols.c
parentcb1ac4c41dd0c1bfb621685cc2f6e73c7e369f57 (diff)
downloadplan9port-a2db69c8bda889f30ea38dae5473689cde108458.tar.gz
plan9port-a2db69c8bda889f30ea38dae5473689cde108458.tar.bz2
plan9port-a2db69c8bda889f30ea38dae5473689cde108458.zip
acme: revise multiline tag code
Diffstat (limited to 'src/cmd/acme/cols.c')
-rw-r--r--src/cmd/acme/cols.c53
1 files changed, 26 insertions, 27 deletions
diff --git a/src/cmd/acme/cols.c b/src/cmd/acme/cols.c
index 31b2780f..be5a2aa8 100644
--- a/src/cmd/acme/cols.c
+++ b/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, j, minht, t;
+ int i, j, minht, ymax;
v = nil;
r = c->r;
@@ -72,31 +72,38 @@ coladd(Column *c, Window *w, Window *clone, int y)
if(i < c->nw)
i++; /* new window will go after v */
/*
- * if v's too small, grow it first.
+ * if landing window (v) is too small, grow it first.
*/
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));
+ fprint(2, "coladd: bug dy=%d\n", Dy(v->body.all));
break;
}
colgrow(c, v, 1);
}
+
+ /*
+ * figure out where to split v to make room for w
+ */
if(i == c->nw)
- t = c->r.max.y;
+ ymax = c->r.max.y;
else
- t = c->w[i]->r.min.y-Border;
+ ymax = c->w[i]->r.min.y-Border;
y = min(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;
+ y = min(y, ymax - minht);
+ y = max(y, v->body.all.min.y);
+ ymax = max(ymax, y+minht);
r = v->r;
- r.max.y = t;
+ r.max.y = ymax;
+
+ /*
+ * redraw w
+ */
draw(screen, r, textcols[BACK], nil, ZP);
r1 = r;
- y = min(y, t-(v->tag.fr.font->height*v->taglines+v->body.fr.font->height+Border+1));
+ y = min(y, ymax-(v->tag.fr.font->height*v->taglines+v->body.fr.font->height+Border+1));
r1.max.y = min(y, v->body.fr.r.min.y+v->body.fr.nlines*v->body.fr.font->height);
r1.min.y = winresize(v, r1, FALSE, FALSE);
r1.max.y = r1.min.y+Border;
@@ -151,8 +158,8 @@ colclose(Column *c, Window *w, int dofree)
windelete(w);
winclose(w);
}
- memmove(c->w+i, c->w+i+1, (c->nw-i-1)*sizeof(Window*));
c->nw--;
+ memmove(c->w+i, c->w+i+1, (c->nw-i)*sizeof(Window*));
c->w = realloc(c->w, c->nw*sizeof(Window*));
if(c->nw == 0){
draw(screen, r, display->white, nil, ZP);
@@ -219,8 +226,7 @@ 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;
+ r1.max.y = max(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);
@@ -307,7 +313,7 @@ colgrow(Column *c, Window *w, int but)
if(i==c->nw-1 || c->safe==FALSE)
r.max.y = cr.max.y;
else
- r.max.y = c->w[i+1]->r.min.y-Border;
+ r.max.y = c->w[i+1]->r.min.y - Border;
winresize(w, r, FALSE, TRUE);
return;
}
@@ -342,7 +348,7 @@ colgrow(Column *c, Window *w, int but)
}
nnl = min(onl + max(min(5, w->taglines-1+w->maxlines), onl/2), tot);
if(nnl < w->taglines-1+w->maxlines)
- nnl = (w->taglines-1+w->maxlines+nnl)/2;
+ nnl = (w->taglines-1+w->maxlines + nnl)/2;
if(nnl == 0)
nnl = 2;
dnl = nnl - onl;
@@ -400,7 +406,7 @@ colgrow(Column *c, Window *w, int but)
if(Dy(r) < Dy(w->tagtop)+1+h+Border)
r.max.y = r.min.y + Dy(w->tagtop)+1+h+Border;
/* draw window */
- winresize(w, r, c->safe, TRUE);
+ r.max.y = winresize(w, r, c->safe, i==c->nw-1);
if(i < c->nw-1){
r.min.y = r.max.y;
r.max.y += Border;
@@ -417,7 +423,7 @@ colgrow(Column *c, Window *w, int but)
r.max.y = y1+Dy(v->tagtop);
if(nl[j])
r.max.y += 1 + nl[j]*v->body.fr.font->height;
- y1 = winresize(v, r, c->safe, j+1==c->nw);
+ y1 = winresize(v, r, c->safe, j==c->nw-1);
if(j < c->nw-1){ /* no border on last window */
r.min.y = y1;
r.max.y += Border;
@@ -425,12 +431,6 @@ colgrow(Column *c, Window *w, int but)
y1 = r.max.y;
}
}
-/*
- r = w->r;
- r.min.y = y1;
- r.max.y = c->r.max.y;
- draw(screen, r, textcols[BACK], nil, ZP);
-*/
free(nl);
free(ny);
c->safe = TRUE;
@@ -465,9 +465,8 @@ coldragwin(Column *c, Window *w, int but)
error("can't find window");
Found:
-/* TAG - force recompute tag size (if in auto-expand mode) on mouse op. */
- w->taglines = 1;
-/* END TAG */
+ if(w->tagexpand) /* force recomputation of window tag size */
+ w->taglines = 1;
p = mouse->xy;
if(abs(p.x-op.x)<5 && abs(p.y-op.y)<5){
colgrow(c, w, but);