aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@swtch.com>2011-04-27 13:18:07 -0400
committerRuss Cox <rsc@swtch.com>2011-04-27 13:18:07 -0400
commitba31ab3044765270d40c9da934dfc11e5f8b63c5 (patch)
treeb9b8bb263f822e990b53eb97384ba338a0036a66
parent42ef984cf2514fedc4f9e2efe2876aa95d2d8579 (diff)
downloadplan9port-ba31ab3044765270d40c9da934dfc11e5f8b63c5.tar.gz
plan9port-ba31ab3044765270d40c9da934dfc11e5f8b63c5.tar.bz2
plan9port-ba31ab3044765270d40c9da934dfc11e5f8b63c5.zip
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
-rw-r--r--man/man1/9term.112
-rw-r--r--man/man1/acme.16
-rw-r--r--man/man1/rio.112
-rw-r--r--man/man4/acme.411
-rw-r--r--src/cmd/9term/9term.c19
-rw-r--r--src/cmd/9term/dat.h3
-rw-r--r--src/cmd/9term/fns.h2
-rw-r--r--src/cmd/9term/win.c10
-rw-r--r--src/cmd/9term/wind.c13
-rw-r--r--src/cmd/acme/dat.h1
-rw-r--r--src/cmd/acme/exec.c1
-rw-r--r--src/cmd/acme/xfid.c14
12 files changed, 32 insertions, 72 deletions
diff --git a/man/man1/9term.1 b/man/man1/9term.1
index a9f687c2..33a5b05b 100644
--- a/man/man1/9term.1
+++ b/man/man1/9term.1
@@ -30,8 +30,9 @@ Otherwise button 2 brings up a menu, described below.
.PP
The
.B -s
-option initializes the window so that text scrolls;
-the default is not to scroll.
+option has no effect. It formerly set the scrolling mode,
+and is recognized to avoid breaking scripts that create new windows.
+See below for a description of scrolling behavior.
.PP
The
.B -c
@@ -205,10 +206,9 @@ always treats the DEL keystroke as an interrupt request.
In response it sends the terminal's current interrupt character
(which need not be DEL).
.PP
-Normally, written output to a window blocks when
-the text reaches the end of the screen and the terminal
-buffer fills;
-a button 2 menu item toggles scrolling.
+Written output to a window is appended to the end of the window.
+The window scrolls to display the new output only if the
+end of the window was visible before the write.
.PP
.I 9term
changes behavior according to
diff --git a/man/man1/acme.1 b/man/man1/acme.1
index d08ff92a..2d24f331 100644
--- a/man/man1/acme.1
+++ b/man/man1/acme.1
@@ -646,13 +646,17 @@ window and runs a
(default
.BR $SHELL )
in it, turning the window into something analogous to an
-.IR rio (1)
+.IR 9term (1)
window.
Executing text in a
.I win
window with button
2 is similar to using
.BR Send .
+.I Win
+windows follow the same scrolling heuristic as in
+.IR 9term (1):
+the window scrolls on output only if the window is displaying the end of the buffer.
.PP
.I Awd
loads the tag line of its window with the directory in which it's running, suffixed
diff --git a/man/man1/rio.1 b/man/man1/rio.1
index 3c31b616..1fc0619d 100644
--- a/man/man1/rio.1
+++ b/man/man1/rio.1
@@ -73,13 +73,11 @@ and then to fall back to
.IR xterm (1).
The
.B \-s
-option causes
-.I rio
-to add
-.B -s
-to
-.IR 9term 's
-command-line, starting the window in scrolling mode.
+option has no effect. It formerly set the scrolling mode for
+new windows and is recognized to avoid breaking scripts.
+See
+.IR 9term (1)
+for a description of scrolling behavior.
.PP
The
.B \-version
diff --git a/man/man4/acme.4 b/man/man4/acme.4
index 40cde759..78214cad 100644
--- a/man/man4/acme.4
+++ b/man/man4/acme.4
@@ -236,22 +236,11 @@ may be undone in a single
.B Undo
interactive command.
.TP
-.B noscroll
-Turn off automatic `scrolling' of the window to show text written to the body.
-.TP
.B put
Equivalent to the
.B Put
interactive command with no arguments; accepts no arguments.
.TP
-.B scroll
-Cancel a
-.B noscroll
-message, returning the window to the default state wherein each write
-to the
-.B body
-file causes the window to `scroll' to display the new text.
-.TP
.B show
Guarantee at least some of the selected text is visible on the display.
.RE
diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c
index 806215df..344a7b55 100644
--- a/src/cmd/9term/9term.c
+++ b/src/cmd/9term/9term.c
@@ -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;
diff --git a/src/cmd/9term/dat.h b/src/cmd/9term/dat.h
index bc6d1fc9..052f3b82 100644
--- a/src/cmd/9term/dat.h
+++ b/src/cmd/9term/dat.h
@@ -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*);
diff --git a/src/cmd/9term/fns.h b/src/cmd/9term/fns.h
index a0ae686a..cdb5ff6f 100644
--- a/src/cmd/9term/fns.h
+++ b/src/cmd/9term/fns.h
@@ -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);
diff --git a/src/cmd/9term/win.c b/src/cmd/9term/win.c
index 93dc770a..fd8e3998 100644
--- a/src/cmd/9term/win.c
+++ b/src/cmd/9term/win.c
@@ -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;
diff --git a/src/cmd/9term/wind.c b/src/cmd/9term/wind.c
index 4cc9c207..aa7c8288 100644
--- a/src/cmd/9term/wind.c
+++ b/src/cmd/9term/wind.c
@@ -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);
diff --git a/src/cmd/acme/dat.h b/src/cmd/acme/dat.h
index b15395fd..300ba65f 100644
--- a/src/cmd/acme/dat.h
+++ b/src/cmd/acme/dat.h
@@ -243,7 +243,6 @@ struct Window
Range limit;
uchar nopen[QMAX];
uchar nomark;
- uchar noscroll;
Range wrselrange;
int rdselfd;
Column *col;
diff --git a/src/cmd/acme/exec.c b/src/cmd/acme/exec.c
index a71b5b48..ad4da001 100644
--- a/src/cmd/acme/exec.c
+++ b/src/cmd/acme/exec.c
@@ -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);
}
}
diff --git a/src/cmd/acme/xfid.c b/src/cmd/acme/xfid.c
index db5d54b0..18b06dd1 100644
--- a/src/cmd/acme/xfid.c
+++ b/src/cmd/acme/xfid.c
@@ -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;