diff --git a/src/share/classes/javax/swing/Popup.java b/src/share/classes/javax/swing/Popup.java
index 2b55aadcf6251a712e19d1b1f7e08a62ccf4556f..0d1f2d53f196d152b81ee536e86bcade1626205d 100644
--- a/src/share/classes/javax/swing/Popup.java
+++ b/src/share/classes/javax/swing/Popup.java
@@ -26,7 +26,9 @@
package javax.swing;
import java.awt.*;
+
import sun.awt.ModalExclude;
+import sun.awt.SunToolkit;
/**
* Popups are used to display a Component to the user, typically
@@ -225,7 +227,12 @@ public class Popup {
HeavyWeightWindow(Window parent) {
super(parent);
setFocusableWindowState(false);
- setName("###overrideRedirect###");
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ if (tk instanceof SunToolkit) {
+ // all the short-lived windows like Popups should be
+ // OverrideRedirect on X11 platforms
+ ((SunToolkit)tk).setOverrideRedirect(this);
+ }
// Popups are typically transient and most likely won't benefit
// from true double buffering. Turn it off here.
getRootPane().setUseTrueDoubleBuffering(false);
diff --git a/src/share/classes/sun/awt/SunToolkit.java b/src/share/classes/sun/awt/SunToolkit.java
index 95a6e7815e1a7e2ae33ef6295730aa4437c137d8..20da8ffe76654f20ef60ec7f97951b848fecf0b7 100644
--- a/src/share/classes/sun/awt/SunToolkit.java
+++ b/src/share/classes/sun/awt/SunToolkit.java
@@ -1,5 +1,5 @@
/*
- * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -852,6 +852,15 @@ public abstract class SunToolkit extends Toolkit
return AccessController.doPrivileged(new GetBooleanAction("sun.awt.erasebackgroundonresize"));
}
+
+ /**
+ * Makes the window OverrideRedirect, on X11 platforms. See
+ * ICCCM specification for more details about OverrideRedirect
+ * windows. Implemented in XToolkit, no-op in WToolkit.
+ */
+ public void setOverrideRedirect(Window target) {
+ }
+
static SoftCache imgCache = new SoftCache();
static synchronized Image getImageFromHash(Toolkit tk, URL url) {
diff --git a/src/solaris/classes/sun/awt/X11/XToolkit.java b/src/solaris/classes/sun/awt/X11/XToolkit.java
index 871f99368b603ba6700bf93673c901f9b222b902..9349ee8d1c93440134927c6974edec6d199c28f9 100644
--- a/src/solaris/classes/sun/awt/X11/XToolkit.java
+++ b/src/solaris/classes/sun/awt/X11/XToolkit.java
@@ -97,6 +97,11 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
static int awt_multiclick_time;
static boolean securityWarningEnabled;
+ // WeakSet should be used here, but there is no such class
+ // in JDK (at least in JDK6 and earlier versions)
+ private WeakHashMap overrideRedirectWindows =
+ new WeakHashMap();
+
private static int screenWidth = -1, screenHeight = -1; // Dimensions of default screen
static long awt_defaultFg; // Pixel
private static XMouseInfoPeer xPeer;
@@ -1248,6 +1253,19 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
}
}
+ @Override
+ public void setOverrideRedirect(Window target) {
+ synchronized (overrideRedirectWindows) {
+ overrideRedirectWindows.put(target, true);
+ }
+ }
+
+ public boolean isOverrideRedirect(Window target) {
+ synchronized (overrideRedirectWindows) {
+ return overrideRedirectWindows.containsKey(target);
+ }
+ }
+
static void dumpPeers() {
if (log.isLoggable(Level.FINE)) {
log.fine("Mapped windows:");
diff --git a/src/solaris/classes/sun/awt/X11/XWindowPeer.java b/src/solaris/classes/sun/awt/X11/XWindowPeer.java
index 17d76b0de24b8e2c5e3aaf06843fcc6392753611..77b39c13d9013980bb782e57d1ee3b28fc463594 100644
--- a/src/solaris/classes/sun/awt/X11/XWindowPeer.java
+++ b/src/solaris/classes/sun/awt/X11/XWindowPeer.java
@@ -129,6 +129,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
private static final int MAXIMUM_BUFFER_LENGTH_NET_WM_ICON = (2<<15) - 1;
void preInit(XCreateWindowParams params) {
+ target = (Component)params.get(TARGET);
params.put(REPARENTED,
Boolean.valueOf(isOverrideRedirect() || isSimpleWindow()));
super.preInit(params);
@@ -1117,6 +1118,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
boolean isOverrideRedirect() {
return (XWM.getWMID() == XWM.OPENLOOK_WM ? true : false) ||
+ ((XToolkit)Toolkit.getDefaultToolkit()).isOverrideRedirect((Window)target) ||
XTrayIconPeer.isTrayIconStuffWindow((Window)target);
}