acme: scrolling fixes + new home/end

Home and End previously navigated between
two different window locations: the top and
the bottom of the text.  Now they include a
third waypoint: the location where typing last
happened.  Thus, in a win window, typing
	ls -l
	<home>
scrolls to the beginning of the ls -l output.
A second <home> continues to the top of the file.

Makes Send scroll always, along with writes by
external programs to +Errors.

R=r
CC=mccoyst
http://codereview.appspot.com/4830051
This commit is contained in:
Russ Cox 2011-08-02 07:44:11 -04:00
parent 67afaf385a
commit 76864eb6cd
4 changed files with 32 additions and 5 deletions

View file

@ -395,6 +395,14 @@ xfidread(Xfid *x)
winunlock(w);
}
static int
shouldscroll(Text *t, uint q0, int qid)
{
if(qid == Qcons)
return TRUE;
return t->org <= q0 && q0 <= t->org+t->fr.nchars;
}
void
xfidwrite(Xfid *x)
{
@ -510,7 +518,7 @@ xfidwrite(Xfid *x)
if(tq1 >= q0)
tq1 += nr;
textsetselect(t, tq0, tq1);
if(t->org <= q0 && q0 <= t->org+t->fr.nchars)
if(shouldscroll(t, q0, qid))
textshow(t, q0+nr, q0+nr, 0);
textscrdraw(t);
winsettag(w);
@ -568,7 +576,7 @@ xfidwrite(Xfid *x)
}
q0 = textbsinsert(t, q0, r, nr, TRUE, &nr);
textsetselect(t, t->q0, t->q1); /* insert could leave it somewhere else */
if(qid!=QWwrsel && t->org <= q0 && q0 < t->org+t->fr.nchars)
if(qid!=QWwrsel && shouldscroll(t, q0, qid))
textshow(t, q0+nr, q0+nr, 1);
textscrdraw(t);
}