t9term, acme: autoscroll - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit ba31ab3044765270d40c9da934dfc11e5f8b63c5
 (DIR) parent 42ef984cf2514fedc4f9e2efe2876aa95d2d8579
 (HTM) Author: Russ Cox <rsc@swtch.com>
       Date:   Wed, 27 Apr 2011 13:18:07 -0400
       
       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
       tthe buffer.
       
       R=r, r2
       http://codereview.appspot.com/4433060
       
       Diffstat:
         M man/man1/9term.1                    |      12 ++++++------
         M man/man1/acme.1                     |       6 +++++-
         M man/man1/rio.1                      |      12 +++++-------
         M man/man4/acme.4                     |      11 -----------
         M src/cmd/9term/9term.c               |      19 ++++---------------
         M src/cmd/9term/dat.h                 |       3 +--
         M src/cmd/9term/fns.h                 |       2 +-
         M src/cmd/9term/win.c                 |      10 +---------
         M src/cmd/9term/wind.c                |      13 +++++--------
         M src/cmd/acme/dat.h                  |       1 -
         M src/cmd/acme/exec.c                 |       1 +
         M src/cmd/acme/xfid.c                 |      14 +++-----------
       
       12 files changed, 32 insertions(+), 72 deletions(-)
       ---
 (DIR) diff --git a/man/man1/9term.1 b/man/man1/9term.1
       t@@ -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
       t@@ -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
 (DIR) diff --git a/man/man1/acme.1 b/man/man1/acme.1
       t@@ -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
 (DIR) diff --git a/man/man1/rio.1 b/man/man1/rio.1
       t@@ -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
 (DIR) diff --git a/man/man4/acme.4 b/man/man4/acme.4
       t@@ -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
 (DIR) diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c
       t@@ -67,7 +67,7 @@ threadmain(int argc, char *argv[])
                        fontname = EARGF(usage());
                        break;
                case 's':
       -                scrolling = TRUE;
       +                /* no-op */
                        break;
                case 'c':
                        cooked = TRUE;
       t@@ -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);
       t@@ -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;
       t@@ -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;
       t@@ -288,7 +288,6 @@ enum
                Snarf,
                Plumb,
                Send,
       -        Scroll,
                Cook
        };
        
       t@@ -298,7 +297,6 @@ char                *menu2str[] = {
                "snarf",
                "plumb",
                "send",
       -        "scroll",
                "cook",
                nil
        };
       t@@ -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
       t@@ -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;
 (DIR) diff --git a/src/cmd/9term/dat.h b/src/cmd/9term/dat.h
       t@@ -131,7 +131,6 @@ struct Window
                Rectangle                lastsr;
                int                        topped;
                int                        notefd;
       -        uchar                scrolling;
                Cursor                cursor;
                Cursor                *cursorp;
                uchar                holding;
       t@@ -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*);
 (DIR) diff --git a/src/cmd/9term/fns.h b/src/cmd/9term/fns.h
       t@@ -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);
 (DIR) diff --git a/src/cmd/9term/win.c b/src/cmd/9term/win.c
       t@@ -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);
       t@@ -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;
 (DIR) diff --git a/src/cmd/9term/wind.c b/src/cmd/9term/wind.c
       t@@ -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;
       t@@ -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);
       t@@ -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;
       t@@ -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
       t@@ -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);
 (DIR) diff --git a/src/cmd/acme/dat.h b/src/cmd/acme/dat.h
       t@@ -243,7 +243,6 @@ struct Window
                Range        limit;
                uchar        nopen[QMAX];
                uchar        nomark;
       -        uchar        noscroll;
                Range        wrselrange;
                int                rdselfd;
                Column        *col;
 (DIR) diff --git a/src/cmd/acme/exec.c b/src/cmd/acme/exec.c
       t@@ -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);
                }
        }
        
 (DIR) diff --git a/src/cmd/acme/xfid.c b/src/cmd/acme/xfid.c
       t@@ -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);
       t@@ -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);
                                }
       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;