src/solaris/classes/sun/awt/X11/XWindowPeer.java

Print this page




  30 import java.awt.event.FocusEvent;
  31 import java.awt.event.WindowEvent;
  32 
  33 import java.awt.image.BufferedImage;
  34 
  35 import java.awt.peer.ComponentPeer;
  36 import java.awt.peer.WindowPeer;
  37 
  38 import java.util.ArrayList;
  39 import java.util.HashSet;
  40 import java.util.Iterator;
  41 import java.util.Set;
  42 import java.util.Vector;
  43 
  44 import java.util.logging.Level;
  45 import java.util.logging.Logger;
  46 
  47 import sun.awt.AWTAccessor;
  48 import sun.awt.ComponentAccessor;
  49 import sun.awt.WindowAccessor;
  50 import sun.awt.AWTAccessor;
  51 import sun.awt.DisplayChangedListener;
  52 import sun.awt.SunToolkit;
  53 import sun.awt.X11GraphicsDevice;
  54 import sun.awt.X11GraphicsEnvironment;
  55 
  56 import sun.java2d.pipe.Region;
  57 
  58 class XWindowPeer extends XPanelPeer implements WindowPeer,
  59                                                 DisplayChangedListener {
  60 
  61     private static final Logger log = Logger.getLogger("sun.awt.X11.XWindowPeer");
  62     private static final Logger focusLog = Logger.getLogger("sun.awt.X11.focus.XWindowPeer");
  63     private static final Logger insLog = Logger.getLogger("sun.awt.X11.insets.XWindowPeer");
  64     private static final Logger grabLog = Logger.getLogger("sun.awt.X11.grab.XWindowPeer");
  65     private static final Logger iconLog = Logger.getLogger("sun.awt.X11.icon.XWindowPeer");
  66 
  67     // should be synchronized on awtLock
  68     private static Set<XWindowPeer> windows = new HashSet<XWindowPeer>();
  69 
  70 


  81     private XWindowPeer ownerPeer;
  82 
  83     // used for modal blocking to keep existing z-order
  84     protected XWindowPeer prevTransientFor, nextTransientFor;
  85     // value of WM_TRANSIENT_FOR hint set on this window
  86     private XWindowPeer curRealTransientFor;
  87 
  88     private boolean grab = false; // Whether to do a grab during showing
  89 
  90     private boolean isMapped = false; // Is this window mapped or not
  91     private boolean mustControlStackPosition = false; // Am override-redirect not on top
  92     private XEventDispatcher rootPropertyEventDispatcher = null;
  93 
  94     /*
  95      * Focus related flags
  96      */
  97     private boolean isUnhiding = false;             // Is the window unhiding.
  98     private boolean isBeforeFirstMapNotify = false; // Is the window (being shown) between
  99                                                     //    setVisible(true) & handleMapNotify().
 100 












 101     // It need to be accessed from XFramePeer.
 102     protected Vector <ToplevelStateListener> toplevelStateListeners = new Vector<ToplevelStateListener>();
 103     XWindowPeer(XCreateWindowParams params) {
 104         super(params.putIfNull(PARENT_WINDOW, Long.valueOf(0)));
 105     }
 106 
 107     XWindowPeer(Window target) {
 108         super(new XCreateWindowParams(new Object[] {
 109             TARGET, target,
 110             PARENT_WINDOW, Long.valueOf(0)}));
 111     }
 112 
 113     /*
 114      * This constant defines icon size recommended for using.
 115      * Apparently, we should use XGetIconSizes which should
 116      * return icon sizes would be most appreciated by the WM.
 117      * However, XGetIconSizes always returns 0 for some reason.
 118      * So the constant has been introduced.
 119      */
 120     private static final int PREFERRED_SIZE_FOR_ICON = 128;
 121 
 122     /*
 123      * Sometimes XChangeProperty(_NET_WM_ICON) doesn't work if
 124      * image buffer is too large. This constant holds maximum
 125      * length of buffer which can be used with _NET_WM_ICON hint.
 126      * It holds int's value.
 127      */
 128     private static final int MAXIMUM_BUFFER_LENGTH_NET_WM_ICON = (2<<15) - 1;
 129 
 130     void preInit(XCreateWindowParams params) {
 131         target = (Component)params.get(TARGET);

 132         params.put(REPARENTED,
 133                    Boolean.valueOf(isOverrideRedirect() || isSimpleWindow()));
 134         super.preInit(params);
 135         params.putIfNull(BIT_GRAVITY, Integer.valueOf(XConstants.NorthWestGravity));
 136 
 137         long eventMask = 0;
 138         if (params.containsKey(EVENT_MASK)) {
 139             eventMask = ((Long)params.get(EVENT_MASK));
 140         }
 141         eventMask |= XConstants.VisibilityChangeMask;
 142         params.put(EVENT_MASK, eventMask);
 143 
 144         XA_NET_WM_STATE = XAtom.get("_NET_WM_STATE");
 145 
 146 
 147         params.put(OVERRIDE_REDIRECT, Boolean.valueOf(isOverrideRedirect()));
 148 
 149         SunToolkit.awtLock();
 150         try {
 151             windows.add(this);


1095 
1096         // getWMState() always returns 0 (Withdrawn) for simple windows. Hence
1097         // we ignore the state for such windows.
1098         if (isVisible() && (state == XUtilConstants.NormalState || isSimpleWindow())) {
1099             if (XKeyboardFocusManagerPeer.getCurrentNativeFocusedWindow() ==
1100                     getTarget())
1101             {
1102                 show = true;
1103             }
1104 
1105             if (isMouseAbove() || warningWindow.isMouseAbove())
1106             {
1107                 show = true;
1108             }
1109         }
1110 
1111         warningWindow.setSecurityWarningVisible(show, true);
1112     }
1113 
1114     boolean isOverrideRedirect() {
1115         return (XWM.getWMID() == XWM.OPENLOOK_WM ? true : false) ||
1116             ((XToolkit)Toolkit.getDefaultToolkit()).isOverrideRedirect((Window)target) ||
1117             XTrayIconPeer.isTrayIconStuffWindow((Window)target);
1118     }
1119 
1120     final boolean isOLWMDecorBug() {
1121         return XWM.getWMID() == XWM.OPENLOOK_WM &&
1122             winAttr.nativeDecor == false;
1123     }
1124 
1125     public void dispose() {
1126         SunToolkit.awtLock();
1127         try {
1128             windows.remove(this);
1129         } finally {
1130             SunToolkit.awtUnlock();
1131         }
1132         if (warningWindow != null) {
1133             warningWindow.destroy();
1134         }
1135         removeRootPropertyEventDispatcher();
1136         mustControlStackPosition = false;
1137         super.dispose();


1723         if (activeWindow == ownerWindow) {
1724             focusLog.fine("Parent window is active - generating focus for this window");
1725             handleWindowFocusInSync(-1);
1726             return true;
1727         }
1728         focusLog.fine("Parent window is not active");
1729 
1730         XDecoratedPeer wpeer = (XDecoratedPeer)ComponentAccessor.getPeer(ownerWindow);
1731         if (wpeer != null && wpeer.requestWindowFocus(this, time, timeProvided)) {
1732             focusLog.fine("Parent window accepted focus request - generating focus for this window");
1733             return true;
1734         }
1735         focusLog.fine("Denied - parent window is not active and didn't accept focus request");
1736         return false;
1737     }
1738 
1739     // This method is to be overriden in XDecoratedPeer.
1740     void setActualFocusedWindow(XWindowPeer actualFocusedWindow) {
1741     }
1742 




































1743     public void xSetVisible(boolean visible) {
1744         if (log.isLoggable(Level.FINE)) log.fine("Setting visible on " + this + " to " + visible);
1745         XToolkit.awtLock();
1746         try {
1747             this.visible = visible;
1748             if (visible) {

1749                 XlibWrapper.XMapRaised(XToolkit.getDisplay(), getWindow());
1750             } else {
1751                 XlibWrapper.XUnmapWindow(XToolkit.getDisplay(), getWindow());
1752             }
1753             XlibWrapper.XFlush(XToolkit.getDisplay());
1754         }
1755         finally {
1756             XToolkit.awtUnlock();
1757         }
1758     }
1759 
1760     private int dropTargetCount = 0;
1761 
1762     public synchronized void addDropTarget() {
1763         if (dropTargetCount == 0) {
1764             long window = getWindow();
1765             if (window != 0) {
1766                 XDropTargetRegistry.getRegistry().registerDropSite(window);
1767             }
1768         }




  30 import java.awt.event.FocusEvent;
  31 import java.awt.event.WindowEvent;
  32 
  33 import java.awt.image.BufferedImage;
  34 
  35 import java.awt.peer.ComponentPeer;
  36 import java.awt.peer.WindowPeer;
  37 
  38 import java.util.ArrayList;
  39 import java.util.HashSet;
  40 import java.util.Iterator;
  41 import java.util.Set;
  42 import java.util.Vector;
  43 
  44 import java.util.logging.Level;
  45 import java.util.logging.Logger;
  46 
  47 import sun.awt.AWTAccessor;
  48 import sun.awt.ComponentAccessor;
  49 import sun.awt.WindowAccessor;

  50 import sun.awt.DisplayChangedListener;
  51 import sun.awt.SunToolkit;
  52 import sun.awt.X11GraphicsDevice;
  53 import sun.awt.X11GraphicsEnvironment;
  54 
  55 import sun.java2d.pipe.Region;
  56 
  57 class XWindowPeer extends XPanelPeer implements WindowPeer,
  58                                                 DisplayChangedListener {
  59 
  60     private static final Logger log = Logger.getLogger("sun.awt.X11.XWindowPeer");
  61     private static final Logger focusLog = Logger.getLogger("sun.awt.X11.focus.XWindowPeer");
  62     private static final Logger insLog = Logger.getLogger("sun.awt.X11.insets.XWindowPeer");
  63     private static final Logger grabLog = Logger.getLogger("sun.awt.X11.grab.XWindowPeer");
  64     private static final Logger iconLog = Logger.getLogger("sun.awt.X11.icon.XWindowPeer");
  65 
  66     // should be synchronized on awtLock
  67     private static Set<XWindowPeer> windows = new HashSet<XWindowPeer>();
  68 
  69 


  80     private XWindowPeer ownerPeer;
  81 
  82     // used for modal blocking to keep existing z-order
  83     protected XWindowPeer prevTransientFor, nextTransientFor;
  84     // value of WM_TRANSIENT_FOR hint set on this window
  85     private XWindowPeer curRealTransientFor;
  86 
  87     private boolean grab = false; // Whether to do a grab during showing
  88 
  89     private boolean isMapped = false; // Is this window mapped or not
  90     private boolean mustControlStackPosition = false; // Am override-redirect not on top
  91     private XEventDispatcher rootPropertyEventDispatcher = null;
  92 
  93     /*
  94      * Focus related flags
  95      */
  96     private boolean isUnhiding = false;             // Is the window unhiding.
  97     private boolean isBeforeFirstMapNotify = false; // Is the window (being shown) between
  98                                                     //    setVisible(true) & handleMapNotify().
  99 
 100     /**
 101      * The type of the window.
 102      *
 103      * The type is supposed to be immutable while the peer object exists.
 104      * The value gets initialized in the preInit() method.
 105      */
 106     private Window.Type windowType = Window.Type.NORMAL;
 107 
 108     public final Window.Type getWindowType() {
 109         return windowType;
 110     }
 111 
 112     // It need to be accessed from XFramePeer.
 113     protected Vector <ToplevelStateListener> toplevelStateListeners = new Vector<ToplevelStateListener>();
 114     XWindowPeer(XCreateWindowParams params) {
 115         super(params.putIfNull(PARENT_WINDOW, Long.valueOf(0)));
 116     }
 117 
 118     XWindowPeer(Window target) {
 119         super(new XCreateWindowParams(new Object[] {
 120             TARGET, target,
 121             PARENT_WINDOW, Long.valueOf(0)}));
 122     }
 123 
 124     /*
 125      * This constant defines icon size recommended for using.
 126      * Apparently, we should use XGetIconSizes which should
 127      * return icon sizes would be most appreciated by the WM.
 128      * However, XGetIconSizes always returns 0 for some reason.
 129      * So the constant has been introduced.
 130      */
 131     private static final int PREFERRED_SIZE_FOR_ICON = 128;
 132 
 133     /*
 134      * Sometimes XChangeProperty(_NET_WM_ICON) doesn't work if
 135      * image buffer is too large. This constant holds maximum
 136      * length of buffer which can be used with _NET_WM_ICON hint.
 137      * It holds int's value.
 138      */
 139     private static final int MAXIMUM_BUFFER_LENGTH_NET_WM_ICON = (2<<15) - 1;
 140 
 141     void preInit(XCreateWindowParams params) {
 142         target = (Component)params.get(TARGET);
 143         windowType = ((Window)target).getType();
 144         params.put(REPARENTED,
 145                    Boolean.valueOf(isOverrideRedirect() || isSimpleWindow()));
 146         super.preInit(params);
 147         params.putIfNull(BIT_GRAVITY, Integer.valueOf(XConstants.NorthWestGravity));
 148 
 149         long eventMask = 0;
 150         if (params.containsKey(EVENT_MASK)) {
 151             eventMask = ((Long)params.get(EVENT_MASK));
 152         }
 153         eventMask |= XConstants.VisibilityChangeMask;
 154         params.put(EVENT_MASK, eventMask);
 155 
 156         XA_NET_WM_STATE = XAtom.get("_NET_WM_STATE");
 157 
 158 
 159         params.put(OVERRIDE_REDIRECT, Boolean.valueOf(isOverrideRedirect()));
 160 
 161         SunToolkit.awtLock();
 162         try {
 163             windows.add(this);


1107 
1108         // getWMState() always returns 0 (Withdrawn) for simple windows. Hence
1109         // we ignore the state for such windows.
1110         if (isVisible() && (state == XUtilConstants.NormalState || isSimpleWindow())) {
1111             if (XKeyboardFocusManagerPeer.getCurrentNativeFocusedWindow() ==
1112                     getTarget())
1113             {
1114                 show = true;
1115             }
1116 
1117             if (isMouseAbove() || warningWindow.isMouseAbove())
1118             {
1119                 show = true;
1120             }
1121         }
1122 
1123         warningWindow.setSecurityWarningVisible(show, true);
1124     }
1125 
1126     boolean isOverrideRedirect() {
1127         return XWM.getWMID() == XWM.OPENLOOK_WM ||
1128             Window.Type.POPUP.equals(getWindowType());

1129     }
1130 
1131     final boolean isOLWMDecorBug() {
1132         return XWM.getWMID() == XWM.OPENLOOK_WM &&
1133             winAttr.nativeDecor == false;
1134     }
1135 
1136     public void dispose() {
1137         SunToolkit.awtLock();
1138         try {
1139             windows.remove(this);
1140         } finally {
1141             SunToolkit.awtUnlock();
1142         }
1143         if (warningWindow != null) {
1144             warningWindow.destroy();
1145         }
1146         removeRootPropertyEventDispatcher();
1147         mustControlStackPosition = false;
1148         super.dispose();


1734         if (activeWindow == ownerWindow) {
1735             focusLog.fine("Parent window is active - generating focus for this window");
1736             handleWindowFocusInSync(-1);
1737             return true;
1738         }
1739         focusLog.fine("Parent window is not active");
1740 
1741         XDecoratedPeer wpeer = (XDecoratedPeer)ComponentAccessor.getPeer(ownerWindow);
1742         if (wpeer != null && wpeer.requestWindowFocus(this, time, timeProvided)) {
1743             focusLog.fine("Parent window accepted focus request - generating focus for this window");
1744             return true;
1745         }
1746         focusLog.fine("Denied - parent window is not active and didn't accept focus request");
1747         return false;
1748     }
1749 
1750     // This method is to be overriden in XDecoratedPeer.
1751     void setActualFocusedWindow(XWindowPeer actualFocusedWindow) {
1752     }
1753 
1754     /**
1755      * Applies the current window type.
1756      */
1757     private void applyWindowType() {
1758         XNETProtocol protocol = XWM.getWM().getNETProtocol();
1759         if (protocol == null) {
1760             return;
1761         }
1762 
1763         XAtomList wtype = protocol.XA_NET_WM_WINDOW_TYPE.
1764             getAtomListPropertyList(getWindow());
1765         wtype.clear();
1766 
1767         switch (getWindowType())
1768         {
1769             case NORMAL:
1770                 wtype.add(protocol.XA_NET_WM_WINDOW_TYPE_NORMAL);
1771                 break;
1772             case UTILITY:
1773                 wtype.add(protocol.XA_NET_WM_WINDOW_TYPE_UTILITY);
1774                 break;
1775             case POPUP:
1776                 wtype.add(protocol.XA_NET_WM_WINDOW_TYPE_POPUP_MENU);
1777                 break;
1778         }
1779 
1780         if (wtype.size() != 0) {
1781             protocol.XA_NET_WM_WINDOW_TYPE.
1782                 setAtomListProperty(getWindow(), wtype);
1783         } else {
1784             protocol.XA_NET_WM_WINDOW_TYPE.
1785                 DeleteProperty(getWindow());
1786         }
1787     }
1788 
1789     @Override
1790     public void xSetVisible(boolean visible) {
1791         if (log.isLoggable(Level.FINE)) log.fine("Setting visible on " + this + " to " + visible);
1792         XToolkit.awtLock();
1793         try {
1794             this.visible = visible;
1795             if (visible) {
1796                 applyWindowType();
1797                 XlibWrapper.XMapRaised(XToolkit.getDisplay(), getWindow());
1798             } else {
1799                 XlibWrapper.XUnmapWindow(XToolkit.getDisplay(), getWindow());
1800             }
1801             XlibWrapper.XFlush(XToolkit.getDisplay());
1802         }
1803         finally {
1804             XToolkit.awtUnlock();
1805         }
1806     }
1807 
1808     private int dropTargetCount = 0;
1809 
1810     public synchronized void addDropTarget() {
1811         if (dropTargetCount == 0) {
1812             long window = getWindow();
1813             if (window != 0) {
1814                 XDropTargetRegistry.getRegistry().registerDropSite(window);
1815             }
1816         }