Fix a crash with CALayers/OSX when running on Java 7

This commit is contained in:
kappaOne 2013-04-13 18:14:32 -07:00
parent ca39cb3cdb
commit 2bbd7ebe5b
2 changed files with 18 additions and 3 deletions

View File

@ -139,7 +139,11 @@ static MacOSXPeerInfo *peer_info;
} }
else { else {
if (peer_info->isCALayer) { if (peer_info->isCALayer) {
[peer_info->glLayer removeLayer]; peer_info->isCALayer = false;
[peer_info->glLayer removeLayer];
[peer_info->glLayer release];
peer_info->glLayer = nil;
return;
} }
if (window_info->window != nil) { if (window_info->window != nil) {
@ -627,6 +631,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nDestroyCALayer(JNIEn
peer_info->isCALayer = false; peer_info->isCALayer = false;
[peer_info->glLayer performSelectorOnMainThread:@selector(removeLayer) withObject:nil waitUntilDone:YES]; [peer_info->glLayer performSelectorOnMainThread:@selector(removeLayer) withObject:nil waitUntilDone:YES];
[peer_info->glLayer release]; [peer_info->glLayer release];
peer_info->glLayer = nil;
} }
} }

View File

@ -118,10 +118,12 @@ JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXCanvasPeerInfo_nInitHandle
- (void) removeLayer { - (void) removeLayer {
// finish any pending blits before destroying the offscreen window to prevent crashes // finish any pending blits before destroying the offscreen window to prevent crashes
glFinish(); glFinish();
// destroy offscreen Display window
[self destroyWindow];
// remove self from root layer // remove self from root layer
id <JAWT_SurfaceLayers> surfaceLayers = (id <JAWT_SurfaceLayers>)macosx_dsi; [self removeFromSuperlayer];
surfaceLayers.layer = nil;
} }
- (void)setNeedsLayout { - (void)setNeedsLayout {
@ -152,6 +154,14 @@ JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXCanvasPeerInfo_nInitHandle
[window_info->window orderOut:nil]; [window_info->window orderOut:nil];
} }
- (void) destroyWindow {
if (window_info->window != nil) {
[window_info->view removeFromSuperviewWithoutNeedingDisplay];
[window_info->window close];
window_info->window = nil;
}
}
- (void) blitFrameBuffer { - (void) blitFrameBuffer {
// get the size of the CALayer/AWT Canvas // get the size of the CALayer/AWT Canvas