better scrolling

This commit is contained in:
rsc 2005-03-18 19:33:26 +00:00
parent 4b12db1171
commit f334d75632
2 changed files with 37 additions and 41 deletions

View file

@ -541,6 +541,9 @@ colwhich(Column *c, Point p)
return &w->tag; return &w->tag;
return &w->body; return &w->body;
} }
/* scrollr drops below w->r on low windows */
if(ptinrect(p, w->body.scrollr))
return &w->body;
} }
return nil; return nil;
} }

View file

@ -117,48 +117,41 @@ textscroll(Text *t, int but)
first = TRUE; first = TRUE;
do{ do{
flushimage(display, 1); flushimage(display, 1);
if(mouse->xy.x<s.min.x || s.max.x<=mouse->xy.x){ my = mouse->xy.y;
readmouse(mousectl); if(my < s.min.y)
}else{ my = s.min.y;
my = mouse->xy.y; if(my >= s.max.y)
if(my < s.min.y) my = s.max.y;
my = s.min.y; if(!eqpt(mouse->xy, Pt(x, my))){
if(my >= s.max.y) moveto(mousectl, Pt(x, my));
my = s.max.y; readmouse(mousectl); /* absorb event generated by moveto() */
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));
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);
} }
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, 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));
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 & (1<<(but-1)));
while(mouse->buttons) while(mouse->buttons)
readmouse(mousectl); readmouse(mousectl);