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());