25 |
25 |
26 |
26 |
27 package sun.awt.X11; |
27 package sun.awt.X11; |
28 |
28 |
29 import java.awt.Frame; |
29 import java.awt.Frame; |
30 import java.util.logging.Level; |
30 import sun.util.logging.PlatformLogger; |
31 import java.util.logging.Logger; |
|
32 |
31 |
33 final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProtocol |
32 final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProtocol |
34 { |
33 { |
35 private final static Logger log = Logger.getLogger("sun.awt.X11.XNETProtocol"); |
34 private final static PlatformLogger log = PlatformLogger.getLogger("sun.awt.X11.XNETProtocol"); |
36 private final static Logger iconLog = Logger.getLogger("sun.awt.X11.icon.XNETProtocol"); |
35 private final static PlatformLogger iconLog = PlatformLogger.getLogger("sun.awt.X11.icon.XNETProtocol"); |
37 private static Logger stateLog = Logger.getLogger("sun.awt.X11.states.XNETProtocol"); |
36 private static PlatformLogger stateLog = PlatformLogger.getLogger("sun.awt.X11.states.XNETProtocol"); |
38 |
37 |
39 /** |
38 /** |
40 * XStateProtocol |
39 * XStateProtocol |
41 */ |
40 */ |
42 public boolean supportsState(int state) { |
41 public boolean supportsState(int state) { |
43 return doStateProtocol() ; // TODO - check for Frame constants |
42 return doStateProtocol() ; // TODO - check for Frame constants |
44 } |
43 } |
45 |
44 |
46 public void setState(XWindowPeer window, int state) { |
45 public void setState(XWindowPeer window, int state) { |
47 if (log.isLoggable(Level.FINE)) log.fine("Setting state of " + window + " to " + state); |
46 if (log.isLoggable(PlatformLogger.FINE)) log.fine("Setting state of " + window + " to " + state); |
48 if (window.isShowing()) { |
47 if (window.isShowing()) { |
49 requestState(window, state); |
48 requestState(window, state); |
50 } else { |
49 } else { |
51 setInitialState(window, state); |
50 setInitialState(window, state); |
52 } |
51 } |
53 } |
52 } |
54 |
53 |
55 private void setInitialState(XWindowPeer window, int state) { |
54 private void setInitialState(XWindowPeer window, int state) { |
56 XAtomList old_state = window.getNETWMState(); |
55 XAtomList old_state = window.getNETWMState(); |
57 log.log(Level.FINE, "Current state of the window {0} is {1}", new Object[] {window, old_state}); |
56 log.fine("Current state of the window {0} is {1}", window, old_state); |
58 if ((state & Frame.MAXIMIZED_VERT) != 0) { |
57 if ((state & Frame.MAXIMIZED_VERT) != 0) { |
59 old_state.add(XA_NET_WM_STATE_MAXIMIZED_VERT); |
58 old_state.add(XA_NET_WM_STATE_MAXIMIZED_VERT); |
60 } else { |
59 } else { |
61 old_state.remove(XA_NET_WM_STATE_MAXIMIZED_VERT); |
60 old_state.remove(XA_NET_WM_STATE_MAXIMIZED_VERT); |
62 } |
61 } |
63 if ((state & Frame.MAXIMIZED_HORIZ) != 0) { |
62 if ((state & Frame.MAXIMIZED_HORIZ) != 0) { |
64 old_state.add(XA_NET_WM_STATE_MAXIMIZED_HORZ); |
63 old_state.add(XA_NET_WM_STATE_MAXIMIZED_HORZ); |
65 } else { |
64 } else { |
66 old_state.remove(XA_NET_WM_STATE_MAXIMIZED_HORZ); |
65 old_state.remove(XA_NET_WM_STATE_MAXIMIZED_HORZ); |
67 } |
66 } |
68 log.log(Level.FINE, "Setting initial state of the window {0} to {1}", new Object[] {window, old_state}); |
67 log.fine("Setting initial state of the window {0} to {1}", window, old_state); |
69 window.setNETWMState(old_state); |
68 window.setNETWMState(old_state); |
70 } |
69 } |
71 |
70 |
72 private void requestState(XWindowPeer window, int state) { |
71 private void requestState(XWindowPeer window, int state) { |
73 /* |
72 /* |
96 req.set_data(2, XA_NET_WM_STATE_MAXIMIZED_VERT.getAtom()); |
95 req.set_data(2, XA_NET_WM_STATE_MAXIMIZED_VERT.getAtom()); |
97 break; |
96 break; |
98 default: |
97 default: |
99 return; |
98 return; |
100 } |
99 } |
101 if (log.isLoggable(Level.FINE)) log.fine("Requesting state on " + window + " for " + state); |
100 if (log.isLoggable(PlatformLogger.FINE)) log.fine("Requesting state on " + window + " for " + state); |
102 req.set_type((int)XConstants.ClientMessage); |
101 req.set_type((int)XConstants.ClientMessage); |
103 req.set_window(window.getWindow()); |
102 req.set_window(window.getWindow()); |
104 req.set_message_type(XA_NET_WM_STATE.getAtom()); |
103 req.set_message_type(XA_NET_WM_STATE.getAtom()); |
105 req.set_format(32); |
104 req.set_format(32); |
106 req.set_data(0, _NET_WM_STATE_TOGGLE); |
105 req.set_data(0, _NET_WM_STATE_TOGGLE); |
178 req.set_format(32); |
177 req.set_format(32); |
179 req.set_data(0, isAdd ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE); |
178 req.set_data(0, isAdd ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE); |
180 req.set_data(1, state.getAtom()); |
179 req.set_data(1, state.getAtom()); |
181 // Fix for 6735584: req.data[2] must be set to 0 when only one property is changed |
180 // Fix for 6735584: req.data[2] must be set to 0 when only one property is changed |
182 req.set_data(2, 0); |
181 req.set_data(2, 0); |
183 log.log(Level.FINE, "Setting _NET_STATE atom {0} on {1} for {2}", new Object[] {state, window, Boolean.valueOf(isAdd)}); |
182 log.fine("Setting _NET_STATE atom {0} on {1} for {2}", state, window, Boolean.valueOf(isAdd)); |
184 XToolkit.awtLock(); |
183 XToolkit.awtLock(); |
185 try { |
184 try { |
186 XlibWrapper.XSendEvent(XToolkit.getDisplay(), |
185 XlibWrapper.XSendEvent(XToolkit.getDisplay(), |
187 XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()), |
186 XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()), |
188 false, |
187 false, |
203 * @param window Window which NET_WM_STATE property is being modified |
202 * @param window Window which NET_WM_STATE property is being modified |
204 * @param state State atom to be set/reset |
203 * @param state State atom to be set/reset |
205 * @param reset Indicates operation, 'set' if false, 'reset' if true |
204 * @param reset Indicates operation, 'set' if false, 'reset' if true |
206 */ |
205 */ |
207 private void setStateHelper(XWindowPeer window, XAtom state, boolean set) { |
206 private void setStateHelper(XWindowPeer window, XAtom state, boolean set) { |
208 log.log(Level.FINER, "Window visibility is: withdrawn={0}, visible={1}, mapped={2} showing={3}", |
207 log.finer("Window visibility is: withdrawn={0}, visible={1}, mapped={2} showing={3}", |
209 new Object[] {Boolean.valueOf(window.isWithdrawn()), Boolean.valueOf(window.isVisible()), |
208 Boolean.valueOf(window.isWithdrawn()), Boolean.valueOf(window.isVisible()), |
210 Boolean.valueOf(window.isMapped()), Boolean.valueOf(window.isShowing())}); |
209 Boolean.valueOf(window.isMapped()), Boolean.valueOf(window.isShowing())); |
211 if (window.isShowing()) { |
210 if (window.isShowing()) { |
212 requestState(window, state, set); |
211 requestState(window, state, set); |
213 } else { |
212 } else { |
214 XAtomList net_wm_state = window.getNETWMState(); |
213 XAtomList net_wm_state = window.getNETWMState(); |
215 log.log(Level.FINE, "Current state on {0} is {1}", new Object[] {window, net_wm_state}); |
214 log.finer("Current state on {0} is {1}", window, net_wm_state); |
216 if (!set) { |
215 if (!set) { |
217 net_wm_state.remove(state); |
216 net_wm_state.remove(state); |
218 } else { |
217 } else { |
219 net_wm_state.add(state); |
218 net_wm_state.add(state); |
220 } |
219 } |
221 log.log(Level.FINE, "Setting states on {0} to {1}", new Object[] {window, net_wm_state}); |
220 log.fine("Setting states on {0} to {1}", window, net_wm_state); |
222 window.setNETWMState(net_wm_state); |
221 window.setNETWMState(net_wm_state); |
223 } |
222 } |
224 XToolkit.XSync(); |
223 XToolkit.XSync(); |
225 } |
224 } |
226 |
225 |