diff options
author | art <none@none> | 2008-08-14 12:58:51 +0400 |
---|---|---|
committer | art <none@none> | 2008-08-14 12:58:51 +0400 |
commit | f998677359f58d7226585ff805b5d88a07a01573 (patch) | |
tree | fc3f21460e03b158e25901d71b4e588ce62ceb2f /src | |
parent | f21bffefd6e5c453c0a460a089a4cda692d91b3c (diff) |
6708392: Provide internal API to create OverrideRedirect windows, XToolkit
Summary: SunToolkit.setOverrideRedirect() method is introduced
Reviewed-by: mlapshin, yan
Diffstat (limited to 'src')
-rw-r--r-- | src/share/classes/javax/swing/Popup.java | 9 | ||||
-rw-r--r-- | src/share/classes/sun/awt/SunToolkit.java | 11 | ||||
-rw-r--r-- | src/solaris/classes/sun/awt/X11/XToolkit.java | 18 | ||||
-rw-r--r-- | src/solaris/classes/sun/awt/X11/XWindowPeer.java | 2 |
4 files changed, 38 insertions, 2 deletions
diff --git a/src/share/classes/javax/swing/Popup.java b/src/share/classes/javax/swing/Popup.java index 2b55aadcf..0d1f2d53f 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 <code>Component</code> 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 95a6e7815..20da8ffe7 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 871f99368..9349ee8d1 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<Window, Boolean> overrideRedirectWindows = + new WeakHashMap<Window, Boolean>(); + 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 17d76b0de..77b39c13d 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); } |