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); }