aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@swtch.com>2008-10-08 15:00:02 -0700
committerRuss Cox <rsc@swtch.com>2008-10-08 15:00:02 -0700
commitd69cf634a800f2c05dc7fe96b6fed1eb960b7853 (patch)
tree98070957db4b5d6e15c7e95e95f1d9af5c1a2492
parent607880ce788bbfb8585271af117a52e9359324dd (diff)
downloadplan9port-d69cf634a800f2c05dc7fe96b6fed1eb960b7853.tar.gz
plan9port-d69cf634a800f2c05dc7fe96b6fed1eb960b7853.tar.bz2
plan9port-d69cf634a800f2c05dc7fe96b6fed1eb960b7853.zip
devdraw/OSX: flush to screen in background, fix resize bug
-rw-r--r--src/cmd/devdraw/osx-screen.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/src/cmd/devdraw/osx-screen.c b/src/cmd/devdraw/osx-screen.c
index 5764fe70..4b1f6ede 100644
--- a/src/cmd/devdraw/osx-screen.c
+++ b/src/cmd/devdraw/osx-screen.c
@@ -50,6 +50,8 @@ struct {
CGImageRef image;
CGContextRef windowctx;
PasteboardRef snarf;
+ int needflush;
+ QLock flushlock;
} osx;
enum
@@ -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,
@@ -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
@@ -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;
@@ -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);
}
@@ -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);
@@ -557,6 +589,7 @@ fullscreen(void)
osx.isfullscreen = 1;
osx.fullscreentime = msec();
}
+ qunlock(&osx.flushlock);
eresized(1);
}