aboutsummaryrefslogtreecommitdiff
path: root/src
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 /src
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
Diffstat (limited to 'src')
-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
8 files changed, 16 insertions, 47 deletions
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;