src/solaris/classes/sun/awt/X11/XNETProtocol.java

Print this page




 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;