Merge
authoryan
Wed, 09 Sep 2009 00:48:59 -0700
changeset 3731 661e062b89a5
parent 3703 28d38a07292c (current diff)
parent 3730 81c02474a2c9 (diff)
child 3753 c0c9b5f2c874
Merge
--- 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();
--- 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;
         }
     }
--- 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 --> <control>
         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
--- 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;
     }
 
--- 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
--- 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 {
--- 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) {
--- 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;
--- 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;