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);