Commit Diff


commit - 4b12db117158b9dfd739d0bcbb1a2837663961c1
commit + f334d7563298445ff07b1317a98150ed393769c0
blob - 6ad3058ee09f622a0947a5555f2db61fb6685bbb
blob + fc9ceb56e421c0ec3a15e3b38475c78810dac0c5
--- src/cmd/acme/cols.c
+++ src/cmd/acme/cols.c
@@ -541,6 +541,9 @@ colwhich(Column *c, Point p)
 				return &w->tag;
 			return &w->body;
 		}
+		/* scrollr drops below w->r on low windows */
+		if(ptinrect(p, w->body.scrollr))
+			return &w->body;
 	}
 	return nil;
 }
blob - 77aa0f856079394d3437b881ea053ab2cfabf01b
blob + 02340cc651338e674f72bc4d5246bda2655d7f06
--- src/cmd/acme/scrl.c
+++ src/cmd/acme/scrl.c
@@ -117,48 +117,41 @@ textscroll(Text *t, int but)
 	first = TRUE;
 	do{
 		flushimage(display, 1);
-		if(mouse->xy.x<s.min.x || s.max.x<=mouse->xy.x){
-			readmouse(mousectl);
-		}else{
-			my = mouse->xy.y;
-			if(my < s.min.y)
-				my = s.min.y;
-			if(my >= s.max.y)
-				my = s.max.y;
-			if(!eqpt(mouse->xy, Pt(x, my))){
-				moveto(mousectl, Pt(x, my));
-				readmouse(mousectl);		/* absorb event generated by moveto() */
-			}
-			if(but == 2){
-				y = my;
-				if(y > s.max.y-2)
-					y = s.max.y-2;
-				if(t->file->b.nc > 1024*1024)
-					p0 = ((t->file->b.nc>>10)*(y-s.min.y)/h)<<10;
-				else
-					p0 = t->file->b.nc*(y-s.min.y)/h;
-				if(oldp0 != p0)
-					textsetorigin(t, p0, FALSE);
-				oldp0 = p0;
-				readmouse(mousectl);
-				continue;
-			}
-			if(but == 1)
-				p0 = textbacknl(t, t->org, (my-s.min.y)/t->fr.font->height);
-			else
-				p0 = t->org+frcharofpt(&t->fr, Pt(s.max.x, my));
+		my = mouse->xy.y;
+		if(my < s.min.y)
+			my = s.min.y;
+		if(my >= s.max.y)
+			my = s.max.y;
+		if(!eqpt(mouse->xy, Pt(x, my))){
+			moveto(mousectl, Pt(x, my));
+			readmouse(mousectl);		/* absorb event generated by moveto() */
+		}
+		if(but == 2){
+			y = my;
+			p0 = (vlong)t->file->b.nc*(y-s.min.y)/h;
+			if(p0 >= t->q1)
+				p0 = textbacknl(t, p0, 2);
 			if(oldp0 != p0)
-				textsetorigin(t, p0, TRUE);
+				textsetorigin(t, p0, FALSE);
 			oldp0 = p0;
-			/* debounce */
-			if(first){
-				flushimage(display, 1);
-				sleep(200);
-				nbrecv(mousectl->c, &mousectl->m);
-				first = FALSE;
-			}
-			scrsleep(80);
+			readmouse(mousectl);
+			continue;
 		}
+		if(but == 1)
+			p0 = textbacknl(t, t->org, (my-s.min.y)/t->fr.font->height);
+		else
+			p0 = t->org+frcharofpt(&t->fr, Pt(s.max.x, my));
+		if(oldp0 != p0)
+			textsetorigin(t, p0, TRUE);
+		oldp0 = p0;
+		/* debounce */
+		if(first){
+			flushimage(display, 1);
+			sleep(200);
+			nbrecv(mousectl->c, &mousectl->m);
+			first = FALSE;
+		}
+		scrsleep(80);
 	}while(mouse->buttons & (1<<(but-1)));
 	while(mouse->buttons)
 		readmouse(mousectl);