shithub: acme-scrolling

Download patch

ref: dc1ecd0a31eb7901848cc61483bb30eeb2426c0a
author: glenda <glenda@cirno>
date: Mon Jan 20 17:10:08 EST 2025

Adds rio-like scrolling to acme

--- /dev/null
+++ b/acme-scrolling.patch
@@ -1,0 +1,80 @@
+diff 16b36563b70e7ae6a3a81dd3267f9f204f76f444 uncommitted
+--- a/acme.c
++++ b/acme.c
+@@ -521,14 +521,13 @@
+ 			}
+ 			/* scroll buttons, wheels, etc. */
+ 			if(t->what==Body && w != nil && (m.buttons & (8|16))){
+-				if(m.buttons & 8)
+-					but = Kscrolloneup;
+-				else
+-					but = Kscrollonedown;
+-				winlock(w, 'M');
+-				t->eq0 = ~0;
+-				texttype(t, but);
+-				winunlock(w);
++            	winlock(w, 'M');
++            	t->eq0 = ~0;
++            	if(m.buttons & 8)
++                	textscroll(t, 4);
++            	else
++                	textscroll(t, 5);
++            	winunlock(w);
+ 				goto Continue;
+ 			}
+ 			if(ptinrect(m.xy, t->scrollr)){
+--- a/scrl.c
++++ b/scrl.c
+@@ -126,9 +126,12 @@
+ 			my = s.max.y;
+ 		if(but == 2){
+ 			y = my;
+-			p0 = (vlong)t->file->nc*(y-s.min.y)/h;
+-			if(p0 >= t->q1)
+-				p0 = textbacknl(t, p0, 2);
++			if(y > s.max.y-2)
++				y = s.max.y-2;
++			if(t->file->nc > 1024*1024)
++				p0 = ((t->file->nc>>10)*(y-s.min.y)/h)<<10;
++			else
++				p0 = t->file->nc*(y-s.min.y)/h;
+ 			if(oldp0 != p0)
+ 				textsetorigin(t, p0, FALSE);
+ 			oldp0 = p0;
+@@ -135,16 +138,22 @@
+ 			readmouse(mousectl);
+ 			continue;
+ 		}
+-		if(but == 1)
+-			p0 = textbacknl(t, t->org, (my-s.min.y)/t->font->height);
+-		else
+-			p0 = t->org+frcharofpt(t, Pt(s.max.x, my));
++		if(but == 1 || but == 4){
++			y = max(1, (my-s.min.y)/t->font->height);
++			p0 = textbacknl(t, t->org, y);
++		}else{
++			y = max(my, s.min.y+t->font->height);
++			p0 = t->org+frcharofpt(t, Pt(s.max.x, y));
++		}
+ 		if(oldp0 != p0)
+ 			textsetorigin(t, p0, TRUE);
+ 		oldp0 = p0;
+-		/* debounce */
++		//debounce
+ 		if(first){
+-			flushimage(display, 1);
++			if(display->bufp > display->buf)
++				flushimage(display, 1);
++			if(but > 3)
++				return;
+ 			sleep(200);
+ 			nbrecv(mousectl->c, &mousectl->Mouse);
+ 			first = FALSE;
+@@ -153,4 +162,5 @@
+ 	}while(mouse->buttons & (1<<(but-1)));
+ 	while(mouse->buttons)
+ 		readmouse(mousectl);
+-}
++
++}
+\ No newline at end of file