196 try {
197 XlibWrapper.XSendEvent(XToolkit.getDisplay(),
198 XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()),
199 false,
200 XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask,
201 req.pData);
202 }
203 finally {
204 XToolkit.awtUnlock();
205 }
206 } finally {
207 req.dispose();
208 }
209 }
210
211 /**
212 * Helper function to set/reset one state in NET_WM_STATE
213 * If window is showing then it uses ClientMessage, otherwise adjusts NET_WM_STATE list
214 * @param window Window which NET_WM_STATE property is being modified
215 * @param state State atom to be set/reset
216 * @param reset Indicates operation, 'set' if false, 'reset' if true
217 */
218 private void setStateHelper(XWindowPeer window, XAtom state, boolean set) {
219 if (log.isLoggable(PlatformLogger.Level.FINER)) {
220 log.finer("Window visibility is: withdrawn={0}, visible={1}, mapped={2} showing={3}",
221 Boolean.valueOf(window.isWithdrawn()), Boolean.valueOf(window.isVisible()),
222 Boolean.valueOf(window.isMapped()), Boolean.valueOf(window.isShowing()));
223 }
224 if (window.isShowing()) {
225 requestState(window, state, set);
226 } else {
227 XAtomList net_wm_state = window.getNETWMState();
228 if (log.isLoggable(PlatformLogger.Level.FINER)) {
229 log.finer("Current state on {0} is {1}", window, net_wm_state);
230 }
231 if (!set) {
232 net_wm_state.remove(state);
233 } else {
234 net_wm_state.add(state);
235 }
236 if (log.isLoggable(PlatformLogger.Level.FINE)) {
237 log.fine("Setting states on {0} to {1}", window, net_wm_state);
238 }
239 window.setNETWMState(net_wm_state);
240 }
241 XToolkit.XSync();
242 }
243
244 public void setLayer(XWindowPeer window, int layer) {
245 setStateHelper(window, XA_NET_WM_STATE_ABOVE, layer == LAYER_ALWAYS_ON_TOP);
246 }
247
248 /* New "netwm" spec from www.freedesktop.org */
249 XAtom XA_UTF8_STRING = XAtom.get("UTF8_STRING"); /* like STRING but encoding is UTF-8 */
250 XAtom XA_NET_SUPPORTING_WM_CHECK = XAtom.get("_NET_SUPPORTING_WM_CHECK");
251 XAtom XA_NET_SUPPORTED = XAtom.get("_NET_SUPPORTED"); /* list of protocols (property of root) */
252 XAtom XA_NET_WM_NAME = XAtom.get("_NET_WM_NAME"); /* window property */
253 XAtom XA_NET_WM_STATE = XAtom.get("_NET_WM_STATE");/* both window property and request */
254
255 /*
256 * _NET_WM_STATE is a list of atoms.
257 * NB: Standard spelling is "HORZ" (yes, without an 'I'), but KDE2
258 * uses misspelled "HORIZ" (see KDE bug #20229). This was fixed in
259 * KDE 2.2. Under earlier versions of KDE2 horizontal and full
260 * maximization doesn't work .
261 */
262 XAtom XA_NET_WM_STATE_MAXIMIZED_HORZ = XAtom.get("_NET_WM_STATE_MAXIMIZED_HORZ");
263 XAtom XA_NET_WM_STATE_MAXIMIZED_VERT = XAtom.get("_NET_WM_STATE_MAXIMIZED_VERT");
264 XAtom XA_NET_WM_STATE_SHADED = XAtom.get("_NET_WM_STATE_SHADED");
265 XAtom XA_NET_WM_STATE_ABOVE = XAtom.get("_NET_WM_STATE_ABOVE");
266 XAtom XA_NET_WM_STATE_MODAL = XAtom.get("_NET_WM_STATE_MODAL");
267 XAtom XA_NET_WM_STATE_FULLSCREEN = XAtom.get("_NET_WM_STATE_FULLSCREEN");
268 XAtom XA_NET_WM_STATE_BELOW = XAtom.get("_NET_WM_STATE_BELOW");
269 XAtom XA_NET_WM_STATE_HIDDEN = XAtom.get("_NET_WM_STATE_HIDDEN");
270 XAtom XA_NET_WM_STATE_SKIP_TASKBAR = XAtom.get("_NET_WM_STATE_SKIP_TASKBAR");
271 XAtom XA_NET_WM_STATE_SKIP_PAGER = XAtom.get("_NET_WM_STATE_SKIP_PAGER");
306 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE);
307 if (stateLog.isLoggable(PlatformLogger.Level.FINER)) {
308 stateLog.finer("doStateProtocol() returns " + res);
309 }
310 return res;
311 }
312
313 boolean doLayerProtocol() {
314 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE_ABOVE);
315 return res;
316 }
317
318 boolean doModalityProtocol() {
319 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE_MODAL);
320 return res;
321 }
322
323 boolean doOpacityProtocol() {
324 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_WINDOW_OPACITY);
325 return res;
326 }
327
328 boolean isWMName(String name) {
329 if (!active()) {
330 return false;
331 }
332 String net_wm_name_string = getWMName();
333 if (net_wm_name_string == null) {
334 return false;
335 }
336 if (log.isLoggable(PlatformLogger.Level.FINE)) {
337 log.fine("### WM_NAME = " + net_wm_name_string);
338 }
339 return net_wm_name_string.startsWith(name);
340 }
341
342 String net_wm_name_cache;
343 public String getWMName() {
344 if (!active()) {
345 return null;
|
196 try {
197 XlibWrapper.XSendEvent(XToolkit.getDisplay(),
198 XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()),
199 false,
200 XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask,
201 req.pData);
202 }
203 finally {
204 XToolkit.awtUnlock();
205 }
206 } finally {
207 req.dispose();
208 }
209 }
210
211 /**
212 * Helper function to set/reset one state in NET_WM_STATE
213 * If window is showing then it uses ClientMessage, otherwise adjusts NET_WM_STATE list
214 * @param window Window which NET_WM_STATE property is being modified
215 * @param state State atom to be set/reset
216 * @param set Indicates operation, 'set' if false, 'reset' if true
217 */
218 private void setStateHelper(XWindowPeer window, XAtom state, boolean set) {
219 if (log.isLoggable(PlatformLogger.Level.FINER)) {
220 log.finer("Window visibility is: withdrawn={0}, visible={1}, mapped={2} showing={3}",
221 Boolean.valueOf(window.isWithdrawn()), Boolean.valueOf(window.isVisible()),
222 Boolean.valueOf(window.isMapped()), Boolean.valueOf(window.isShowing()));
223 }
224 if (window.isShowing()) {
225 requestState(window, state, set);
226 } else {
227 XAtomList net_wm_state = window.getNETWMState();
228 if (log.isLoggable(PlatformLogger.Level.FINER)) {
229 log.finer("Current state on {0} is {1}", window, net_wm_state);
230 }
231 if (!set) {
232 net_wm_state.remove(state);
233 } else {
234 net_wm_state.add(state);
235 }
236 if (log.isLoggable(PlatformLogger.Level.FINE)) {
237 log.fine("Setting states on {0} to {1}", window, net_wm_state);
238 }
239 window.setNETWMState(net_wm_state);
240 }
241 XToolkit.XSync();
242 }
243
244 public void setLayer(XWindowPeer window, int layer) {
245 setStateHelper(window, XA_NET_WM_STATE_ABOVE, layer == LAYER_ALWAYS_ON_TOP);
246 }
247
248 /* New "netwm" spec from www.freedesktop.org */
249 XAtom XA_UTF8_STRING = XAtom.get("UTF8_STRING"); /* like STRING but encoding is UTF-8 */
250 XAtom XA_NET_SUPPORTING_WM_CHECK = XAtom.get("_NET_SUPPORTING_WM_CHECK");
251 XAtom XA_NET_SUPPORTED = XAtom.get("_NET_SUPPORTED"); /* list of protocols (property of root) */
252 XAtom XA_NET_ACTIVE_WINDOW = XAtom.get("_NET_ACTIVE_WINDOW");
253 XAtom XA_NET_WM_NAME = XAtom.get("_NET_WM_NAME"); /* window property */
254 XAtom XA_NET_WM_STATE = XAtom.get("_NET_WM_STATE");/* both window property and request */
255
256 /*
257 * _NET_WM_STATE is a list of atoms.
258 * NB: Standard spelling is "HORZ" (yes, without an 'I'), but KDE2
259 * uses misspelled "HORIZ" (see KDE bug #20229). This was fixed in
260 * KDE 2.2. Under earlier versions of KDE2 horizontal and full
261 * maximization doesn't work .
262 */
263 XAtom XA_NET_WM_STATE_MAXIMIZED_HORZ = XAtom.get("_NET_WM_STATE_MAXIMIZED_HORZ");
264 XAtom XA_NET_WM_STATE_MAXIMIZED_VERT = XAtom.get("_NET_WM_STATE_MAXIMIZED_VERT");
265 XAtom XA_NET_WM_STATE_SHADED = XAtom.get("_NET_WM_STATE_SHADED");
266 XAtom XA_NET_WM_STATE_ABOVE = XAtom.get("_NET_WM_STATE_ABOVE");
267 XAtom XA_NET_WM_STATE_MODAL = XAtom.get("_NET_WM_STATE_MODAL");
268 XAtom XA_NET_WM_STATE_FULLSCREEN = XAtom.get("_NET_WM_STATE_FULLSCREEN");
269 XAtom XA_NET_WM_STATE_BELOW = XAtom.get("_NET_WM_STATE_BELOW");
270 XAtom XA_NET_WM_STATE_HIDDEN = XAtom.get("_NET_WM_STATE_HIDDEN");
271 XAtom XA_NET_WM_STATE_SKIP_TASKBAR = XAtom.get("_NET_WM_STATE_SKIP_TASKBAR");
272 XAtom XA_NET_WM_STATE_SKIP_PAGER = XAtom.get("_NET_WM_STATE_SKIP_PAGER");
307 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE);
308 if (stateLog.isLoggable(PlatformLogger.Level.FINER)) {
309 stateLog.finer("doStateProtocol() returns " + res);
310 }
311 return res;
312 }
313
314 boolean doLayerProtocol() {
315 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE_ABOVE);
316 return res;
317 }
318
319 boolean doModalityProtocol() {
320 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE_MODAL);
321 return res;
322 }
323
324 boolean doOpacityProtocol() {
325 boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_WINDOW_OPACITY);
326 return res;
327 }
328
329 public void setActiveWindow(XWindow window) {
330 if (!active() && !checkProtocol(XA_NET_SUPPORTED, XA_NET_ACTIVE_WINDOW)) {
331 return;
332 }
333
334 XClientMessageEvent msg = new XClientMessageEvent();
335 XToolkit.awtLock();
336 try {
337 msg.zero();
338 msg.set_type(XConstants.ClientMessage);
339 msg.set_message_type(XA_NET_ACTIVE_WINDOW.getAtom());
340 msg.set_display(XToolkit.getDisplay());
341 msg.set_window(window.getWindow());
342 msg.set_format(32);
343 msg.set_data(0, 1);
344 msg.set_data(1, XToolkit.getCurrentServerTime());
345 msg.set_data(2, 0);
346
347 XlibWrapper.XSendEvent(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(), false,
348 XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask, msg.getPData());
349
350 } finally {
351 XToolkit.awtUnlock();
352 msg.dispose();
353 }
354 }
355
356 boolean isWMName(String name) {
357 if (!active()) {
358 return false;
359 }
360 String net_wm_name_string = getWMName();
361 if (net_wm_name_string == null) {
362 return false;
363 }
364 if (log.isLoggable(PlatformLogger.Level.FINE)) {
365 log.fine("### WM_NAME = " + net_wm_name_string);
366 }
367 return net_wm_name_string.startsWith(name);
368 }
369
370 String net_wm_name_cache;
371 public String getWMName() {
372 if (!active()) {
373 return null;
|