From 2f986f2052144764d698da05a178d22c4754b563 Mon Sep 17 00:00:00 2001 From: Kenneth Russel Date: Tue, 6 Jan 2009 08:13:09 +0000 Subject: Added GLCapabilities.setBackgroundOpaque() and isBackgroundOpaque() for shaped window support on Mac OS X, and modified MacOSXCGLContext to pay attention to this bit. Changed Mac OS X port of Newt to make window non-opaque if borderless, and still allow it to receive the keyboard focus. git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/svn-server-sync/jogl/branches/JOGL_2_SANDBOX@1841 232f8b59-042b-4e1e-8c03-345bb8c30851 --- .../opengl/impl/macosx/cgl/MacOSXCGLContext.java | 5 ++++ src/classes/javax/media/opengl/GLCapabilities.java | 28 ++++++++++++++++++++++ src/native/newt/MacWindow.m | 7 ++++++ src/native/newt/NewtMacWindow.m | 7 ++++++ 4 files changed, 47 insertions(+) (limited to 'src') diff --git a/src/classes/com/sun/opengl/impl/macosx/cgl/MacOSXCGLContext.java b/src/classes/com/sun/opengl/impl/macosx/cgl/MacOSXCGLContext.java index 13629945e..5c1a05e6b 100644 --- a/src/classes/com/sun/opengl/impl/macosx/cgl/MacOSXCGLContext.java +++ b/src/classes/com/sun/opengl/impl/macosx/cgl/MacOSXCGLContext.java @@ -158,6 +158,11 @@ public abstract class MacOSXCGLContext extends GLContextImpl throw new GLException("Error creating NSOpenGLContext with requested pixel format"); } + if (!pbuffer && !capabilities.isBackgroundOpaque()) { + // Set the context opacity + CGL.setContextOpacity(nsContext, 0); + } + // On this platform the pixel format is associated with the // context and not the drawable. However it's a reasonable // approximation to just store the chosen pixel format up in the diff --git a/src/classes/javax/media/opengl/GLCapabilities.java b/src/classes/javax/media/opengl/GLCapabilities.java index 0a36fe502..8f89f605c 100644 --- a/src/classes/javax/media/opengl/GLCapabilities.java +++ b/src/classes/javax/media/opengl/GLCapabilities.java @@ -65,6 +65,10 @@ public class GLCapabilities implements Cloneable { private boolean sampleBuffers = false; private int numSamples = 2; + // Support for transparent windows containing OpenGL content + // (currently only has an effect on Mac OS X) + private boolean backgroundOpaque = true; + // Bits for pbuffer creation private boolean pbufferFloatingPointBuffers; private boolean pbufferRenderToTexture; @@ -316,6 +320,29 @@ public class GLCapabilities implements Cloneable { return pbufferRenderToTextureRectangle; } + /** For on-screen OpenGL contexts on some platforms, sets whether + the background of the context should be considered opaque. On + supported platforms, setting this to false, in conjunction with + other changes at the window toolkit level, can allow + hardware-accelerated OpenGL content inside of windows of + arbitrary shape. To achieve this effect it is necessary to use + an OpenGL clear color with an alpha less than 1.0. The default + value for this flag is true; setting it to false + may incur a certain performance penalty, so it is not + recommended to arbitrarily set it to false. */ + public void setBackgroundOpaque(boolean opaque) { + backgroundOpaque = opaque; + } + + /** Indicates whether the background of this OpenGL context should + be considered opaque. Defaults to true. + + @see #setBackgroundOpaque + */ + public boolean isBackgroundOpaque() { + return backgroundOpaque; + } + /** Returns a textual representation of this GLCapabilities object. */ public String toString() { @@ -335,6 +362,7 @@ public class GLCapabilities implements Cloneable { ", Alpha Accum: " + accumAlphaBits + ", Multisample: " + sampleBuffers + (sampleBuffers ? ", Num samples: " + numSamples : "") + + ", Opaque: " + backgroundOpaque + " ]"); } } diff --git a/src/native/newt/MacWindow.m b/src/native/newt/MacWindow.m index 5b479e05d..6dca9b93b 100644 --- a/src/native/newt/MacWindow.m +++ b/src/native/newt/MacWindow.m @@ -137,6 +137,13 @@ JNIEXPORT jlong JNICALL Java_com_sun_javafx_newt_macosx_MacWindow_createWindow defer: YES javaWindowObject: windowObj] retain]; + // If the window is undecorated, assume we want the possibility of + // a shaped window, so make it non-opaque and the background color clear + if ((styleMask & NSTitledWindowMask) == 0) { + [window setOpaque: NO]; + [window setBackgroundColor: [NSColor clearColor]]; + } + // Immediately re-position the window based on an upper-left coordinate system setFrameTopLeftPoint(window, x, y); diff --git a/src/native/newt/NewtMacWindow.m b/src/native/newt/NewtMacWindow.m index 5655f2fa6..d0cf6ad15 100644 --- a/src/native/newt/NewtMacWindow.m +++ b/src/native/newt/NewtMacWindow.m @@ -82,6 +82,13 @@ static JNIEnv* env = NULL; return res; } +- (BOOL) canBecomeKeyWindow +{ + // Even if the window is borderless, we still want it to be able + // to become the key window to receive keyboard events + return YES; +} + static jint mods2JavaMods(NSUInteger mods) { int javaMods = 0; -- cgit v1.2.3