src/solaris/classes/sun/awt/X11/XWindowPeer.java
Print this page
*** 45,55 ****
import java.util.logging.Logger;
import sun.awt.AWTAccessor;
import sun.awt.ComponentAccessor;
import sun.awt.WindowAccessor;
- import sun.awt.AWTAccessor;
import sun.awt.DisplayChangedListener;
import sun.awt.SunToolkit;
import sun.awt.X11GraphicsDevice;
import sun.awt.X11GraphicsEnvironment;
--- 45,54 ----
*** 96,105 ****
--- 95,116 ----
*/
private boolean isUnhiding = false; // Is the window unhiding.
private boolean isBeforeFirstMapNotify = false; // Is the window (being shown) between
// setVisible(true) & handleMapNotify().
+ /**
+ * The type of the window.
+ *
+ * The type is supposed to be immutable while the peer object exists.
+ * The value gets initialized in the preInit() method.
+ */
+ private Window.Type windowType = Window.Type.NORMAL;
+
+ public final Window.Type getWindowType() {
+ return windowType;
+ }
+
// It need to be accessed from XFramePeer.
protected Vector <ToplevelStateListener> toplevelStateListeners = new Vector<ToplevelStateListener>();
XWindowPeer(XCreateWindowParams params) {
super(params.putIfNull(PARENT_WINDOW, Long.valueOf(0)));
}
*** 127,136 ****
--- 138,148 ----
*/
private static final int MAXIMUM_BUFFER_LENGTH_NET_WM_ICON = (2<<15) - 1;
void preInit(XCreateWindowParams params) {
target = (Component)params.get(TARGET);
+ windowType = ((Window)target).getType();
params.put(REPARENTED,
Boolean.valueOf(isOverrideRedirect() || isSimpleWindow()));
super.preInit(params);
params.putIfNull(BIT_GRAVITY, Integer.valueOf(XConstants.NorthWestGravity));
*** 1110,1122 ****
warningWindow.setSecurityWarningVisible(show, true);
}
boolean isOverrideRedirect() {
! return (XWM.getWMID() == XWM.OPENLOOK_WM ? true : false) ||
! ((XToolkit)Toolkit.getDefaultToolkit()).isOverrideRedirect((Window)target) ||
! XTrayIconPeer.isTrayIconStuffWindow((Window)target);
}
final boolean isOLWMDecorBug() {
return XWM.getWMID() == XWM.OPENLOOK_WM &&
winAttr.nativeDecor == false;
--- 1122,1133 ----
warningWindow.setSecurityWarningVisible(show, true);
}
boolean isOverrideRedirect() {
! return XWM.getWMID() == XWM.OPENLOOK_WM ||
! Window.Type.POPUP.equals(getWindowType());
}
final boolean isOLWMDecorBug() {
return XWM.getWMID() == XWM.OPENLOOK_WM &&
winAttr.nativeDecor == false;
*** 1738,1753 ****
--- 1749,1801 ----
// This method is to be overriden in XDecoratedPeer.
void setActualFocusedWindow(XWindowPeer actualFocusedWindow) {
}
+ /**
+ * Applies the current window type.
+ */
+ private void applyWindowType() {
+ XNETProtocol protocol = XWM.getWM().getNETProtocol();
+ if (protocol == null) {
+ return;
+ }
+
+ XAtomList wtype = protocol.XA_NET_WM_WINDOW_TYPE.
+ getAtomListPropertyList(getWindow());
+ wtype.clear();
+
+ switch (getWindowType())
+ {
+ case NORMAL:
+ wtype.add(protocol.XA_NET_WM_WINDOW_TYPE_NORMAL);
+ break;
+ case UTILITY:
+ wtype.add(protocol.XA_NET_WM_WINDOW_TYPE_UTILITY);
+ break;
+ case POPUP:
+ wtype.add(protocol.XA_NET_WM_WINDOW_TYPE_POPUP_MENU);
+ break;
+ }
+
+ if (wtype.size() != 0) {
+ protocol.XA_NET_WM_WINDOW_TYPE.
+ setAtomListProperty(getWindow(), wtype);
+ } else {
+ protocol.XA_NET_WM_WINDOW_TYPE.
+ DeleteProperty(getWindow());
+ }
+ }
+
+ @Override
public void xSetVisible(boolean visible) {
if (log.isLoggable(Level.FINE)) log.fine("Setting visible on " + this + " to " + visible);
XToolkit.awtLock();
try {
this.visible = visible;
if (visible) {
+ applyWindowType();
XlibWrapper.XMapRaised(XToolkit.getDisplay(), getWindow());
} else {
XlibWrapper.XUnmapWindow(XToolkit.getDisplay(), getWindow());
}
XlibWrapper.XFlush(XToolkit.getDisplay());