9term, acme: autoscroll

Ignore scroll/noscroll window setting.
Instead, scroll when the write begins in
or immediately after the displayed window content.

In the new scrolling discipline, executing
"Noscroll" is replaced by typing Page Up or
using the mouse to scroll higher in the buffer,
and executing "Scroll" is replaced by typing End
or using the mouse to scroll to the bottom of
the buffer.

R=r, r2
http://codereview.appspot.com/4433060
This commit is contained in:
Russ Cox 2011-04-27 13:18:07 -04:00
parent 42ef984cf2
commit ba31ab3044
12 changed files with 32 additions and 72 deletions

View file

@ -67,7 +67,7 @@ threadmain(int argc, char *argv[])
fontname = EARGF(usage());
break;
case 's':
scrolling = TRUE;
/* no-op */
break;
case 'c':
cooked = TRUE;
@ -114,7 +114,7 @@ threadmain(int argc, char *argv[])
timerinit();
servedevtext();
rcpid = rcstart(argc, argv, &rcfd, &sfd);
w = new(screen, FALSE, scrolling, rcpid, ".", nil, nil);
w = new(screen, FALSE, rcpid, ".", nil, nil);
threadcreate(keyboardthread, nil, STACK);
threadcreate(mousethread, nil, STACK);
@ -241,7 +241,7 @@ wpointto(Point pt)
}
Window*
new(Image *i, int hideit, int scrollit, int pid, char *dir, char *cmd, char **argv)
new(Image *i, int hideit, int pid, char *dir, char *cmd, char **argv)
{
Window *w;
Mousectl *mc;
@ -258,7 +258,7 @@ new(Image *i, int hideit, int scrollit, int pid, char *dir, char *cmd, char **ar
*mc = *mousectl;
/* mc->image = i; */
mc->c = cm;
w = wmk(i, mc, ck, cctl, scrollit);
w = wmk(i, mc, ck, cctl);
free(mc); /* wmk copies *mc */
window = erealloc(window, ++nwindow*sizeof(Window*));
window[nwindow-1] = w;
@ -288,7 +288,6 @@ enum
Snarf,
Plumb,
Send,
Scroll,
Cook
};
@ -298,7 +297,6 @@ char *menu2str[] = {
"snarf",
"plumb",
"send",
"scroll",
"cook",
nil
};
@ -317,10 +315,6 @@ button2menu(Window *w)
if(w->deleted)
return;
incref(&w->ref);
if(w->scrolling)
menu2str[Scroll] = "noscroll";
else
menu2str[Scroll] = "scroll";
if(cooked)
menu2str[Cook] = "nocook";
else
@ -364,11 +358,6 @@ button2menu(Window *w)
wsetselect(w, w->nr, w->nr);
wshow(w, w->nr);
break;
case Scroll:
if(w->scrolling ^= 1)
wshow(w, w->nr);
break;
case Cook:
cooked ^= 1;

View file

@ -131,7 +131,6 @@ struct Window
Rectangle lastsr;
int topped;
int notefd;
uchar scrolling;
Cursor cursor;
Cursor *cursorp;
uchar holding;
@ -149,7 +148,7 @@ int winborder(Window*, Point);
void winctl(void*);
void winshell(void*);
Window* wlookid(int);
Window* wmk(Image*, Mousectl*, Channel*, Channel*, int);
Window* wmk(Image*, Mousectl*, Channel*, Channel*);
Window* wpointto(Point);
Window* wtop(Point);
void wtopme(Window*);

View file

@ -6,7 +6,7 @@ int whide(Window*);
int wunhide(int);
void freescrtemps(void);
int parsewctl(char**, Rectangle, Rectangle*, int*, int*, int*, int*, char**, char*, char*);
Window *new(Image*, int, int, int, char*, char*, char**);
Window *new(Image*, int, int, char*, char*, char**);
void riosetcursor(Cursor*, int);
int min(int, int);
int max(int, int);

View file

@ -181,7 +181,7 @@ threadmain(int argc, char **argv)
putenv("winid", buf);
sprint(buf, "%d/tag", id);
fd = fsopenfd(fs, buf, OWRITE|OCEXEC);
write(fd, " Send Noscroll", 1+4+1+8);
write(fd, " Send", 1+4);
close(fd);
sprint(buf, "%d/event", id);
eventfd = fsopen(fs, buf, ORDWR|OCEXEC);
@ -440,14 +440,6 @@ stdinproc(void *v)
}
char buf[100];
snprint(buf, sizeof buf, "%.*S", e.nr, e.r);
if(cistrcmp(buf, "scroll") == 0) {
fsprint(ctlfd, "scroll\nshow");
break;
}
if(cistrcmp(buf, "noscroll") == 0) {
fsprint(ctlfd, "noscroll");
break;
}
if(cistrcmp(buf, "cook") == 0) {
cook = 1;
break;

View file

@ -36,7 +36,7 @@ static Image *lightholdcol;
static Image *paleholdcol;
Window*
wmk(Image *i, Mousectl *mc, Channel *ck, Channel *cctl, int scrolling)
wmk(Image *i, Mousectl *mc, Channel *ck, Channel *cctl)
{
Window *w;
Rectangle r;
@ -77,7 +77,6 @@ wmk(Image *i, Mousectl *mc, Channel *ck, Channel *cctl, int scrolling)
w->topped = ++topped;
w->id = ++id;
w->notefd = -1;
w->scrolling = scrolling;
w->dir = estrdup(startdir);
w->label = estrdup("<unnamed>");
r = insetrect(w->i->r, Selborder);
@ -192,7 +191,7 @@ winctl(void *arg)
{
Rune *rp, *bp, *up, *kbdr;
uint qh;
int nr, nb, c, wid, i, npart, initial, lastb;
int nr, nb, c, wid, i, npart, initial, lastb, scrolling;
char *s, *t, part[UTFmax];
Window *w;
Mousestate *mp, m;
@ -248,10 +247,7 @@ winctl(void *arg)
alts[WMouseread].op = CHANSND;
else
alts[WMouseread].op = CHANNOP;
if(!w->scrolling && !w->mouseopen && w->qh>w->org+w->f.nchars)
alts[WCwrite].op = CHANNOP;
else
alts[WCwrite].op = CHANSND;
alts[WCwrite].op = CHANSND;
if(w->deleted || !w->wctlready)
alts[WWread].op = CHANNOP;
else
@ -369,8 +365,9 @@ winctl(void *arg)
w->qh = qh;
}
nr = up - rp;
scrolling = w->org <= w->qh && w->qh <= w->org + w->f.nchars;
w->qh = winsert(w, rp, nr, w->qh)+nr;
if(w->scrolling || w->mouseopen)
if(scrolling)
wshow(w, w->qh);
wsetselect(w, w->q0, w->q1);
wscrdraw(w);

View file

@ -243,7 +243,6 @@ struct Window
Range limit;
uchar nopen[QMAX];
uchar nomark;
uchar noscroll;
Range wrselrange;
int rdselfd;
Column *col;

View file

@ -960,6 +960,7 @@ sendx(Text *et, Text *t, Text *_0, int _1, int _2, Rune *_3, int _4)
if(textreadc(t, t->file->b.nc-1) != '\n'){
textinsert(t, t->file->b.nc, Lnl, 1, TRUE);
textsetselect(t, t->file->b.nc, t->file->b.nc);
textshow(t, t->q1, t->q1, 1);
}
}

View file

@ -510,8 +510,8 @@ xfidwrite(Xfid *x)
if(tq1 >= q0)
tq1 += nr;
textsetselect(t, tq0, tq1);
if(!t->w->noscroll)
textshow(t, q0, q0+nr, 0);
if(t->org <= q0 && q0 <= t->org+t->fr.nchars)
textshow(t, q0+nr, q0+nr, 0);
textscrdraw(t);
winsettag(w);
free(r);
@ -568,7 +568,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->w->noscroll)
if(qid!=QWwrsel && t->org <= q0 && q0 < t->org+t->fr.nchars)
textshow(t, q0+nr, q0+nr, 1);
textscrdraw(t);
}
@ -768,18 +768,10 @@ out:
w->filemenu = TRUE;
m = 4;
}else
if(strncmp(p, "noscroll", 8) == 0){ /* turn off automatic scrolling */
w->noscroll = TRUE;
m = 8;
}else
if(strncmp(p, "cleartag", 8) == 0){ /* wipe tag right of bar */
wincleartag(w);
settag = TRUE;
m = 8;
}else
if(strncmp(p, "scroll", 6) == 0){ /* turn on automatic scrolling (writes to body only) */
w->noscroll = FALSE;
m = 6;
}else{
err = Ebadctl;
break;