41 public boolean supportsState(int state) { |
41 public boolean supportsState(int state) { |
42 return doStateProtocol() ; // TODO - check for Frame constants |
42 return doStateProtocol() ; // TODO - check for Frame constants |
43 } |
43 } |
44 |
44 |
45 public void setState(XWindowPeer window, int state) { |
45 public void setState(XWindowPeer window, int state) { |
46 if (log.isLoggable(PlatformLogger.FINE)) { |
46 if (log.isLoggable(PlatformLogger.Level.FINE)) { |
47 log.fine("Setting state of " + window + " to " + state); |
47 log.fine("Setting state of " + window + " to " + state); |
48 } |
48 } |
49 if (window.isShowing()) { |
49 if (window.isShowing()) { |
50 requestState(window, state); |
50 requestState(window, state); |
51 } else { |
51 } else { |
53 } |
53 } |
54 } |
54 } |
55 |
55 |
56 private void setInitialState(XWindowPeer window, int state) { |
56 private void setInitialState(XWindowPeer window, int state) { |
57 XAtomList old_state = window.getNETWMState(); |
57 XAtomList old_state = window.getNETWMState(); |
58 if (log.isLoggable(PlatformLogger.FINE)) { |
58 if (log.isLoggable(PlatformLogger.Level.FINE)) { |
59 log.fine("Current state of the window {0} is {1}", window, old_state); |
59 log.fine("Current state of the window {0} is {1}", window, old_state); |
60 } |
60 } |
61 if ((state & Frame.MAXIMIZED_VERT) != 0) { |
61 if ((state & Frame.MAXIMIZED_VERT) != 0) { |
62 old_state.add(XA_NET_WM_STATE_MAXIMIZED_VERT); |
62 old_state.add(XA_NET_WM_STATE_MAXIMIZED_VERT); |
63 } else { |
63 } else { |
66 if ((state & Frame.MAXIMIZED_HORIZ) != 0) { |
66 if ((state & Frame.MAXIMIZED_HORIZ) != 0) { |
67 old_state.add(XA_NET_WM_STATE_MAXIMIZED_HORZ); |
67 old_state.add(XA_NET_WM_STATE_MAXIMIZED_HORZ); |
68 } else { |
68 } else { |
69 old_state.remove(XA_NET_WM_STATE_MAXIMIZED_HORZ); |
69 old_state.remove(XA_NET_WM_STATE_MAXIMIZED_HORZ); |
70 } |
70 } |
71 if (log.isLoggable(PlatformLogger.FINE)) { |
71 if (log.isLoggable(PlatformLogger.Level.FINE)) { |
72 log.fine("Setting initial state of the window {0} to {1}", window, old_state); |
72 log.fine("Setting initial state of the window {0} to {1}", window, old_state); |
73 } |
73 } |
74 window.setNETWMState(old_state); |
74 window.setNETWMState(old_state); |
75 } |
75 } |
76 |
76 |
101 req.set_data(2, XA_NET_WM_STATE_MAXIMIZED_VERT.getAtom()); |
101 req.set_data(2, XA_NET_WM_STATE_MAXIMIZED_VERT.getAtom()); |
102 break; |
102 break; |
103 default: |
103 default: |
104 return; |
104 return; |
105 } |
105 } |
106 if (log.isLoggable(PlatformLogger.FINE)) { |
106 if (log.isLoggable(PlatformLogger.Level.FINE)) { |
107 log.fine("Requesting state on " + window + " for " + state); |
107 log.fine("Requesting state on " + window + " for " + state); |
108 } |
108 } |
109 req.set_type((int)XConstants.ClientMessage); |
109 req.set_type((int)XConstants.ClientMessage); |
110 req.set_window(window.getWindow()); |
110 req.set_window(window.getWindow()); |
111 req.set_message_type(XA_NET_WM_STATE.getAtom()); |
111 req.set_message_type(XA_NET_WM_STATE.getAtom()); |
185 req.set_format(32); |
185 req.set_format(32); |
186 req.set_data(0, isAdd ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE); |
186 req.set_data(0, isAdd ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE); |
187 req.set_data(1, state.getAtom()); |
187 req.set_data(1, state.getAtom()); |
188 // Fix for 6735584: req.data[2] must be set to 0 when only one property is changed |
188 // Fix for 6735584: req.data[2] must be set to 0 when only one property is changed |
189 req.set_data(2, 0); |
189 req.set_data(2, 0); |
190 if (log.isLoggable(PlatformLogger.FINE)) { |
190 if (log.isLoggable(PlatformLogger.Level.FINE)) { |
191 log.fine("Setting _NET_STATE atom {0} on {1} for {2}", state, window, Boolean.valueOf(isAdd)); |
191 log.fine("Setting _NET_STATE atom {0} on {1} for {2}", state, window, Boolean.valueOf(isAdd)); |
192 } |
192 } |
193 XToolkit.awtLock(); |
193 XToolkit.awtLock(); |
194 try { |
194 try { |
195 XlibWrapper.XSendEvent(XToolkit.getDisplay(), |
195 XlibWrapper.XSendEvent(XToolkit.getDisplay(), |
212 * @param window Window which NET_WM_STATE property is being modified |
212 * @param window Window which NET_WM_STATE property is being modified |
213 * @param state State atom to be set/reset |
213 * @param state State atom to be set/reset |
214 * @param reset Indicates operation, 'set' if false, 'reset' if true |
214 * @param reset Indicates operation, 'set' if false, 'reset' if true |
215 */ |
215 */ |
216 private void setStateHelper(XWindowPeer window, XAtom state, boolean set) { |
216 private void setStateHelper(XWindowPeer window, XAtom state, boolean set) { |
217 if (log.isLoggable(PlatformLogger.FINER)) { |
217 if (log.isLoggable(PlatformLogger.Level.FINER)) { |
218 log.finer("Window visibility is: withdrawn={0}, visible={1}, mapped={2} showing={3}", |
218 log.finer("Window visibility is: withdrawn={0}, visible={1}, mapped={2} showing={3}", |
219 Boolean.valueOf(window.isWithdrawn()), Boolean.valueOf(window.isVisible()), |
219 Boolean.valueOf(window.isWithdrawn()), Boolean.valueOf(window.isVisible()), |
220 Boolean.valueOf(window.isMapped()), Boolean.valueOf(window.isShowing())); |
220 Boolean.valueOf(window.isMapped()), Boolean.valueOf(window.isShowing())); |
221 } |
221 } |
222 if (window.isShowing()) { |
222 if (window.isShowing()) { |
223 requestState(window, state, set); |
223 requestState(window, state, set); |
224 } else { |
224 } else { |
225 XAtomList net_wm_state = window.getNETWMState(); |
225 XAtomList net_wm_state = window.getNETWMState(); |
226 if (log.isLoggable(PlatformLogger.FINER)) { |
226 if (log.isLoggable(PlatformLogger.Level.FINER)) { |
227 log.finer("Current state on {0} is {1}", window, net_wm_state); |
227 log.finer("Current state on {0} is {1}", window, net_wm_state); |
228 } |
228 } |
229 if (!set) { |
229 if (!set) { |
230 net_wm_state.remove(state); |
230 net_wm_state.remove(state); |
231 } else { |
231 } else { |
232 net_wm_state.add(state); |
232 net_wm_state.add(state); |
233 } |
233 } |
234 if (log.isLoggable(PlatformLogger.FINE)) { |
234 if (log.isLoggable(PlatformLogger.Level.FINE)) { |
235 log.fine("Setting states on {0} to {1}", window, net_wm_state); |
235 log.fine("Setting states on {0} to {1}", window, net_wm_state); |
236 } |
236 } |
237 window.setNETWMState(net_wm_state); |
237 window.setNETWMState(net_wm_state); |
238 } |
238 } |
239 XToolkit.XSync(); |
239 XToolkit.XSync(); |
288 // TODO: How about detecting WM-restart or exit? |
288 // TODO: How about detecting WM-restart or exit? |
289 return; |
289 return; |
290 } |
290 } |
291 NetWindow = checkAnchor(XA_NET_SUPPORTING_WM_CHECK, XAtom.XA_WINDOW); |
291 NetWindow = checkAnchor(XA_NET_SUPPORTING_WM_CHECK, XAtom.XA_WINDOW); |
292 supportChecked = true; |
292 supportChecked = true; |
293 if (log.isLoggable(PlatformLogger.FINE)) { |
293 if (log.isLoggable(PlatformLogger.Level.FINE)) { |
294 log.fine("### " + this + " is active: " + (NetWindow != 0)); |
294 log.fine("### " + this + " is active: " + (NetWindow != 0)); |
295 } |
295 } |
296 } |
296 } |
297 |
297 |
298 boolean active() { |
298 boolean active() { |
300 return NetWindow != 0; |
300 return NetWindow != 0; |
301 } |
301 } |
302 |
302 |
303 boolean doStateProtocol() { |
303 boolean doStateProtocol() { |
304 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE); |
304 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE); |
305 if (stateLog.isLoggable(PlatformLogger.FINER)) { |
305 if (stateLog.isLoggable(PlatformLogger.Level.FINER)) { |
306 stateLog.finer("doStateProtocol() returns " + res); |
306 stateLog.finer("doStateProtocol() returns " + res); |
307 } |
307 } |
308 return res; |
308 return res; |
309 } |
309 } |
310 |
310 |