# HG changeset patch # User yan # Date 1252482539 25200 # Node ID 661e062b89a548a176d21f9ae745a227f0339545 # Parent 28d38a07292c60fca86730cf356160a3db6c70a8# Parent 81c02474a2c96779b7b41ffe0b1bb92f0a2843e0 Merge diff -r 28d38a07292c -r 661e062b89a5 jdk/src/share/classes/java/awt/Component.java --- a/jdk/src/share/classes/java/awt/Component.java Thu Sep 03 10:53:04 2009 -0700 +++ b/jdk/src/share/classes/java/awt/Component.java Wed Sep 09 00:48:59 2009 -0700 @@ -6665,6 +6665,9 @@ Container parent = this.parent; if (parent != null && parent.peer instanceof LightweightPeer) { relocateComponent(); + if (!isRecursivelyVisible()) { + peer.setVisible(false); + } } } invalidate(); @@ -9572,6 +9575,13 @@ return comp.getPeer(); } } + // traversing the hierarchy up to the closest HW container; + // further traversing may return a component that is not actually + // a native sibling of this component and this kind of z-order + // request may not be allowed by the underlying system (6852051). + if (!cont.isLightweight()) { + break; + } indexAbove = cont.getSiblingIndexAbove(); cont = cont.getContainer(); diff -r 28d38a07292c -r 661e062b89a5 jdk/src/solaris/classes/sun/awt/X11/XErrorHandler.java --- a/jdk/src/solaris/classes/sun/awt/X11/XErrorHandler.java Thu Sep 03 10:53:04 2009 -0700 +++ b/jdk/src/solaris/classes/sun/awt/X11/XErrorHandler.java Wed Sep 09 00:48:59 2009 -0700 @@ -71,8 +71,8 @@ return super.handleError(display, err); } // Shared instance - private static IgnoreBadWindowHandler theInstance = new IgnoreBadWindowHandler(); - public static IgnoreBadWindowHandler getInstance() { + private static VerifyChangePropertyHandler theInstance = new VerifyChangePropertyHandler(); + public static VerifyChangePropertyHandler getInstance() { return theInstance; } } diff -r 28d38a07292c -r 661e062b89a5 jdk/src/solaris/classes/sun/awt/X11/XKeysym.java --- a/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java Thu Sep 03 10:53:04 2009 -0700 +++ b/jdk/src/solaris/classes/sun/awt/X11/XKeysym.java Wed Sep 09 00:48:59 2009 -0700 @@ -354,6 +354,7 @@ keysym2UCSHash.put( (long)0xFFB7, (char)0x0037); // XK_KP_7 --> DIGIT SEVEN keysym2UCSHash.put( (long)0xFFB8, (char)0x0038); // XK_KP_8 --> DIGIT EIGHT keysym2UCSHash.put( (long)0xFFB9, (char)0x0039); // XK_KP_9 --> DIGIT NINE + keysym2UCSHash.put( (long)0xFE20, (char)0x0009); // XK_ISO_Left_Tab --> keysym2UCSHash.put( (long)0x1a1, (char)0x0104); // XK_Aogonek --> LATIN CAPITAL LETTER A WITH OGONEK keysym2UCSHash.put( (long)0x1a2, (char)0x02d8); // XK_breve --> BREVE keysym2UCSHash.put( (long)0x1a3, (char)0x0141); // XK_Lstroke --> LATIN CAPITAL LETTER L WITH STROKE diff -r 28d38a07292c -r 661e062b89a5 jdk/src/solaris/classes/sun/awt/X11/XToolkit.java --- a/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Thu Sep 03 10:53:04 2009 -0700 +++ b/jdk/src/solaris/classes/sun/awt/X11/XToolkit.java Wed Sep 09 00:48:59 2009 -0700 @@ -166,6 +166,9 @@ } public static void RESTORE_XERROR_HANDLER() { + // wait until all requests are processed by the X server + // and only then uninstall the error handler + XSync(); current_error_handler = null; } diff -r 28d38a07292c -r 661e062b89a5 jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h --- a/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h Thu Sep 03 10:53:04 2009 -0700 +++ b/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h Wed Sep 09 00:48:59 2009 -0700 @@ -649,7 +649,7 @@ 0x0000 #define XK_ISO_Last_Group 0xFE0E 0x0000 #define XK_ISO_Last_Group_Lock 0xFE0F -0x0000 #define XK_ISO_Left_Tab 0xFE20 +0x0009 #define XK_ISO_Left_Tab 0xFE20 0x0000 #define XK_ISO_Move_Line_Up 0xFE21 0x0000 #define XK_ISO_Move_Line_Down 0xFE22 0x0000 #define XK_ISO_Partial_Line_Up 0xFE23 diff -r 28d38a07292c -r 661e062b89a5 jdk/src/windows/native/sun/windows/awt_Dialog.cpp --- a/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Thu Sep 03 10:53:04 2009 -0700 +++ b/jdk/src/windows/native/sun/windows/awt_Dialog.cpp Wed Sep 09 00:48:59 2009 -0700 @@ -364,6 +364,7 @@ if (locationByPlatform) { moveToDefaultLocation(); } + EnableTranslucency(TRUE); if (IsFocusableWindow() && (IsAutoRequestFocus() || IsFocusedWindowModalBlocker())) { ::ShowWindow(GetHWnd(), SW_SHOW); } else { diff -r 28d38a07292c -r 661e062b89a5 jdk/src/windows/native/sun/windows/awt_Frame.cpp --- a/jdk/src/windows/native/sun/windows/awt_Frame.cpp Thu Sep 03 10:53:04 2009 -0700 +++ b/jdk/src/windows/native/sun/windows/awt_Frame.cpp Wed Sep 09 00:48:59 2009 -0700 @@ -690,6 +690,8 @@ if (locationByPlatform) { moveToDefaultLocation(); } + EnableTranslucency(TRUE); + BOOL autoRequestFocus = IsAutoRequestFocus(); if (m_iconic) { diff -r 28d38a07292c -r 661e062b89a5 jdk/src/windows/native/sun/windows/awt_Window.cpp --- a/jdk/src/windows/native/sun/windows/awt_Window.cpp Thu Sep 03 10:53:04 2009 -0700 +++ b/jdk/src/windows/native/sun/windows/awt_Window.cpp Wed Sep 09 00:48:59 2009 -0700 @@ -218,12 +218,7 @@ if (warningString != NULL) { delete [] warningString; } - ::EnterCriticalSection(&contentBitmapCS); - if (hContentBitmap != NULL) { - ::DeleteObject(hContentBitmap); - hContentBitmap = NULL; - } - ::LeaveCriticalSection(&contentBitmapCS); + DeleteContentBitmap(); ::DeleteCriticalSection(&contentBitmapCS); } @@ -372,6 +367,10 @@ } } + if (wp->flags & SWP_HIDEWINDOW) { + EnableTranslucency(FALSE); + } + return mrDoDefault; } @@ -1130,6 +1129,8 @@ moveToDefaultLocation(); } + EnableTranslucency(TRUE); + // The following block exists to support Menu/Tooltip animation for // Swing programs in a way which avoids introducing any new public api into // AWT or Swing. @@ -2494,27 +2495,73 @@ } } -void AwtWindow::SetTranslucency(BYTE opacity, BOOL opaque) +// Deletes the hContentBitmap if it is non-null +void AwtWindow::DeleteContentBitmap() +{ + ::EnterCriticalSection(&contentBitmapCS); + if (hContentBitmap != NULL) { + ::DeleteObject(hContentBitmap); + hContentBitmap = NULL; + } + ::LeaveCriticalSection(&contentBitmapCS); +} + +// The effects are enabled only upon showing the window. +// See 6780496 for details. +void AwtWindow::EnableTranslucency(BOOL enable) { - BYTE old_opacity = getOpacity(); - BOOL old_opaque = isOpaque(); + if (enable) { + SetTranslucency(getOpacity(), isOpaque(), FALSE, TRUE); + } else { + SetTranslucency(0xFF, TRUE, FALSE); + } +} + +/** + * Sets the translucency effects. + * + * This method is used to: + * + * 1. Apply the translucency effects upon showing the window + * (setValues == FALSE, useDefaultForOldValues == TRUE); + * 2. Turn off the effects upon hiding the window + * (setValues == FALSE, useDefaultForOldValues == FALSE); + * 3. Set the effects per user's request + * (setValues == TRUE, useDefaultForOldValues == FALSE); + * + * In case #3 the effects may or may not be applied immediately depending on + * the current visibility status of the window. + * + * The setValues argument indicates if we need to preserve the passed values + * in local fields for further use. + * The useDefaultForOldValues argument indicates whether we should consider + * the window as if it has not any effects applied at the moment. + */ +void AwtWindow::SetTranslucency(BYTE opacity, BOOL opaque, BOOL setValues, + BOOL useDefaultForOldValues) +{ + BYTE old_opacity = useDefaultForOldValues ? 0xFF : getOpacity(); + BOOL old_opaque = useDefaultForOldValues ? TRUE : isOpaque(); if (opacity == old_opacity && opaque == old_opaque) { return; } - setOpacity(opacity); - setOpaque(opaque); + if (setValues) { + m_opacity = opacity; + m_opaque = opaque; + } + + // If we're invisible and are storing the values, return + // Otherwise, apply the effects immediately + if (!IsVisible() && setValues) { + return; + } HWND hwnd = GetHWnd(); if (opaque != old_opaque) { - ::EnterCriticalSection(&contentBitmapCS); - if (hContentBitmap != NULL) { - ::DeleteObject(hContentBitmap); - hContentBitmap = NULL; - } - ::LeaveCriticalSection(&contentBitmapCS); + DeleteContentBitmap(); } if (opaque && opacity == 0xff) { @@ -2634,9 +2681,7 @@ } ::EnterCriticalSection(&contentBitmapCS); - if (hContentBitmap != NULL) { - ::DeleteObject(hContentBitmap); - } + DeleteContentBitmap(); hContentBitmap = hBitmap; contentWidth = width; contentHeight = height; diff -r 28d38a07292c -r 661e062b89a5 jdk/src/windows/native/sun/windows/awt_Window.h --- a/jdk/src/windows/native/sun/windows/awt_Window.h Thu Sep 03 10:53:04 2009 -0700 +++ b/jdk/src/windows/native/sun/windows/awt_Window.h Wed Sep 09 00:48:59 2009 -0700 @@ -262,32 +262,29 @@ // from its hierarchy when shown. Currently applied to instances of // javax/swing/Popup$HeavyWeightWindow class. + // SetTranslucency() is the setter for the following two fields BYTE m_opacity; // The opacity level. == 0xff by default (when opacity mode is disabled) BOOL m_opaque; // Whether the window uses the perpixel translucency (false), or not (true). inline BYTE getOpacity() { return m_opacity; } - inline void setOpacity(BYTE opacity) { - m_opacity = opacity; - } inline BOOL isOpaque() { return m_opaque; } - inline void setOpaque(BOOL opaque) { - m_opaque = opaque; - } CRITICAL_SECTION contentBitmapCS; HBITMAP hContentBitmap; UINT contentWidth; UINT contentHeight; - void SetTranslucency(BYTE opacity, BOOL opaque); + void SetTranslucency(BYTE opacity, BOOL opaque, BOOL setValues = TRUE, + BOOL useDefaultForOldValues = FALSE); void UpdateWindow(int width, int height, HBITMAP hBitmap); void UpdateWindowImpl(int width, int height, HBITMAP hBitmap); void RedrawWindow(); + void DeleteContentBitmap(); static UINT untrustedWindowsCounter; @@ -352,6 +349,8 @@ UINT currentWmSizeState; + void EnableTranslucency(BOOL enable); + private: int m_screenNum;