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 }
|