--- old/src/share/classes/java/awt/Window.java 2012-01-31 21:41:33.000000000 +0300 +++ new/src/share/classes/java/awt/Window.java 2012-01-31 21:41:33.000000000 +0300 @@ -3856,7 +3856,8 @@ Graphics gg = g.create(); try { if (gg instanceof Graphics2D) { - gg.setColor(getBackground()); + Color bgColor = ((SunToolkit)Toolkit.getDefaultToolkit()).getLayerBackground(this); + gg.setColor(bgColor); ((Graphics2D)gg).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC)); gg.fillRect(0, 0, getWidth(), getHeight()); } --- old/src/share/classes/sun/awt/SunToolkit.java 2012-01-31 21:41:34.000000000 +0300 +++ new/src/share/classes/sun/awt/SunToolkit.java 2012-01-31 21:41:34.000000000 +0300 @@ -2024,6 +2024,18 @@ } /** + * Returns the background color of the window on X11 and Windows systems. + * + * On Mac platforms this method is overriden in LWCToolkit to return + * purely transparent color for non-opaque windows as we need to draw + * pure transparent pixel into a CALayer as the background color to + * implement translucent windows. + */ + public Color getLayerBackground(Window w) { + return w.getBackground(); + } + + /** * Descendants of the SunToolkit should override and put their own logic here. */ public int getNumberOfButtons(){ --- old/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java 2012-01-31 21:41:35.000000000 +0300 +++ new/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java 2012-01-31 21:41:35.000000000 +0300 @@ -720,6 +720,15 @@ } @Override + public Color getLayerBackground(Window w) { + if (!w.isOpaque()) { + return new Color(0f, 0f, 0f, 0f); + } else { + return w.getBackground(); + } + } + + @Override public boolean enableInputMethodsForTextComponent() { return true; } --- old/src/macosx/classes/sun/lwawt/LWWindowPeer.java 2012-01-31 21:41:36.000000000 +0300 +++ new/src/macosx/classes/sun/lwawt/LWWindowPeer.java 2012-01-31 21:41:36.000000000 +0300 @@ -1161,4 +1161,11 @@ private boolean isGrabbing() { return this == grabbingWindow; } + + @Override + public void setBackground(final Color c) { + // draw pure transparent pixels into the CALayer as the background color + Color bgColor = ((SunToolkit)Toolkit.getDefaultToolkit()).getLayerBackground(getTarget()); + super.setBackground(bgColor); + } } --- old/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java 2012-01-31 21:41:37.000000000 +0300 +++ new/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java 2012-01-31 21:41:37.000000000 +0300 @@ -604,8 +604,9 @@ public void setOpaque(boolean isOpaque) { CWrapper.NSWindow.setOpaque(getNSWindowPtr(), isOpaque); if (!isOpaque) { - long clearColor = CWrapper.NSColor.clearColor(); - CWrapper.NSWindow.setBackgroundColor(getNSWindowPtr(), clearColor); + float[] bgValues = target.getBackground().getComponents(null); + CWrapper.NSWindow.setBackgroundColor(getNSWindowPtr(), + bgValues[0], bgValues[1], bgValues[2], bgValues[3]); } } --- old/src/macosx/classes/sun/lwawt/macosx/CWrapper.java 2012-01-31 21:41:38.000000000 +0300 +++ new/src/macosx/classes/sun/lwawt/macosx/CWrapper.java 2012-01-31 21:41:38.000000000 +0300 @@ -63,7 +63,8 @@ public static native void setAlphaValue(long window, float alpha); public static native void setOpaque(long window, boolean opaque); - public static native void setBackgroundColor(long window, long color); + public static native void setBackgroundColor(long window, float red, float green, + float blue, float alpha); public static native void miniaturize(long window); public static native void deminiaturize(long window); @@ -95,8 +96,4 @@ public static native Rectangle2D visibleFrame(long screen); public static native long screenByDisplayId(int displayID); } - - public static final class NSColor { - public static native long clearColor(); - } } --- old/src/macosx/native/sun/awt/CWrapper.m 2012-01-31 21:41:39.000000000 +0300 +++ new/src/macosx/native/sun/awt/CWrapper.m 2012-01-31 21:41:39.000000000 +0300 @@ -359,17 +359,21 @@ /* * Class: sun_lwawt_macosx_CWrapper$NSWindow * Method: setBackgroundColor - * Signature: (J)V + * Signature: (JFFFF)V */ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setBackgroundColor -(JNIEnv *env, jclass cls, jlong windowPtr, jlong colorPtr) +(JNIEnv *env, jclass cls, jlong windowPtr, + jfloat red, jfloat green, jfloat blue, jfloat alpha) { JNF_COCOA_ENTER(env); AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr); - NSColor *color = (NSColor *)jlong_to_ptr(colorPtr); [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ + NSColor *color = [NSColor colorWithCalibratedRed:(CGFloat)red + green:(CGFloat)green + blue:(CGFloat)blue + alpha:(CGFloat)alpha]; [window setBackgroundColor:color]; }]; @@ -714,26 +718,3 @@ return screenPtr; } - -/* - * Class: sun_lwawt_macosx_CWrapper$NSColor - * Method: clearColor - * Signature: ()J - */ -JNIEXPORT jlong JNICALL -Java_sun_lwawt_macosx_CWrapper_00024NSColor_clearColor -(JNIEnv *env, jclass cls) -{ - __block jlong clearColorPtr = 0L; - -JNF_COCOA_ENTER(env); - - [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ - clearColorPtr = ptr_to_jlong([NSColor clearColor]); - }]; - -JNF_COCOA_EXIT(env); - - return clearColorPtr; -} -