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:
parent
42ef984cf2
commit
ba31ab3044
12 changed files with 32 additions and 72 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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*);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -243,7 +243,6 @@ struct Window
|
|||
Range limit;
|
||||
uchar nopen[QMAX];
|
||||
uchar nomark;
|
||||
uchar noscroll;
|
||||
Range wrselrange;
|
||||
int rdselfd;
|
||||
Column *col;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue