tdevdraw/OSX: flush to screen in background, fix resize bug - 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 d69cf634a800f2c05dc7fe96b6fed1eb960b7853
 (DIR) parent 607880ce788bbfb8585271af117a52e9359324dd
 (HTM) Author: Russ Cox <rsc@swtch.com>
       Date:   Wed,  8 Oct 2008 15:00:02 -0700
       
       devdraw/OSX: flush to screen in background, fix resize bug
       
       Diffstat:
         M src/cmd/devdraw/osx-screen.c        |      37 +++++++++++++++++++++++++++++--
       
       1 file changed, 35 insertions(+), 2 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/devdraw/osx-screen.c b/src/cmd/devdraw/osx-screen.c
       t@@ -50,6 +50,8 @@ struct {
                CGImageRef image;
                CGContextRef windowctx;
                PasteboardRef snarf;
       +        int needflush;
       +        QLock flushlock;
        } osx;
        
        enum
       t@@ -319,6 +321,8 @@ mouseevent(EventRef event)
                        
                        // OS X swaps button 2 and 3
                        but = (but & ~6) | ((but & 4)>>1) | ((but&2)<<1);
       +
       +                but = mouseswap(but);
                        
                        // Apply keyboard modifiers and pretend it was a real mouse button.
                        // (Modifiers typed while holding the button go into kbuttons,
       t@@ -507,6 +511,29 @@ eresized(int new)
                osx.image = image;
                osx.screenimage = m;
                osx.screenr = r;
       +        
       +        // I'm not 100% sure why this is necessary
       +        // but otherwise some resizes (esp. vertical ones)
       +        // stop updating the screen.
       +        qlock(&osx.flushlock);
       +        QDEndCGContext(GetWindowPort(osx.window), &osx.windowctx);
       +        osx.windowctx = nil;
       +        qunlock(&osx.flushlock);
       +}
       +
       +void
       +flushproc(void *v)
       +{
       +        for(;;){
       +                if(osx.needflush && osx.windowctx && canqlock(&osx.flushlock)){
       +                        if(osx.windowctx){
       +                                CGContextFlush(osx.windowctx);
       +                                osx.needflush = 0;
       +                        }
       +                        qunlock(&osx.flushlock);
       +                }
       +                usleep(33333);
       +        }
        }
        
        void
       t@@ -515,8 +542,11 @@ _flushmemscreen(Rectangle r)
                CGRect cgr;
                CGImageRef subimg;
        
       -        if(osx.windowctx == nil)
       +        qlock(&osx.flushlock);
       +        if(osx.windowctx == nil){
                        QDBeginCGContext(GetWindowPort(osx.window), &osx.windowctx);
       +                proccreate(flushproc, nil, 256*1024);
       +        }
                
                cgr.origin.x = r.min.x;
                cgr.origin.y = r.min.y;
       t@@ -525,7 +555,8 @@ _flushmemscreen(Rectangle r)
                subimg = CGImageCreateWithImageInRect(osx.image, cgr);
                cgr.origin.y = Dy(osx.screenr) - r.max.y; // XXX how does this make any sense?
                CGContextDrawImage(osx.windowctx, cgr, subimg);
       -        CGContextFlush(osx.windowctx);
       +        osx.needflush = 1;
       +        qunlock(&osx.flushlock);
                CGImageRelease(subimg);
        }
        
       t@@ -536,6 +567,7 @@ fullscreen(void)
                static WindowRef oldwindow;
                GDHandle device;
        
       +        qlock(&osx.flushlock);
                if(osx.isfullscreen){
                        if(osx.windowctx){
                                QDEndCGContext(GetWindowPort(osx.window), &osx.windowctx);
       t@@ -557,6 +589,7 @@ fullscreen(void)
                        osx.isfullscreen = 1;
                        osx.fullscreentime = msec();
                }
       +        qunlock(&osx.flushlock);
                eresized(1);
        }