From 284f6135f35de996382e3965bfebbb2ac465d8dc Mon Sep 17 00:00:00 2001 From: kappaOne Date: Sat, 22 Dec 2012 20:20:48 +0000 Subject: [PATCH] Refactoring to prepare for implementing OS X CALayer based Display.setParent, temporarily breaks Display.setParent on Java 7 and Java 6 Applets. --- .../lwjgl/opengl/MacOSXCanvasPeerInfo.java | 7 ++++-- src/java/org/lwjgl/opengl/MacOSXDisplay.java | 5 +++- src/native/macosx/context.h | 3 ++- src/native/macosx/org_lwjgl_opengl_Display.m | 23 +++++++++++++++---- .../org_lwjgl_opengl_MacOSXCanvasPeerInfo.m | 16 +++++++++---- 5 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/java/org/lwjgl/opengl/MacOSXCanvasPeerInfo.java b/src/java/org/lwjgl/opengl/MacOSXCanvasPeerInfo.java index 8aeade7f..684a7a5d 100644 --- a/src/java/org/lwjgl/opengl/MacOSXCanvasPeerInfo.java +++ b/src/java/org/lwjgl/opengl/MacOSXCanvasPeerInfo.java @@ -44,15 +44,18 @@ import org.lwjgl.LWJGLUtil; * $Id$ */ abstract class MacOSXCanvasPeerInfo extends MacOSXPeerInfo { + private final AWTSurfaceLock awt_surface = new AWTSurfaceLock(); + protected MacOSXCanvasPeerInfo(PixelFormat pixel_format, ContextAttribs attribs, boolean support_pbuffer) throws LWJGLException { super(pixel_format, attribs, true, true, support_pbuffer, true); } protected void initHandle(Canvas component) throws LWJGLException { - nInitHandle(getHandle()); + nInitHandle(awt_surface.lockAndGetHandle(component), getHandle()); } - private static native void nInitHandle(ByteBuffer peer_info_handle) throws LWJGLException; + private static native void nInitHandle(ByteBuffer surface_buffer, ByteBuffer peer_info_handle) throws LWJGLException; protected void doUnlock() throws LWJGLException { + awt_surface.unlock(); } } diff --git a/src/java/org/lwjgl/opengl/MacOSXDisplay.java b/src/java/org/lwjgl/opengl/MacOSXDisplay.java index 459080fc..f62e564e 100644 --- a/src/java/org/lwjgl/opengl/MacOSXDisplay.java +++ b/src/java/org/lwjgl/opengl/MacOSXDisplay.java @@ -115,6 +115,9 @@ final class MacOSXDisplay implements DisplayImplementation { boolean resizable = Display.isResizable(); boolean parented = (parent != null) && !fullscreen; + if (parented) this.canvas = parent; + else this.canvas = null; + close_requested = false; DrawableGL gl_drawable = (DrawableGL)Display.getDrawable(); @@ -124,7 +127,7 @@ final class MacOSXDisplay implements DisplayImplementation { window = nCreateWindow(x, y, mode.getWidth(), mode.getHeight(), fullscreen, isUndecorated(), resizable, parented, peer_handle, window); - this.canvas = parent; + if (fullscreen) { // when going to fullscreen viewport is set to screen size by Cocoa, ignore this value diff --git a/src/native/macosx/context.h b/src/native/macosx/context.h index 34a69571..7042e7ad 100644 --- a/src/native/macosx/context.h +++ b/src/native/macosx/context.h @@ -54,7 +54,7 @@ typedef struct { NSRect display_rect; - MacOSXOpenGLView *view; + MacOSXOpenGLView *view; NSOpenGLContext *context; // Native objects for Java callbacks @@ -100,6 +100,7 @@ typedef struct { MacOSXWindowInfo *window_info; NSOpenGLPixelFormat *pixel_format; NSOpenGLPixelBuffer *pbuffer; + NSView *parent; } MacOSXPeerInfo; diff --git a/src/native/macosx/org_lwjgl_opengl_Display.m b/src/native/macosx/org_lwjgl_opengl_Display.m index bea2e93a..a97e3594 100644 --- a/src/native/macosx/org_lwjgl_opengl_Display.m +++ b/src/native/macosx/org_lwjgl_opengl_Display.m @@ -446,9 +446,17 @@ JNIEXPORT jobject JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nCreateWindow(JNIE } if (parented) { - window_info->window = (MacOSXKeyableWindow*)[[NSApplication sharedApplication] mainWindow]; + window_info->window = [peer_info->parent window]; - [window_info->window setContentView:window_info->view]; + if (window_info->window != nil) { + [peer_info->parent addSubview:window_info->view]; + [window_info->view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; + } + else { + // failed to get parent window, create a new window + window_info->window = [[MacOSXKeyableWindow alloc] initWithContentRect:window_info->display_rect styleMask:default_window_mask backing:NSBackingStoreBuffered defer:NO]; + [window_info->window setContentView:window_info->view]; + } } else { window_info->window = [[MacOSXKeyableWindow alloc] initWithContentRect:window_info->display_rect styleMask:default_window_mask backing:NSBackingStoreBuffered defer:NO]; @@ -505,9 +513,16 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXDisplay_nDestroyWindow(JNIEnv if (window_info->fullscreen) { [window_info->view exitFullScreenModeWithOptions: nil]; } - else { + else { if (window_info->window != nil) { - [window_info->window close]; + // if the nsview has no parent then close window + if ([window_info->window contentView] == window_info->view) { + [window_info->window close]; + } + else { + // the nsview has a parent, so remove it from there + [window_info->view removeFromSuperviewWithoutNeedingDisplay]; + } } } diff --git a/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.m b/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.m index 73518e66..4b2483f7 100644 --- a/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.m +++ b/src/native/macosx/org_lwjgl_opengl_MacOSXCanvasPeerInfo.m @@ -42,17 +42,23 @@ //#import #include +#include +#include "awt_tools.h" #include "org_lwjgl_opengl_MacOSXCanvasPeerInfo.h" #include "context.h" #include "common_tools.h" JNIEXPORT void JNICALL Java_org_lwjgl_opengl_MacOSXCanvasPeerInfo_nInitHandle -(JNIEnv *env, jclass clazz, jobject peer_info_handle) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; +(JNIEnv *env, jclass clazz, jobject lock_buffer_handle, jobject peer_info_handle) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; MacOSXPeerInfo *peer_info = (MacOSXPeerInfo *)(*env)->GetDirectBufferAddress(env, peer_info_handle); - - peer_info->isWindowed = true; - + + AWTSurfaceLock *surface = (AWTSurfaceLock *)(*env)->GetDirectBufferAddress(env, lock_buffer_handle); + JAWT_MacOSXDrawingSurfaceInfo *macosx_dsi = (JAWT_MacOSXDrawingSurfaceInfo *)surface->dsi->platformInfo; + peer_info->parent = macosx_dsi->cocoaViewRef; + + peer_info->isWindowed = true; + [pool release]; }