jdk/src/solaris/classes/sun/awt/X11/XNETProtocol.java
changeset 3938 ef327bd847c0
parent 2472 b7aba00cabb6
child 4214 0fa32d38146b
equal deleted inserted replaced
3934:487e1aa949c4 3938:ef327bd847c0
    25 
    25 
    26 
    26 
    27 package sun.awt.X11;
    27 package sun.awt.X11;
    28 
    28 
    29 import java.awt.Frame;
    29 import java.awt.Frame;
    30 import java.util.logging.Level;
    30 import sun.util.logging.PlatformLogger;
    31 import java.util.logging.Logger;
       
    32 
    31 
    33 final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProtocol
    32 final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProtocol
    34 {
    33 {
    35     private final static Logger log = Logger.getLogger("sun.awt.X11.XNETProtocol");
    34     private final static PlatformLogger log = PlatformLogger.getLogger("sun.awt.X11.XNETProtocol");
    36     private final static Logger iconLog = Logger.getLogger("sun.awt.X11.icon.XNETProtocol");
    35     private final static PlatformLogger iconLog = PlatformLogger.getLogger("sun.awt.X11.icon.XNETProtocol");
    37     private static Logger stateLog = Logger.getLogger("sun.awt.X11.states.XNETProtocol");
    36     private static PlatformLogger stateLog = PlatformLogger.getLogger("sun.awt.X11.states.XNETProtocol");
    38 
    37 
    39     /**
    38     /**
    40      * XStateProtocol
    39      * XStateProtocol
    41      */
    40      */
    42     public boolean supportsState(int state) {
    41     public boolean supportsState(int state) {
    43         return doStateProtocol() ; // TODO - check for Frame constants
    42         return doStateProtocol() ; // TODO - check for Frame constants
    44     }
    43     }
    45 
    44 
    46     public void setState(XWindowPeer window, int state) {
    45     public void setState(XWindowPeer window, int state) {
    47         if (log.isLoggable(Level.FINE)) log.fine("Setting state of " + window + " to " + state);
    46         if (log.isLoggable(PlatformLogger.FINE)) log.fine("Setting state of " + window + " to " + state);
    48         if (window.isShowing()) {
    47         if (window.isShowing()) {
    49             requestState(window, state);
    48             requestState(window, state);
    50         } else {
    49         } else {
    51             setInitialState(window, state);
    50             setInitialState(window, state);
    52         }
    51         }
    53     }
    52     }
    54 
    53 
    55     private void setInitialState(XWindowPeer window, int state) {
    54     private void setInitialState(XWindowPeer window, int state) {
    56         XAtomList old_state = window.getNETWMState();
    55         XAtomList old_state = window.getNETWMState();
    57         log.log(Level.FINE, "Current state of the window {0} is {1}", new Object[] {window, old_state});
    56         log.fine("Current state of the window {0} is {1}", window, old_state);
    58         if ((state & Frame.MAXIMIZED_VERT) != 0) {
    57         if ((state & Frame.MAXIMIZED_VERT) != 0) {
    59             old_state.add(XA_NET_WM_STATE_MAXIMIZED_VERT);
    58             old_state.add(XA_NET_WM_STATE_MAXIMIZED_VERT);
    60         } else {
    59         } else {
    61             old_state.remove(XA_NET_WM_STATE_MAXIMIZED_VERT);
    60             old_state.remove(XA_NET_WM_STATE_MAXIMIZED_VERT);
    62         }
    61         }
    63         if ((state & Frame.MAXIMIZED_HORIZ) != 0) {
    62         if ((state & Frame.MAXIMIZED_HORIZ) != 0) {
    64             old_state.add(XA_NET_WM_STATE_MAXIMIZED_HORZ);
    63             old_state.add(XA_NET_WM_STATE_MAXIMIZED_HORZ);
    65         } else {
    64         } else {
    66             old_state.remove(XA_NET_WM_STATE_MAXIMIZED_HORZ);
    65             old_state.remove(XA_NET_WM_STATE_MAXIMIZED_HORZ);
    67         }
    66         }
    68         log.log(Level.FINE, "Setting initial state of the window {0} to {1}", new Object[] {window, old_state});
    67         log.fine("Setting initial state of the window {0} to {1}", window, old_state);
    69         window.setNETWMState(old_state);
    68         window.setNETWMState(old_state);
    70     }
    69     }
    71 
    70 
    72     private void requestState(XWindowPeer window, int state) {
    71     private void requestState(XWindowPeer window, int state) {
    73         /*
    72         /*
    96                   req.set_data(2, XA_NET_WM_STATE_MAXIMIZED_VERT.getAtom());
    95                   req.set_data(2, XA_NET_WM_STATE_MAXIMIZED_VERT.getAtom());
    97                   break;
    96                   break;
    98               default:
    97               default:
    99                   return;
    98                   return;
   100             }
    99             }
   101             if (log.isLoggable(Level.FINE)) log.fine("Requesting state on " + window + " for " + state);
   100             if (log.isLoggable(PlatformLogger.FINE)) log.fine("Requesting state on " + window + " for " + state);
   102             req.set_type((int)XConstants.ClientMessage);
   101             req.set_type((int)XConstants.ClientMessage);
   103             req.set_window(window.getWindow());
   102             req.set_window(window.getWindow());
   104             req.set_message_type(XA_NET_WM_STATE.getAtom());
   103             req.set_message_type(XA_NET_WM_STATE.getAtom());
   105             req.set_format(32);
   104             req.set_format(32);
   106             req.set_data(0, _NET_WM_STATE_TOGGLE);
   105             req.set_data(0, _NET_WM_STATE_TOGGLE);
   178             req.set_format(32);
   177             req.set_format(32);
   179             req.set_data(0, isAdd ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE);
   178             req.set_data(0, isAdd ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE);
   180             req.set_data(1, state.getAtom());
   179             req.set_data(1, state.getAtom());
   181             // Fix for 6735584: req.data[2] must be set to 0 when only one property is changed
   180             // Fix for 6735584: req.data[2] must be set to 0 when only one property is changed
   182             req.set_data(2, 0);
   181             req.set_data(2, 0);
   183             log.log(Level.FINE, "Setting _NET_STATE atom {0} on {1} for {2}", new Object[] {state, window, Boolean.valueOf(isAdd)});
   182             log.fine("Setting _NET_STATE atom {0} on {1} for {2}", state, window, Boolean.valueOf(isAdd));
   184             XToolkit.awtLock();
   183             XToolkit.awtLock();
   185             try {
   184             try {
   186                 XlibWrapper.XSendEvent(XToolkit.getDisplay(),
   185                 XlibWrapper.XSendEvent(XToolkit.getDisplay(),
   187                         XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()),
   186                         XlibWrapper.RootWindow(XToolkit.getDisplay(), window.getScreenNumber()),
   188                         false,
   187                         false,
   203      * @param window Window which NET_WM_STATE property is being modified
   202      * @param window Window which NET_WM_STATE property is being modified
   204      * @param state State atom to be set/reset
   203      * @param state State atom to be set/reset
   205      * @param reset Indicates operation, 'set' if false, 'reset' if true
   204      * @param reset Indicates operation, 'set' if false, 'reset' if true
   206      */
   205      */
   207     private void setStateHelper(XWindowPeer window, XAtom state, boolean set) {
   206     private void setStateHelper(XWindowPeer window, XAtom state, boolean set) {
   208         log.log(Level.FINER, "Window visibility is: withdrawn={0}, visible={1}, mapped={2} showing={3}",
   207         log.finer("Window visibility is: withdrawn={0}, visible={1}, mapped={2} showing={3}",
   209                 new Object[] {Boolean.valueOf(window.isWithdrawn()), Boolean.valueOf(window.isVisible()),
   208                   Boolean.valueOf(window.isWithdrawn()), Boolean.valueOf(window.isVisible()),
   210                               Boolean.valueOf(window.isMapped()), Boolean.valueOf(window.isShowing())});
   209                   Boolean.valueOf(window.isMapped()), Boolean.valueOf(window.isShowing()));
   211         if (window.isShowing()) {
   210         if (window.isShowing()) {
   212             requestState(window, state, set);
   211             requestState(window, state, set);
   213         } else {
   212         } else {
   214             XAtomList net_wm_state = window.getNETWMState();
   213             XAtomList net_wm_state = window.getNETWMState();
   215             log.log(Level.FINE, "Current state on {0} is {1}", new Object[] {window, net_wm_state});
   214             log.finer("Current state on {0} is {1}", window, net_wm_state);
   216             if (!set) {
   215             if (!set) {
   217                 net_wm_state.remove(state);
   216                 net_wm_state.remove(state);
   218             } else {
   217             } else {
   219                 net_wm_state.add(state);
   218                 net_wm_state.add(state);
   220             }
   219             }
   221             log.log(Level.FINE, "Setting states on {0} to {1}", new Object[] {window, net_wm_state});
   220             log.fine("Setting states on {0} to {1}", window, net_wm_state);
   222             window.setNETWMState(net_wm_state);
   221             window.setNETWMState(net_wm_state);
   223         }
   222         }
   224         XToolkit.XSync();
   223         XToolkit.XSync();
   225     }
   224     }
   226 
   225 
   270             // TODO: How about detecting WM-restart or exit?
   269             // TODO: How about detecting WM-restart or exit?
   271             return;
   270             return;
   272         }
   271         }
   273         NetWindow = checkAnchor(XA_NET_SUPPORTING_WM_CHECK, XAtom.XA_WINDOW);
   272         NetWindow = checkAnchor(XA_NET_SUPPORTING_WM_CHECK, XAtom.XA_WINDOW);
   274         supportChecked = true;
   273         supportChecked = true;
   275         if (log.isLoggable(Level.FINE)) log.fine("### " + this + " is active: " + (NetWindow != 0));
   274         if (log.isLoggable(PlatformLogger.FINE)) log.fine("### " + this + " is active: " + (NetWindow != 0));
   276     }
   275     }
   277 
   276 
   278     boolean active() {
   277     boolean active() {
   279         detect();
   278         detect();
   280         return NetWindow != 0;
   279         return NetWindow != 0;
   307         }
   306         }
   308         String net_wm_name_string = getWMName();
   307         String net_wm_name_string = getWMName();
   309         if (net_wm_name_string == null) {
   308         if (net_wm_name_string == null) {
   310             return false;
   309             return false;
   311         }
   310         }
   312         if (log.isLoggable(Level.FINE)) log.fine("### WM_NAME = " + net_wm_name_string);
   311         if (log.isLoggable(PlatformLogger.FINE)) log.fine("### WM_NAME = " + net_wm_name_string);
   313         return net_wm_name_string.startsWith(name);
   312         return net_wm_name_string.startsWith(name);
   314     }
   313     }
   315 
   314 
   316     String net_wm_name_cache;
   315     String net_wm_name_cache;
   317     public String getWMName() {
   316     public String getWMName() {