git: 9front

Download patch

ref: 4b847235a1eaa9a94d5da8ab76b91b8e659e255f
parent: 36eb768c5a6858183ea246f2f363a57cbcf3cb9d
author: rodri <rgl@antares-labs.eu>
date: Thu May 9 07:49:09 EDT 2024

vdiff: fix scrolling and mouse button handling.

vertical scrolling now works in a line-wise manner,
just like in rio(1), sam(1) and friends. horizontal
scrolling showed problems with some line widths
where they got cut before showing the last
characters.

finally, pressing LMB or RMB and swiping while going
through any of the blocks caused a storm of plumbs
and visibility toggling (when over the expander line).
this doesn't happen anymore.

--- a/sys/src/cmd/vdiff.c
+++ b/sys/src/cmd/vdiff.c
@@ -190,9 +190,9 @@
 	if(viewh < totalh){
 		h = ((double)viewh/totalh)*Dy(scrollr);
 		y = ((double)offset/totalh)*Dy(scrollr);
-		ye = scrollr.min.y + y + h - 1;
+		ye = scrollr.min.y + y + h;
 		if(ye >= scrollr.max.y)
-			ye = scrollr.max.y - 1;
+			ye = scrollr.max.y;
 		scrposr = Rect(scrollr.min.x, scrollr.min.y+y+1, scrollr.max.x-1, ye);
 	}else
 		scrposr = Rect(scrollr.min.x, scrollr.min.y, scrollr.max.x-1, scrollr.max.y);
@@ -217,7 +217,7 @@
 {
 	int max;
 
-	max = Hpadding + Margin + Hpadding + maxlength * spacew + 2 * ellipsisw - Dx(blocks[0]->r);
+	max = Dx(scrollr) + Margin + Hpadding + maxlength*spacew + 2*ellipsisw + Hpadding + Margin - Dx(blocks[0]->r)/2;
 	Δpan += off * spacew;
 	if(Δpan < 0 || max <= 0)
 		Δpan = 0;
@@ -360,7 +360,7 @@
 	else if(m.buttons == 0)
 		scrolling = 0;
 
-	n = (m.xy.y - scrollr.min.y);
+	n = (m.xy.y - viewr.min.y - Margin)/lineh * lineh;
 	if(scrolling){
 		if(m.buttons&1){
 			scroll(-n);
@@ -367,6 +367,7 @@
 			return;
 		}else if(m.buttons&2){
 			offset = (m.xy.y - scrollr.min.y) * totalh/Dy(scrollr);
+			offset = offset/lineh * lineh;
 			clampoffset();
 			redraw();
 		}else if(m.buttons&4){
@@ -377,7 +378,7 @@
 		scroll(-n);
 	}else if(m.buttons&16){
 		scroll(n);
-	}else if(m.buttons != 0 && ptinrect(m.xy, viewr)){
+	}else if((oldbuttons^m.buttons) != 0 && ptinrect(m.xy, viewr)){
 		for(i = 0; i < nblocks; i++){
 			b = blocks[i];
 			if(ptinrect(addpt(m.xy, Pt(0, offset)), b->sr)){
@@ -598,8 +599,6 @@
 	};
 	int b;
 
-	scrolling = 0;
-	oldbuttons = 0;
 	b = 0;
 	ARGBEGIN{
 	case 'b':
@@ -620,7 +619,6 @@
 	}
 	if(initdraw(nil, nil, "vdiff")<0)
 		sysfatal("initdraw: %r");
-	display->locking = 0;
 	if((mctl = initmouse(nil, screen)) == nil)
 		sysfatal("initmouse: %r");
 	if((kctl = initkeyboard(nil)) == nil)
--