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

Print this page




  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";