26
27 package sun.awt.X11;
28
29 import java.awt.Frame;
30 import sun.util.logging.PlatformLogger;
31
32 final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProtocol
33 {
34 private final static PlatformLogger log = PlatformLogger.getLogger("sun.awt.X11.XNETProtocol");
35 private final static PlatformLogger iconLog = PlatformLogger.getLogger("sun.awt.X11.icon.XNETProtocol");
36 private static PlatformLogger stateLog = PlatformLogger.getLogger("sun.awt.X11.states.XNETProtocol");
37
38 /**
39 * XStateProtocol
40 */
41 public boolean supportsState(int state) {
42 return doStateProtocol() ; // TODO - check for Frame constants
43 }
44
45 public void setState(XWindowPeer window, int state) {
46 if (log.isLoggable(PlatformLogger.FINE)) log.fine("Setting state of " + window + " to " + state);
47 if (window.isShowing()) {
48 requestState(window, state);
49 } else {
50 setInitialState(window, state);
51 }
52 }
53
54 private void setInitialState(XWindowPeer window, int state) {
55 XAtomList old_state = window.getNETWMState();
56 log.fine("Current state of the window {0} is {1}", window, old_state);
57 if ((state & Frame.MAXIMIZED_VERT) != 0) {
58 old_state.add(XA_NET_WM_STATE_MAXIMIZED_VERT);
59 } else {
60 old_state.remove(XA_NET_WM_STATE_MAXIMIZED_VERT);
61 }
62 if ((state & Frame.MAXIMIZED_HORIZ) != 0) {
63 old_state.add(XA_NET_WM_STATE_MAXIMIZED_HORZ);
64 } else {
65 old_state.remove(XA_NET_WM_STATE_MAXIMIZED_HORZ);
66 }
80 XClientMessageEvent req = new XClientMessageEvent();
81 try {
82 switch(max_changed) {
83 case 0:
84 return;
85 case Frame.MAXIMIZED_HORIZ:
86 req.set_data(1, XA_NET_WM_STATE_MAXIMIZED_HORZ.getAtom());
87 req.set_data(2, 0);
88 break;
89 case Frame.MAXIMIZED_VERT:
90 req.set_data(1, XA_NET_WM_STATE_MAXIMIZED_VERT.getAtom());
91 req.set_data(2, 0);
92 break;
93 case Frame.MAXIMIZED_BOTH:
94 req.set_data(1, XA_NET_WM_STATE_MAXIMIZED_HORZ.getAtom());
95 req.set_data(2, XA_NET_WM_STATE_MAXIMIZED_VERT.getAtom());
96 break;
97 default:
98 return;
99 }
100 if (log.isLoggable(PlatformLogger.FINE)) log.fine("Requesting state on " + window + " for " + state);
101 req.set_type((int)XConstants.ClientMessage);
102 req.set_window(window.getWindow());
103 req.set_message_type(XA_NET_WM_STATE.getAtom());
104 req.set_format(32);
105 req.set_data(0, _NET_WM_STATE_TOGGLE);
106 XToolkit.awtLock();
107 try {
108 XlibWrapper.XSendEvent(XToolkit.getDisplay(),
109 XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()),
110 false,
111 XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask,
112 req.pData);
113 }
114 finally {
115 XToolkit.awtUnlock();
116 }
117 } finally {
118 req.dispose();
119 }
120 }
257 public final XAtom XA_NET_WM_WINDOW_TYPE_DIALOG = XAtom.get("_NET_WM_WINDOW_TYPE_DIALOG");
258 public final XAtom XA_NET_WM_WINDOW_TYPE_UTILITY = XAtom.get("_NET_WM_WINDOW_TYPE_UTILITY");
259 public final XAtom XA_NET_WM_WINDOW_TYPE_POPUP_MENU = XAtom.get("_NET_WM_WINDOW_TYPE_POPUP_MENU");
260
261 XAtom XA_NET_WM_WINDOW_OPACITY = XAtom.get("_NET_WM_WINDOW_OPACITY");
262
263 /* For _NET_WM_STATE ClientMessage requests */
264 final static int _NET_WM_STATE_REMOVE =0; /* remove/unset property */
265 final static int _NET_WM_STATE_ADD =1; /* add/set property */
266 final static int _NET_WM_STATE_TOGGLE =2; /* toggle property */
267
268 boolean supportChecked = false;
269 long NetWindow = 0;
270 void detect() {
271 if (supportChecked) {
272 // TODO: How about detecting WM-restart or exit?
273 return;
274 }
275 NetWindow = checkAnchor(XA_NET_SUPPORTING_WM_CHECK, XAtom.XA_WINDOW);
276 supportChecked = true;
277 if (log.isLoggable(PlatformLogger.FINE)) log.fine("### " + this + " is active: " + (NetWindow != 0));
278 }
279
280 boolean active() {
281 detect();
282 return NetWindow != 0;
283 }
284
285 boolean doStateProtocol() {
286 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE);
287 stateLog.finer("doStateProtocol() returns " + res);
288 return res;
289 }
290
291 boolean doLayerProtocol() {
292 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE_ABOVE);
293 return res;
294 }
295
296 boolean doModalityProtocol() {
297 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE_MODAL);
298 return res;
299 }
300
301 boolean doOpacityProtocol() {
302 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_WINDOW_OPACITY);
303 return res;
304 }
305
306 boolean isWMName(String name) {
307 if (!active()) {
308 return false;
309 }
310 String net_wm_name_string = getWMName();
311 if (net_wm_name_string == null) {
312 return false;
313 }
314 if (log.isLoggable(PlatformLogger.FINE)) log.fine("### WM_NAME = " + net_wm_name_string);
315 return net_wm_name_string.startsWith(name);
316 }
317
318 String net_wm_name_cache;
319 public String getWMName() {
320 if (!active()) {
321 return null;
322 }
323
324 if (net_wm_name_cache != null) {
325 return net_wm_name_cache;
326 }
327
328 /*
329 * Check both UTF8_STRING and STRING. We only call this function
330 * with ASCII names and UTF8 preserves ASCII bit-wise. wm-spec
331 * mandates UTF8_STRING for _NET_WM_NAME but at least sawfish-1.0
332 * still uses STRING. (mmm, moving targets...).
333 */
334 String charSet = "UTF8";
|
26
27 package sun.awt.X11;
28
29 import java.awt.Frame;
30 import sun.util.logging.PlatformLogger;
31
32 final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProtocol
33 {
34 private final static PlatformLogger log = PlatformLogger.getLogger("sun.awt.X11.XNETProtocol");
35 private final static PlatformLogger iconLog = PlatformLogger.getLogger("sun.awt.X11.icon.XNETProtocol");
36 private static PlatformLogger stateLog = PlatformLogger.getLogger("sun.awt.X11.states.XNETProtocol");
37
38 /**
39 * XStateProtocol
40 */
41 public boolean supportsState(int state) {
42 return doStateProtocol() ; // TODO - check for Frame constants
43 }
44
45 public void setState(XWindowPeer window, int state) {
46 if (log.isLoggable(PlatformLogger.FINE)) {
47 log.fine("Setting state of " + window + " to " + state);
48 }
49 if (window.isShowing()) {
50 requestState(window, state);
51 } else {
52 setInitialState(window, state);
53 }
54 }
55
56 private void setInitialState(XWindowPeer window, int state) {
57 XAtomList old_state = window.getNETWMState();
58 log.fine("Current state of the window {0} is {1}", window, old_state);
59 if ((state & Frame.MAXIMIZED_VERT) != 0) {
60 old_state.add(XA_NET_WM_STATE_MAXIMIZED_VERT);
61 } else {
62 old_state.remove(XA_NET_WM_STATE_MAXIMIZED_VERT);
63 }
64 if ((state & Frame.MAXIMIZED_HORIZ) != 0) {
65 old_state.add(XA_NET_WM_STATE_MAXIMIZED_HORZ);
66 } else {
67 old_state.remove(XA_NET_WM_STATE_MAXIMIZED_HORZ);
68 }
82 XClientMessageEvent req = new XClientMessageEvent();
83 try {
84 switch(max_changed) {
85 case 0:
86 return;
87 case Frame.MAXIMIZED_HORIZ:
88 req.set_data(1, XA_NET_WM_STATE_MAXIMIZED_HORZ.getAtom());
89 req.set_data(2, 0);
90 break;
91 case Frame.MAXIMIZED_VERT:
92 req.set_data(1, XA_NET_WM_STATE_MAXIMIZED_VERT.getAtom());
93 req.set_data(2, 0);
94 break;
95 case Frame.MAXIMIZED_BOTH:
96 req.set_data(1, XA_NET_WM_STATE_MAXIMIZED_HORZ.getAtom());
97 req.set_data(2, XA_NET_WM_STATE_MAXIMIZED_VERT.getAtom());
98 break;
99 default:
100 return;
101 }
102 if (log.isLoggable(PlatformLogger.FINE)) {
103 log.fine("Requesting state on " + window + " for " + state);
104 }
105 req.set_type((int)XConstants.ClientMessage);
106 req.set_window(window.getWindow());
107 req.set_message_type(XA_NET_WM_STATE.getAtom());
108 req.set_format(32);
109 req.set_data(0, _NET_WM_STATE_TOGGLE);
110 XToolkit.awtLock();
111 try {
112 XlibWrapper.XSendEvent(XToolkit.getDisplay(),
113 XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()),
114 false,
115 XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask,
116 req.pData);
117 }
118 finally {
119 XToolkit.awtUnlock();
120 }
121 } finally {
122 req.dispose();
123 }
124 }
261 public final XAtom XA_NET_WM_WINDOW_TYPE_DIALOG = XAtom.get("_NET_WM_WINDOW_TYPE_DIALOG");
262 public final XAtom XA_NET_WM_WINDOW_TYPE_UTILITY = XAtom.get("_NET_WM_WINDOW_TYPE_UTILITY");
263 public final XAtom XA_NET_WM_WINDOW_TYPE_POPUP_MENU = XAtom.get("_NET_WM_WINDOW_TYPE_POPUP_MENU");
264
265 XAtom XA_NET_WM_WINDOW_OPACITY = XAtom.get("_NET_WM_WINDOW_OPACITY");
266
267 /* For _NET_WM_STATE ClientMessage requests */
268 final static int _NET_WM_STATE_REMOVE =0; /* remove/unset property */
269 final static int _NET_WM_STATE_ADD =1; /* add/set property */
270 final static int _NET_WM_STATE_TOGGLE =2; /* toggle property */
271
272 boolean supportChecked = false;
273 long NetWindow = 0;
274 void detect() {
275 if (supportChecked) {
276 // TODO: How about detecting WM-restart or exit?
277 return;
278 }
279 NetWindow = checkAnchor(XA_NET_SUPPORTING_WM_CHECK, XAtom.XA_WINDOW);
280 supportChecked = true;
281 if (log.isLoggable(PlatformLogger.FINE)) {
282 log.fine("### " + this + " is active: " + (NetWindow != 0));
283 }
284 }
285
286 boolean active() {
287 detect();
288 return NetWindow != 0;
289 }
290
291 boolean doStateProtocol() {
292 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE);
293 if (stateLog.isLoggable(PlatformLogger.FINER)) {
294 stateLog.finer("doStateProtocol() returns " + res);
295 }
296 return res;
297 }
298
299 boolean doLayerProtocol() {
300 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE_ABOVE);
301 return res;
302 }
303
304 boolean doModalityProtocol() {
305 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE_MODAL);
306 return res;
307 }
308
309 boolean doOpacityProtocol() {
310 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_WINDOW_OPACITY);
311 return res;
312 }
313
314 boolean isWMName(String name) {
315 if (!active()) {
316 return false;
317 }
318 String net_wm_name_string = getWMName();
319 if (net_wm_name_string == null) {
320 return false;
321 }
322 if (log.isLoggable(PlatformLogger.FINE)) {
323 log.fine("### WM_NAME = " + net_wm_name_string);
324 }
325 return net_wm_name_string.startsWith(name);
326 }
327
328 String net_wm_name_cache;
329 public String getWMName() {
330 if (!active()) {
331 return null;
332 }
333
334 if (net_wm_name_cache != null) {
335 return net_wm_name_cache;
336 }
337
338 /*
339 * Check both UTF8_STRING and STRING. We only call this function
340 * with ASCII names and UTF8 preserves ASCII bit-wise. wm-spec
341 * mandates UTF8_STRING for _NET_WM_NAME but at least sawfish-1.0
342 * still uses STRING. (mmm, moving targets...).
343 */
344 String charSet = "UTF8";
|