URI: 
       tdevdraw: add F11 for full-screen toggle - 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 35288690ce41267ae9c6341e1d73f74c56726297
   DIR parent 54dd92bebc97da7efb955f703c20cac8f4cbbb9f
  HTML Author: Russ Cox <rsc@swtch.com>
       Date:   Wed, 30 Jan 2008 12:01:43 -0500
       
       devdraw: add F11 for full-screen toggle
       
       Diffstat:
         M src/cmd/devdraw/devdraw.c           |      13 ++++++++++---
         M src/cmd/devdraw/x11-inc.h           |       3 +++
         M src/cmd/devdraw/x11-init.c          |      20 ++++++++++++++++++--
         M src/cmd/devdraw/x11-memdraw.h       |       3 +++
         M src/cmd/devdraw/x11-srv.c           |      41 ++++++++++++++++++++++++++++++-
         M src/cmd/devdraw/x11-wsys.c          |       5 ++++-
       
       6 files changed, 78 insertions(+), 7 deletions(-)
       ---
   DIR diff --git a/src/cmd/devdraw/devdraw.c b/src/cmd/devdraw/devdraw.c
       t@@ -294,11 +294,18 @@ static
        void
        drawflush(void)
        {
       -        if(flushrect.min.x < flushrect.max.x)
       -                _flushmemscreen(flushrect);
       +        _flushmemscreen(flushrect);
                flushrect = Rect(10000, 10000, -10000, -10000);
        }
        
       +void
       +xdrawflush(void)
       +{
       +        qlock(&sdraw.lk);
       +        drawflush();
       +        qunlock(&sdraw.lk);
       +}
       +
        static
        int
        drawcmp(char *a, char *b, int n)
       t@@ -791,7 +798,7 @@ _drawmsgwrite(void *v, int n)
        
                while((n-=m) > 0){
                        a += m;
       -/*fprint(2, "msgwrite %d(%d)...", n, *a); */
       +/* print("msgwrite %d(%c)...", n, *a); */
                        switch(*a){
                        default:
        /*fprint(2, "bad command %d\n", *a); */
   DIR diff --git a/src/cmd/devdraw/x11-inc.h b/src/cmd/devdraw/x11-inc.h
       t@@ -16,6 +16,9 @@
        #include <X11/keysym.h>
        #include <X11/IntrinsicP.h>
        #include <X11/StringDefs.h>
       +#ifdef SHOWEVENT
       +#include "../rio/showevent/ShowEvent.c"
       +#endif
        
        #undef Colormap
        #undef Cursor
   DIR diff --git a/src/cmd/devdraw/x11-init.c b/src/cmd/devdraw/x11-init.c
       t@@ -253,6 +253,8 @@ _xattach(char *label, char *winsize)
                        }
                        havemin = 0;
                }
       +        screenrect = Rect(0, 0, WidthOfScreen(xscreen), HeightOfScreen(xscreen));
       +        windowrect = r;
        
                memset(&attr, 0, sizeof attr);
                attr.colormap = _x.cmap;
       t@@ -687,9 +689,25 @@ _xconfigure(XEvent *e)
                Rectangle r;
                XConfigureEvent *xe = (XConfigureEvent*)e;
        
       +        if(!fullscreen){
       +                // I can't figure this out: apparently window managers
       +                // (e.g., rio, twm) send ConfigureEvents using absolute
       +                // screen coordinates, but X sends events using coordinates
       +                // relative to the parent window.  
       +                if(xe->send_event)
       +                        windowrect = Rect(xe->x, xe->y, xe->x+xe->width, xe->y+xe->height);
       +                else{
       +                        int rx, ry;
       +                        XWindow w;
       +                        if(XTranslateCoordinates(_x.display, _x.drawable, DefaultRootWindow(_x.display), xe->x, xe->y, &rx, &ry, &w))
       +                                windowrect = Rect(rx, ry, rx+xe->width, ry+xe->height);
       +                }
       +        }
       +
                if(xe->width == Dx(_x.screenr) && xe->height == Dy(_x.screenr))
                        return 0;
                r = Rect(0, 0, xe->width, xe->height);
       +
                qlock(&_x.screenlock);
                if(_x.screenpm != _x.nextscreenpm){
                        XCopyArea(_x.display, _x.screenpm, _x.drawable, _x.gccopy, r.min.x, r.min.y,
       t@@ -709,8 +727,6 @@ _xreplacescreenimage(void)
                Rectangle r;
        
                r = _x.newscreenr;
       -        if(eqrect(_x.screenr, r))
       -                return 0;
        
                pixmap = XCreatePixmap(_x.display, _x.drawable, Dx(r), Dy(r), _x.depth);
                m = _xallocmemimage(r, _x.chan, pixmap);
   DIR diff --git a/src/cmd/devdraw/x11-memdraw.h b/src/cmd/devdraw/x11-memdraw.h
       t@@ -111,3 +111,6 @@ extern int                _xreplacescreenimage(void);
                Button2MotionMask|\
                Button3MotionMask)
        
       +extern Rectangle screenrect;
       +extern Rectangle windowrect;
       +extern int fullscreen;
   DIR diff --git a/src/cmd/devdraw/x11-srv.c b/src/cmd/devdraw/x11-srv.c
       t@@ -5,10 +5,16 @@
         * subtle and quick to anger.
         */
        
       +// #define SHOWEVENT
       +
        #include <u.h>
        #include <sys/select.h>
        #include <errno.h>
       +#ifdef SHOWEVENT
       +#include <stdio.h>
       +#endif
        #include "x11-inc.h"
       +
        #include <libc.h>
        #include <draw.h>
        #include <memdraw.h>
       t@@ -86,11 +92,15 @@ int fdnoblock(int);
        
        int chatty;
        int drawsleep;
       +int fullscreen;
       +
       +Rectangle windowrect;
       +Rectangle screenrect;
        
        void
        usage(void)
        {
       -        fprint(2, "usage: devdraw (don't run  directly)\n");
       +        fprint(2, "usage: devdraw (don't run directly)\n");
                exits("usage");
        }
        
       t@@ -121,6 +131,9 @@ main(int argc, char **argv)
                open("/dev/null", OREAD);
                open("/dev/null", OWRITE);
        
       +        /* reopens stdout if debugging */
       +        runxevent(0);
       +
                fmtinstall('W', drawfcallfmt);
        
                ARGBEGIN{
       t@@ -271,6 +284,8 @@ replyerror(Wsysmsg *m)
                replymsg(m);
        }
        
       +
       +
        /* 
         * Handle a single wsysmsg. 
         * Might queue for later (kbd, mouse read)
       t@@ -455,8 +470,26 @@ void
        runxevent(XEvent *xev)
        {
                int c;
       +        KeySym k;
                static Mouse m;
        
       +#ifdef SHOWEVENT
       +        static int first = 1;
       +        if(first){
       +                dup(create("/tmp/devdraw.out", OWRITE, 0666), 1);
       +                setbuf(stdout, 0);
       +                first = 0;
       +        }
       +#endif
       +
       +        if(xev == 0)
       +                return;
       +
       +#ifdef SHOWEVENT
       +        print("\n");
       +        ShowEvent(xev);
       +#endif
       +
                switch(xev->type){
                case Expose:
                        _xexpose(xev);
       t@@ -500,6 +533,12 @@ runxevent(XEvent *xev)
                case KeyPress:
                        if(kbd.stall)
                                return;
       +                XLookupString((XKeyEvent*)xev, NULL, 0, &k, NULL);
       +                if(k == XK_F11){
       +                        fullscreen = !fullscreen;
       +                        _xresizewindow(fullscreen ? screenrect : windowrect);
       +                        return;
       +                }
                        if((c = _xtoplan9kbd(xev)) < 0)
                                return;
                        kbd.r[kbd.wi++] = c;
   DIR diff --git a/src/cmd/devdraw/x11-wsys.c b/src/cmd/devdraw/x11-wsys.c
       t@@ -21,9 +21,12 @@ _xresizewindow(Rectangle r)
                int value_mask;
        
                memset(&e, 0, sizeof e);
       -        value_mask = CWWidth|CWHeight;
       +        value_mask = CWX|CWY|CWWidth|CWHeight;
       +        e.x = r.min.x;
       +        e.y = r.min.y;
                e.width = Dx(r);
                e.height = Dy(r);
                XConfigureWindow(_x.display, _x.drawable, value_mask, &e);
                XFlush(_x.display);
        }
       +