shithub: riscv

Download patch

ref: 57362e0c8c3b75cae8f3bc2735ffc6e30e19fe03
parent: db6e26d55eb5bdb22ea231642051ff9a1562239b
author: kvik <kvik@a-b.xyz>
date: Thu Jun 11 11:33:57 EDT 2020

acme: implement position-dependent scroll-wheel scrolling

This brings acme scrolling behaviour in line with that of 9front's rio
and sam, where the amount scrolled varies with a vertical position of
the pointer within the window, similar to how the scrollbar works.

At some point it would be good to implement a line-at-a-time scrolling
when the Shift key is pressed, as seen in rio.  For this to happen the
acme keyboard input needs to be rewritten in terms of /dev/kbd instead
of relying on keyboard(2) -- that is, the /dev/cons interface.

--- a/sys/src/cmd/acme/acme.c
+++ b/sys/src/cmd/acme/acme.c
@@ -513,8 +513,13 @@
 				but = 2;
 			else if(m.buttons == 4)
 				but = 3;
+			else if(m.buttons == 8)
+				but = 4;
+			else if(m.buttons == 16)
+				but = 5;
 			barttext = t;
-			if(t->what==Body && ptinrect(m.xy, t->scrollr)){
+			if(t->what==Body && w != nil
+			&& (ptinrect(m.xy, t->scrollr) || (m.buttons & (8|16)))){
 				if(but){
 					winlock(w, 'M');
 					t->eq0 = ~0;
@@ -521,18 +526,6 @@
 					textscroll(t, but);
 					winunlock(w);
 				}
-				goto Continue;
-			}
-			/* 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);
 				goto Continue;
 			}
 			if(ptinrect(m.xy, t->scrollr)){
--- a/sys/src/cmd/acme/scrl.c
+++ b/sys/src/cmd/acme/scrl.c
@@ -132,7 +132,7 @@
 			readmouse(mousectl);
 			continue;
 		}
-		if(but == 1)
+		if(but == 1 || but == 4)
 			p0 = textbacknl(t, t->org, (my-s.min.y)/t->font->height);
 		else
 			p0 = t->org+frcharofpt(t, Pt(s.max.x, my));
@@ -140,7 +140,7 @@
 			textsetorigin(t, p0, TRUE);
 		oldp0 = p0;
 		/* debounce */
-		if(first){
+		if(first && but < 4){
 			flushimage(display, 1);
 			sleep(200);
 			nbrecv(mousectl->c, &mousectl->Mouse);