URI: 
       tgrey out 9term when it loses focus. - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 4f30f3b44464f9b89512224095474200390b03e9
   DIR parent c005568a7fe03010dcd1b2df311e3cd7f7459448
  HTML Author: rsc <devnull@localhost>
       Date:   Tue, 30 Mar 2004 05:03:29 +0000
       
       grey out 9term when it loses focus.
       
       Diffstat:
         M CHANGES                             |       8 ++++++++
         M include/mouse.h                     |       3 +++
         M src/cmd/9term/9term.c               |      24 ++++++++++++++++++++++--
         M src/cmd/9term/win.c                 |       2 +-
         M src/libdraw/x11-init.c              |      58 +++++++++++++++++++------------
         M src/libdraw/x11-memdraw.h           |       3 +++
         M src/libdraw/x11-mouse.c             |      40 +++++++++++++++++++++++++++++++
       
       7 files changed, 112 insertions(+), 26 deletions(-)
       ---
   DIR diff --git a/CHANGES b/CHANGES
       t@@ -1,3 +1,11 @@
       +March 29, 2004
       +
       +        Add window resizing by dragging borders to rio.
       +        Code from Axel Belinfante.
       +
       +        Added code to make 9term fade itself when it loses
       +        focus running under rio.
       +
        March 26, 2004
        
                Fix 9term chording paste bug reported by Sam.
   DIR diff --git a/include/mouse.h b/include/mouse.h
       t@@ -48,6 +48,9 @@ extern void                drawgetrect(Rectangle, int);
        extern Rectangle        getrect(int, Mousectl*);
        extern int                         menuhit(int, Mousectl*, Menu*, Screen*);
        
       +extern void                bouncemouse(Mouse*);
       +extern int                        _windowhasfocus;        /* XXX do better */
       +extern int                        _wantfocuschanges;
        
        #if defined(__cplusplus)
        }
   DIR diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c
       t@@ -152,6 +152,9 @@ char *menu2str[] = {
        
        Image* cols[NCOL];
        Image* hcols[NCOL];
       +Image* palegrey;
       +Image* paleblue;
       +Image* blue;
        Image *plumbcolor;
        Image *execcolor;
        
       t@@ -187,6 +190,7 @@ threadmain(int argc, char *argv[])
                char *p;
        
                rfork(RFNOTEG);
       +        _wantfocuschanges = 1;
                mainpid = getpid();
                ARGBEGIN{
                default:
       t@@ -236,16 +240,22 @@ threadmain(int argc, char *argv[])
                }
                cols[TEXT] = display->black;
                cols[HTEXT] = display->black;
       +        palegrey = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x666666FF);
        
                hcols[BACK] = cols[BACK];
                hcols[HIGH] = cols[HIGH];
       -        hcols[BORD] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DMedblue);
       +        blue = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DMedblue);
       +        paleblue = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DGreyblue);
       +
       +        hcols[BORD] = blue;
                hcols[TEXT] = hcols[BORD];
                hcols[HTEXT] = hcols[TEXT];
        
                plumbcolor = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x006600FF);
                execcolor = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xAA0000FF);
        
       +        if(!blue || !palegrey || !paleblue || !plumbcolor || !execcolor)
       +                sysfatal("alloc colors: %r");
                draw(screen, screen->r, cols[BACK], nil, ZP);
                geom();
                loop();
       t@@ -365,6 +375,16 @@ geom(void)
                Point p;
                Rectangle r;
        
       +        if(!acmecolors){
       +                if(_windowhasfocus){
       +                        cols[TEXT] = cols[HTEXT] = display->black;
       +                        hcols[TEXT] = hcols[HTEXT] = blue;
       +                }else{
       +                        cols[TEXT] = cols[HTEXT] = palegrey;
       +                        hcols[TEXT] = hcols[HTEXT] = paleblue;
       +                }
       +        }
       +
                r = screen->r;
                r.min.y++;
                r.max.y--;
       t@@ -1535,7 +1555,7 @@ scrdraw(void)
        {
                Rectangle r, r1, r2;
                static Image *scrx;
       -        
       +
                r = scrollr;
                r.min.x += 1;        /* border between margin and bar */
                r1 = r;
   DIR diff --git a/src/cmd/9term/win.c b/src/cmd/9term/win.c
       t@@ -572,7 +572,7 @@ sendtype(int fd0)
                while(ntypebreak){
                        for(i=0; i<ntypeb; i++)
                                if(typing[i]=='\n' || typing[i]==0x04){
       -                                n = i + (typing[i] == '\n');
       +                                n = i+1;
                                        i++;
                                        if(write(fd0, typing, n) != n)
                                                error("sending to program");
   DIR diff --git a/src/libdraw/x11-init.c b/src/libdraw/x11-init.c
       t@@ -188,6 +188,7 @@ xattach(char *label)
                XWindow xrootwin;
                XWindowAttributes wattr;
                XWMHints hint;
       +        Atom atoms[2];
        
                /*
                if(XInitThreads() == 0){
       t@@ -335,14 +336,6 @@ xattach(char *label)
                        &attr                /* attributes (the above aren't?!) */
                );
        
       -        if(!XGetWindowAttributes(_x.display, _x.drawable, &wattr))
       -                fprint(2, "XGetWindowAttributes failed\n");
       -        else if(wattr.width && wattr.height){
       -                r.max.x = wattr.width;
       -                r.max.y = wattr.height;
       -                if(0) fprint(2, "new rect %dx%d\n", r.max.x, r.max.y);
       -        }
       -
                /*
                 * Label and other properties required by ICCCCM.
                 */
       t@@ -385,6 +378,40 @@ xattach(char *label)
                XFlush(_x.display);
        
                /*
       +         * Look up clipboard atom.
       +         */
       +        _x.clipboard = XInternAtom(_x.display, "CLIPBOARD", False);
       +        _x.utf8string = XInternAtom(_x.display, "UTF8_STRING", False);
       +        _x.targets = XInternAtom(_x.display, "TARGETS", False);
       +        _x.text = XInternAtom(_x.display, "TEXT", False);
       +        _x.compoundtext = XInternAtom(_x.display, "COMPOUND_TEXT", False);
       +        _x.takefocus = XInternAtom(_x.display, "WM_TAKE_FOCUS", False);
       +        _x.losefocus = XInternAtom(_x.display, "_9WM_LOSE_FOCUS", False);
       +        _x.wmprotos = XInternAtom(_x.display, "WM_PROTOCOLS", False);
       +
       +        atoms[0] = _x.takefocus;
       +        atoms[1] = _x.losefocus;
       +        XChangeProperty(_x.display, _x.drawable, _x.wmprotos, XA_ATOM, 32,
       +                PropModeReplace, (uchar*)atoms, 2);
       +
       +        /*
       +         * Put the window on the screen, check to see what size we actually got.
       +         */
       +        XMapWindow(_x.display, _x.drawable);
       +        XSync(_x.display, False);
       +
       +        if(!XGetWindowAttributes(_x.display, _x.drawable, &wattr))
       +                fprint(2, "XGetWindowAttributes failed\n");
       +        else if(wattr.width && wattr.height){
       +                if(wattr.width != Dx(r) || wattr.height != Dy(r)){
       +                        r.max.x = wattr.width;
       +                        r.max.y = wattr.height;
       +                }
       +                        fprint(2, "new rect %dx%d\n", r.max.x, r.max.y);
       +        }else
       +                fprint(2, "bad attrs\n");
       +
       +        /*
                 * Allocate our local backing store.
                 */
                _x.screenr = r;
       t@@ -410,21 +437,6 @@ xattach(char *label)
                XFreePixmap(_x.display, pmid);
        
                /*
       -         * Put the window on the screen.
       -         */
       -        XMapWindow(_x.display, _x.drawable);
       -        XFlush(_x.display);
       -
       -        /*
       -         * Look up clipboard atom.
       -         */
       -        _x.clipboard = XInternAtom(_x.display, "CLIPBOARD", False);
       -        _x.utf8string = XInternAtom(_x.display, "UTF8_STRING", False);
       -        _x.targets = XInternAtom(_x.display, "TARGETS", False);
       -        _x.text = XInternAtom(_x.display, "TEXT", False);
       -        _x.compoundtext = XInternAtom(_x.display, "COMPOUND_TEXT", False);
       -
       -        /*
                 * Lots of display connections for various procs.
                 */
                _x.kbdcon        = XOpenDisplay(NULL);
   DIR diff --git a/src/libdraw/x11-memdraw.h b/src/libdraw/x11-memdraw.h
       t@@ -69,6 +69,9 @@ struct Xprivate {
                Atom                targets;
                Atom                text;
                Atom                compoundtext;
       +        Atom                takefocus;
       +        Atom                losefocus;
       +        Atom                wmprotos;
                uint                putsnarf;
                uint                assertsnarf;
                int                destroyed;
   DIR diff --git a/src/libdraw/x11-mouse.c b/src/libdraw/x11-mouse.c
       t@@ -8,6 +8,9 @@
        #include <memdraw.h>
        #include "x11-memdraw.h"
        
       +int _windowhasfocus = 1;
       +int _wantfocuschanges;
       +
        void
        moveto(Mousectl *m, Point pt)
        {
       t@@ -48,6 +51,7 @@ void
        _ioproc(void *arg)
        {
                int fd, one;
       +        Atom a;
                ulong mask;
                Mouse m;
                Mousectl *mc;
       t@@ -99,6 +103,20 @@ _ioproc(void *arg)
                                 */
                                mc->m = m;
                                break;
       +                case ClientMessage:
       +                        if(xevent.xclient.message_type == _x.wmprotos){
       +                                a = xevent.xclient.data.l[0];
       +                                if(_wantfocuschanges && a == _x.takefocus){
       +                                        _windowhasfocus = 1;
       +                                        _x.newscreenr = _x.screenr;
       +                                        nbsend(mc->resizec, &one);
       +                                }else if(_wantfocuschanges && a == _x.losefocus){
       +                                        _windowhasfocus = 0;
       +                                        _x.newscreenr = _x.screenr;
       +                                        nbsend(mc->resizec, &one);
       +                                }
       +                        }
       +                        break;
                        }
                }
        }
       t@@ -124,3 +142,25 @@ setcursor(Mousectl *mc, Cursor *c)
                _xsetcursor(c);
        }
        
       +void
       +bouncemouse(Mouse *m)
       +{
       +        XButtonEvent e;
       +
       +        e.type = ButtonPress;
       +        e.window = DefaultRootWindow(_x.display);
       +        e.state = 0;
       +        e.button = 0;
       +        if(m->buttons&1)
       +                e.button = 1;
       +        else if(m->buttons&2)
       +                e.button = 2;
       +        else if(m->buttons&4)
       +                e.button = 3;
       +        e.x = m->xy.x;
       +        e.y = m->xy.y;
       +#undef time
       +        e.time = CurrentTime;
       +        XSendEvent(_x.display, e.window, True, ButtonPressMask, (XEvent*)&e);
       +        XFlush(_x.display);
       +}