tChange 9term to look like rio windows, not acme windows. - 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 ba9ffa53c4825e115078ed098205d75aa7a77eb0
 (DIR) parent eacbfb241a03515c451bd59a79e905eedcfd7243
 (HTM) Author: rsc <devnull@localhost>
       Date:   Sun, 21 Mar 2004 04:27:09 +0000
       
       Change 9term to look like rio windows, not acme windows.
       
       Diffstat:
         M src/cmd/9term/9term.c               |     174 ++++++++++++++++++++++++++-----
         M src/cmd/9term/9term.h               |     109 +------------------------------
         M src/cmd/9term/Linux.c               |       1 -
       
       3 files changed, 152 insertions(+), 132 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c
       t@@ -1,5 +1,113 @@
        #include "9term.h"
        
       +#define fatal        sysfatal
       +
       +typedef struct Text        Text;
       +typedef struct Readbuf        Readbuf;
       +
       +enum
       +{
       +        /* these are chosen to use malloc()'s properties well */
       +        HiWater        = 640000,        /* max size of history */
       +        LoWater        = 330000,        /* min size of history after max'ed */
       +};
       +
       +/* various geometric paramters */
       +enum
       +{
       +        Scrollwid         = 12,                /* width of scroll bar */
       +        Scrollgap         = 4,                /* gap right of scroll bar */
       +        Maxtab                = 4,
       +};
       +
       +enum
       +{
       +        Cut,
       +        Paste,
       +        Snarf,
       +        Send,
       +        Plumb,
       +        Scroll,
       +};
       +
       +
       +#define        SCROLLKEY        Kdown
       +#define        ESC                0x1B
       +#define CUT                0x18        /* ctrl-x */                
       +#define COPY                0x03        /* crtl-c */
       +#define PASTE                0x16        /* crtl-v */
       +#define BACKSCROLLKEY        Kup
       +
       +#define        READBUFSIZE 8192
       +
       +struct Text
       +{
       +        Frame                *f;                /* frame ofr terminal */
       +        Mouse                m;
       +        uint                nr;                /* num of runes in term */
       +        Rune                *r;                /* runes for term */
       +        uint                nraw;                /* num of runes in raw buffer */
       +        Rune                *raw;                /* raw buffer */
       +        uint                org;                /* first rune on the screen */
       +        uint                q0;                /* start of selection region */
       +        uint                q1;                /* end of selection region */
       +        uint                qh;                /* unix point */
       +        int                npart;                /* partial runes read from console */
       +        char                part[UTFmax];        
       +        int                nsnarf;                /* snarf buffer */
       +        Rune                *snarf;
       +};
       +
       +struct Readbuf
       +{
       +        short        n;                                /* # bytes in buf */
       +        uchar        data[READBUFSIZE];                /* data bytes */
       +};
       +
       +void        mouse(void);
       +void        domenu2(int);
       +void        loop(void);
       +void        geom(void);
       +void        fill(void);
       +void        tcheck(void);
       +void        updatesel(void);
       +void        doreshape(void);
       +void        rcstart(int fd[2], int, char**);
       +void        runewrite(Rune*, int);
       +void        consread(void);
       +void        conswrite(char*, int);
       +int        bswidth(Rune c);
       +void        cut(void);
       +void        paste(Rune*, int, int);
       +void        snarfupdate(void);
       +void        snarf(void);
       +void        show(uint);
       +void        key(Rune);
       +void        setorigin(uint org, int exact);
       +uint        line2q(uint);
       +uint        backnl(uint, uint);
       +int        cansee(uint);
       +uint        backnl(uint, uint);
       +void        addraw(Rune*, int);
       +void        mselect(void);
       +void        doubleclick(uint *q0, uint *q1);
       +int        clickmatch(int cl, int cr, int dir, uint *q);
       +Rune        *strrune(Rune *s, Rune c);
       +int        consready(void);
       +Rectangle scrpos(Rectangle r, ulong p0, ulong p1, ulong tot);
       +void        scrdraw(void);
       +void        scroll(int);
       +void        hostproc(void *arg);
       +void        hoststart(void);
       +int        getchildwd(int, char*, int);
       +void        plumbstart(void);
       +void        plumb(uint, uint);
       +void        plumbclick(uint*, uint*);
       +int        getpts(int fd[], char *slave);
       +
       +#define        runemalloc(n)                malloc((n)*sizeof(Rune))
       +#define        runerealloc(a, n)        realloc(a, (n)*sizeof(Rune))
       +#define        runemove(a, b, n)        memmove(a, b, (n)*sizeof(Rune))
        Rectangle        scrollr;        /* scroll bar rectangle */
        Rectangle        lastsr;                /* used for scroll bar */
        int                holdon;                /* hold mode */
       t@@ -10,11 +118,13 @@ uint                clickq0;        /* point of last click */
        int                rcfd[2];
        int                rcpid;
        int                maxtab;
       +int                use9wm;
        Mousectl*        mc;
        Keyboardctl*        kc;
        Channel*        hostc;
        Readbuf                rcbuf[2];
        int                mainpid;
       +int                acmecolors;
        int                plumbfd;
        int                button2exec;
        int                label(Rune*, int);
       t@@ -27,8 +137,8 @@ char *menu2str[] = {
                "paste",
                "snarf",
                "send",
       -        "scroll",
                "plumb",
       +        "scroll",
                0
        };
        
       t@@ -83,6 +193,9 @@ threadmain(int argc, char *argv[])
                case 's':
                        scrolling++;
                        break;
       +        case 'w':        /* started from "rio" window manager */
       +                use9wm = 1;
       +                break;
                }ARGEND
        
                p = getenv("tabstop");
       t@@ -104,15 +217,21 @@ threadmain(int argc, char *argv[])
        
                t.f = mallocz(sizeof(Frame), 1);
        
       -        cols[BACK] = allocimagemix(display, DPaleyellow, DWhite);
       -        cols[HIGH] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DDarkyellow);
       -        cols[BORD] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DYellowgreen);
       +        if(acmecolors){
       +                cols[BACK] = allocimagemix(display, DPaleyellow, DWhite);
       +                cols[HIGH] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DDarkyellow);
       +                cols[BORD] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DYellowgreen);
       +        }else{
       +                cols[BACK] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DWhite);
       +                cols[HIGH] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0xCCCCCCFF);
       +                cols[BORD] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x999999FF);
       +        }
                cols[TEXT] = display->black;
                cols[HTEXT] = display->black;
        
                hcols[BACK] = cols[BACK];
                hcols[HIGH] = cols[HIGH];
       -        hcols[BORD] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x006600FF);
       +        hcols[BORD] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DMedblue);
                hcols[TEXT] = hcols[BORD];
                hcols[HTEXT] = hcols[TEXT];
        
       t@@ -469,7 +588,6 @@ domenu2(int but)
                        snarf();
                        t.q0 = t.q1 = t.nr;
                        updatesel();
       -                snarfupdate();
                        paste(t.snarf, t.nsnarf, 1);
                        if(t.nsnarf == 0 || t.snarf[t.nsnarf-1] != '\n')
                                paste(newline, 1, 1);
       t@@ -536,7 +654,7 @@ key(Rune r)
                        drawhold(holdon);
                        if(!holdon)
                                consread();
       -                if(r == 0x1B)
       +                if(r==ESC)
                                return;
                }
        
       t@@ -546,9 +664,15 @@ key(Rune r)
                case 0x7F:        /* DEL: send interrupt */
                        t.qh = t.q0 = t.q1 = t.nr;
                        show(t.q0);
       +                goto Default;
       +fprint(2, "send interrupt to %d group\n", rcpid);
       +#ifdef TIOCSIG
                        sig = 2; /* SIGINT */
                        if(ioctl(rcfd[0], TIOCSIG, &sig) < 0)
                                fprint(2, "sending interrupt: %r\n");
       +#else
       +                postnote(PNGROUP, rcpid, "interrupt");
       +#endif
                        break;
                case 0x08:        /* ^H: erase character */
                case 0x15:        /* ^U: erase line */
       t@@ -558,6 +682,7 @@ key(Rune r)
                        cut();
                        break;
                default:
       +        Default:
                        paste(&r, 1, 1);
                        break;
                }
       t@@ -613,7 +738,7 @@ consready(void)
                /* look to see if there is a complete line */
                for(i=t.qh; i<t.nr; i++){
                        c = t.r[i];
       -                if(c=='\n' || c=='\004')
       +                if(c=='\n' || c=='\004' || c=='\x7F')
                                return 1;
                }
                return 0;
       t@@ -643,7 +768,7 @@ consread(void)
                                c = *p;
                                p += width;
                                n -= width;
       -                        if(!rawon && (c == '\n' || c == '\004'))
       +                        if(!rawon && (c == '\n' || c == '\004' || c == '\x7F'))
                                        break;
                        }
                        /* take out control-d when not doing a zero length write */
       t@@ -899,6 +1024,17 @@ paste(Rune *r, int n, int advance)
                cut();
                if(n == 0)
                        return;
       +        /*
       +         * if this is a button2 execute then we might have been passed
       +         * runes inside the buffer.  must save them before realloc.
       +         */
       +        rbuf = nil;
       +        if(t.r <= r && r < t.r+n){
       +                rbuf = runemalloc(n);
       +                runemove(rbuf, r, n);
       +                r = rbuf;
       +        }
       +
                if(t.nr>HiWater && t.q0>=t.org && t.q0>=t.qh){
                        m = HiWater-LoWater;
                        if(m > t.org)
       t@@ -913,16 +1049,6 @@ paste(Rune *r, int n, int advance)
                        runemove(t.r, t.r+m, t.nr);
                }
        
       -        /*
       -         * if this is a button2 execute then we might have been passed
       -         * runes inside the buffer.  must save them before realloc.
       -         */
       -        rbuf = nil;
       -        if(t.r <= r && r < t.r+n){
       -                rbuf = runemalloc(n);
       -                runemove(rbuf, r, n);
       -                r = rbuf;
       -        }
                t.r = runerealloc(t.r, t.nr+n);
                q0 = t.q0;
                runemove(t.r+q0+n, t.r+q0, t.nr-q0);
       t@@ -1219,23 +1345,23 @@ rcstart(int fd[2], int argc, char **argv)
                if(getpts(fd, slave) < 0)
                        fprint(2, "getpts: %r\n");
        
       -        switch(pid = fork()) {
       +        switch(pid = fork()) {
                case 0:
                        putenv("TERM", "9term");
                        close(fd[1]);
                        setsid();
       -        //        tcsetpgrp(0, pid);
       +//                tcsetpgrp(0, pid);
                        sfd = open(slave, ORDWR);
                        if(sfd < 0)
                                fprint(2, "open %s: %r\n", slave);
                        if(ioctl(sfd, TIOCSCTTY, 0) < 0)
                                fprint(2, "ioctl TIOCSCTTY: %r\n");
       -        //        ioctl(sfd, I_PUSH, "ptem");
       -        //        ioctl(sfd, I_PUSH, "ldterm");
       +//                ioctl(sfd, I_PUSH, "ptem");
       +//                ioctl(sfd, I_PUSH, "ldterm");
                        dup(sfd, 0);
                        dup(sfd, 1);
                        dup(sfd, 2);
       -                system("stty tabs -onlcr -echo");
       +                system("stty tabs -onlcr -echo erase ^h intr ^?");
                        execvp(argv[0], argv);
                        fprint(2, "exec %s failed: %r\n", argv[0]);
                        _exits("oops");
 (DIR) diff --git a/src/cmd/9term/9term.h b/src/cmd/9term/9term.h
       t@@ -14,111 +14,6 @@
        #include <pty.h>
        #endif
        
       -#define fatal        sysfatal
       +extern int getchildwd(int, char*, int);
       +extern int getpts(int[], char*);
        
       -typedef struct Text        Text;
       -typedef struct Readbuf        Readbuf;
       -
       -enum
       -{
       -        /* these are chosen to use malloc()'s properties well */
       -        HiWater        = 640000,        /* max size of history */
       -        LoWater        = 330000,        /* min size of history after max'ed */
       -};
       -
       -/* various geometric paramters */
       -enum
       -{
       -        Scrollwid         = 12,                /* width of scroll bar */
       -        Scrollgap         = 4,                /* gap right of scroll bar */
       -        Maxtab                = 4,
       -};
       -
       -enum
       -{
       -        Cut,
       -        Paste,
       -        Snarf,
       -        Send,
       -        Scroll,
       -        Plumb,
       -};
       -
       -
       -#define        SCROLLKEY        Kdown
       -#define        ESC                0x1B
       -#define CUT                0x18        /* ctrl-x */                
       -#define COPY                0x03        /* crtl-c */
       -#define PASTE                0x16        /* crtl-v */
       -#define BACKSCROLLKEY        Kup
       -
       -#define        READBUFSIZE 8192
       -
       -struct Text
       -{
       -        Frame                *f;                /* frame ofr terminal */
       -        Mouse                m;
       -        uint                nr;                /* num of runes in term */
       -        Rune                *r;                /* runes for term */
       -        uint                nraw;                /* num of runes in raw buffer */
       -        Rune                *raw;                /* raw buffer */
       -        uint                org;                /* first rune on the screen */
       -        uint                q0;                /* start of selection region */
       -        uint                q1;                /* end of selection region */
       -        uint                qh;                /* unix point */
       -        int                npart;                /* partial runes read from console */
       -        char                part[UTFmax];        
       -        int                nsnarf;                /* snarf buffer */
       -        Rune                *snarf;
       -};
       -
       -struct Readbuf
       -{
       -        short        n;                                /* # bytes in buf */
       -        uchar        data[READBUFSIZE];                /* data bytes */
       -};
       -
       -void        mouse(void);
       -void        domenu2(int);
       -void        loop(void);
       -void        geom(void);
       -void        fill(void);
       -void        tcheck(void);
       -void        updatesel(void);
       -void        doreshape(void);
       -void        rcstart(int fd[2], int, char**);
       -void        runewrite(Rune*, int);
       -void        consread(void);
       -void        conswrite(char*, int);
       -int        bswidth(Rune c);
       -void        cut(void);
       -void        paste(Rune*, int, int);
       -void        snarfupdate(void);
       -void        snarf(void);
       -void        show(uint);
       -void        key(Rune);
       -void        setorigin(uint org, int exact);
       -uint        line2q(uint);
       -uint        backnl(uint, uint);
       -int        cansee(uint);
       -uint        backnl(uint, uint);
       -void        addraw(Rune*, int);
       -void        mselect(void);
       -void        doubleclick(uint *q0, uint *q1);
       -int        clickmatch(int cl, int cr, int dir, uint *q);
       -Rune        *strrune(Rune *s, Rune c);
       -int        consready(void);
       -Rectangle scrpos(Rectangle r, ulong p0, ulong p1, ulong tot);
       -void        scrdraw(void);
       -void        scroll(int);
       -void        hostproc(void *arg);
       -void        hoststart(void);
       -int        getchildwd(int, char*, int);
       -void        plumbstart(void);
       -void        plumb(uint, uint);
       -void        plumbclick(uint*, uint*);
       -int        getpts(int fd[], char *slave);
       -
       -#define        runemalloc(n)                malloc((n)*sizeof(Rune))
       -#define        runerealloc(a, n)        realloc(a, (n)*sizeof(Rune))
       -#define        runemove(a, b, n)        memmove(a, b, (n)*sizeof(Rune))
 (DIR) diff --git a/src/cmd/9term/Linux.c b/src/cmd/9term/Linux.c
       t@@ -17,7 +17,6 @@ getchildwd(int pid, char *wdir, int bufn)
        int
        getpts(int fd[], char *slave)
        {
       -
                openpty(&fd[1], &fd[0], slave, 0, 0);
                return 0;
        }