266 */ 267 final long default_screen_number = 268 XlibWrapper.DefaultScreen(XToolkit.getDisplay()); 269 final String selection_name = "WM_S" + default_screen_number; 270 271 long selection_owner = 272 XlibWrapper.XGetSelectionOwner(XToolkit.getDisplay(), 273 XAtom.get(selection_name).getAtom()); 274 if (insLog.isLoggable(PlatformLogger.FINE)) { 275 insLog.finer("selection owner of " + selection_name 276 + " is " + selection_owner); 277 } 278 279 if (selection_owner != XConstants.None) { 280 return false; 281 } 282 283 winmgr_running = false; 284 substruct.set_event_mask(XConstants.SubstructureRedirectMask); 285 286 XToolkit.WITH_XERROR_HANDLER(detectWMHandler); 287 XlibWrapper.XChangeWindowAttributes(XToolkit.getDisplay(), 288 XToolkit.getDefaultRootWindow(), 289 XConstants.CWEventMask, 290 substruct.pData); 291 XToolkit.RESTORE_XERROR_HANDLER(); 292 293 /* 294 * If no WM is running then our selection for SubstructureRedirect 295 * succeeded and needs to be undone (hey we are *not* a WM ;-). 296 */ 297 if (!winmgr_running) { 298 substruct.set_event_mask(0); 299 XlibWrapper.XChangeWindowAttributes(XToolkit.getDisplay(), 300 XToolkit.getDefaultRootWindow(), 301 XConstants.CWEventMask, 302 substruct.pData); 303 if (insLog.isLoggable(PlatformLogger.FINE)) { 304 insLog.finer("It looks like there is no WM thus NO_WM"); 305 } 306 } 307 308 return !winmgr_running; 309 } finally { 310 substruct.dispose(); 311 } 600 */ 601 static final XAtom XA_ICEWM_WINOPTHINT = new XAtom("_ICEWM_WINOPTHINT", false); 602 static final char opt[] = { 603 'A','W','T','_','I','C','E','W','M','_','T','E','S','T','\0', 604 'a','l','l','W','o','r','k','s','p','a','c','e','s','\0', 605 '0','\0' 606 }; 607 static boolean prepareIsIceWM() { 608 /* 609 * Choose something innocuous: "AWT_ICEWM_TEST allWorkspaces 0". 610 * IceWM expects "class\0option\0arg\0" with zero bytes as delimiters. 611 */ 612 613 if (!XA_ICEWM_WINOPTHINT.isInterned()) { 614 log.finer("{0} is not interned", XA_ICEWM_WINOPTHINT); 615 return false; 616 } 617 618 XToolkit.awtLock(); 619 try { 620 XToolkit.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); 621 XlibWrapper.XChangePropertyS(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(), 622 XA_ICEWM_WINOPTHINT.getAtom(), 623 XA_ICEWM_WINOPTHINT.getAtom(), 624 8, XConstants.PropModeReplace, 625 new String(opt)); 626 XToolkit.RESTORE_XERROR_HANDLER(); 627 628 if (XToolkit.saved_error != null && XToolkit.saved_error.get_error_code() != XConstants.Success) { 629 log.finer("Erorr getting XA_ICEWM_WINOPTHINT property"); 630 return false; 631 } 632 log.finer("Prepared for IceWM detection"); 633 return true; 634 } finally { 635 XToolkit.awtUnlock(); 636 } 637 } 638 639 /* 640 * Is IceWM running? 641 * 642 * Note well: Only call this if awt_wm_prepareIsIceWM succeeded, or a 643 * false positive will be reported. 644 */ 645 static boolean isIceWM() { 646 if (!XA_ICEWM_WINOPTHINT.isInterned()) { 647 log.finer("{0} is not interned", XA_ICEWM_WINOPTHINT); 648 return false; | 266 */ 267 final long default_screen_number = 268 XlibWrapper.DefaultScreen(XToolkit.getDisplay()); 269 final String selection_name = "WM_S" + default_screen_number; 270 271 long selection_owner = 272 XlibWrapper.XGetSelectionOwner(XToolkit.getDisplay(), 273 XAtom.get(selection_name).getAtom()); 274 if (insLog.isLoggable(PlatformLogger.FINE)) { 275 insLog.finer("selection owner of " + selection_name 276 + " is " + selection_owner); 277 } 278 279 if (selection_owner != XConstants.None) { 280 return false; 281 } 282 283 winmgr_running = false; 284 substruct.set_event_mask(XConstants.SubstructureRedirectMask); 285 286 XErrorHandlerUtil.WITH_XERROR_HANDLER(detectWMHandler); 287 XlibWrapper.XChangeWindowAttributes(XToolkit.getDisplay(), 288 XToolkit.getDefaultRootWindow(), 289 XConstants.CWEventMask, 290 substruct.pData); 291 XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); 292 293 /* 294 * If no WM is running then our selection for SubstructureRedirect 295 * succeeded and needs to be undone (hey we are *not* a WM ;-). 296 */ 297 if (!winmgr_running) { 298 substruct.set_event_mask(0); 299 XlibWrapper.XChangeWindowAttributes(XToolkit.getDisplay(), 300 XToolkit.getDefaultRootWindow(), 301 XConstants.CWEventMask, 302 substruct.pData); 303 if (insLog.isLoggable(PlatformLogger.FINE)) { 304 insLog.finer("It looks like there is no WM thus NO_WM"); 305 } 306 } 307 308 return !winmgr_running; 309 } finally { 310 substruct.dispose(); 311 } 600 */ 601 static final XAtom XA_ICEWM_WINOPTHINT = new XAtom("_ICEWM_WINOPTHINT", false); 602 static final char opt[] = { 603 'A','W','T','_','I','C','E','W','M','_','T','E','S','T','\0', 604 'a','l','l','W','o','r','k','s','p','a','c','e','s','\0', 605 '0','\0' 606 }; 607 static boolean prepareIsIceWM() { 608 /* 609 * Choose something innocuous: "AWT_ICEWM_TEST allWorkspaces 0". 610 * IceWM expects "class\0option\0arg\0" with zero bytes as delimiters. 611 */ 612 613 if (!XA_ICEWM_WINOPTHINT.isInterned()) { 614 log.finer("{0} is not interned", XA_ICEWM_WINOPTHINT); 615 return false; 616 } 617 618 XToolkit.awtLock(); 619 try { 620 XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance()); 621 XlibWrapper.XChangePropertyS(XToolkit.getDisplay(), XToolkit.getDefaultRootWindow(), 622 XA_ICEWM_WINOPTHINT.getAtom(), 623 XA_ICEWM_WINOPTHINT.getAtom(), 624 8, XConstants.PropModeReplace, 625 new String(opt)); 626 XErrorHandlerUtil.RESTORE_XERROR_HANDLER(); 627 628 if ((XErrorHandlerUtil.saved_error != null) && 629 (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) { 630 log.finer("Erorr getting XA_ICEWM_WINOPTHINT property"); 631 return false; 632 } 633 log.finer("Prepared for IceWM detection"); 634 return true; 635 } finally { 636 XToolkit.awtUnlock(); 637 } 638 } 639 640 /* 641 * Is IceWM running? 642 * 643 * Note well: Only call this if awt_wm_prepareIsIceWM succeeded, or a 644 * false positive will be reported. 645 */ 646 static boolean isIceWM() { 647 if (!XA_ICEWM_WINOPTHINT.isInterned()) { 648 log.finer("{0} is not interned", XA_ICEWM_WINOPTHINT); 649 return false; |