< prev index next >

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

Print this page
rev 1556 : 6794764: Translucent windows are completely repainted on every paint event, on Windows
6719382: Printing of AWT components on windows is not working
6726866: Repainting artifacts when resizing or dragging JInternalFrames in non-opaque toplevel
6683775: Painting artifacts is seen when panel is made setOpaque(false) for a translucent window
Reviewed-by: anthony, tdv, alexp
rev 1571 : 8010297: Missing isLoggable() checks in logging code
Summary: Add isLoggable() checks
Reviewed-by: anthony, mchung, serb
Contributed-by: Laurent Bourges <bourges.laurent@gmail.com>


 187     protected String getWMName() {
 188         String name = target.getName();
 189         if (name == null || name.trim().equals("")) {
 190             name = " ";
 191         }
 192         return name;
 193     }
 194 
 195     void postInit(XCreateWindowParams params) {
 196         super.postInit(params);
 197 
 198         // Init WM_PROTOCOLS atom
 199         initWMProtocols();
 200 
 201         // Set WM_TRANSIENT_FOR and group_leader
 202         Window t_window = (Window)target;
 203         Window owner = t_window.getOwner();
 204         if (owner != null) {
 205             ownerPeer = (XWindowPeer)owner.getPeer();
 206             if (focusLog.isLoggable(Level.FINER)) {
 207                 focusLog.fine("Owner is " + owner);
 208                 focusLog.fine("Owner peer is " + ownerPeer);
 209                 focusLog.fine("Owner X window " + Long.toHexString(ownerPeer.getWindow()));
 210                 focusLog.fine("Owner content X window " + Long.toHexString(ownerPeer.getContentWindow()));
 211             }
 212             // as owner window may be an embedded window, we must get a toplevel window
 213             // to set as TRANSIENT_FOR hint
 214             long ownerWindow = ownerPeer.getWindow();
 215             if (ownerWindow != 0) {
 216                 XToolkit.awtLock();
 217                 try {
 218                     // Set WM_TRANSIENT_FOR
 219                     if (focusLog.isLoggable(Level.FINE)) focusLog.fine("Setting transient on " + Long.toHexString(getWindow())

 220                                                                        + " for " + Long.toHexString(ownerWindow));

 221                     setToplevelTransientFor(this, ownerPeer, false, true);
 222 
 223                     // Set group leader
 224                     XWMHints hints = getWMHints();
 225                     hints.set_flags(hints.get_flags() | (int)XlibWrapper.WindowGroupHint);
 226                     hints.set_window_group(ownerWindow);
 227                     XlibWrapper.XSetWMHints(XToolkit.getDisplay(), getWindow(), hints.pData);
 228                 }
 229                 finally {
 230                     XToolkit.awtUnlock();
 231                 }
 232             }
 233         }
 234 
 235          // Init warning window(for applets)
 236         if (((Window)target).getWarningString() != null) {
 237             // accessSystemTray permission allows to display TrayIcon, TrayIcon tooltip
 238             // and TrayIcon balloon windows without a warning window.
 239             if (!WindowAccessor.isTrayIconWindow((Window)target)) {
 240                 warningWindow = new XWarningWindow((Window)target, getWindow(), this);


 783         repositionSecurityWarning();
 784     }
 785 
 786     final void requestXFocus(long time) {
 787         requestXFocus(time, true);
 788     }
 789 
 790     final void requestXFocus() {
 791         requestXFocus(0, false);
 792     }
 793 
 794     /**
 795      * Requests focus to this top-level. Descendants should override to provide
 796      * implementations based on a class of top-level.
 797      */
 798     protected void requestXFocus(long time, boolean timeProvided) {
 799         // Since in XAWT focus is synthetic and all basic Windows are
 800         // override_redirect all we can do is check whether our parent
 801         // is active. If it is - we can freely synthesize focus transfer.
 802         // Luckily, this logic is already implemented in requestWindowFocus.
 803         if (focusLog.isLoggable(Level.FINE)) focusLog.fine("Requesting window focus");


 804         requestWindowFocus(time, timeProvided);
 805     }
 806 
 807     public final boolean focusAllowedFor() {
 808         if (isNativelyNonFocusableWindow()) {
 809             return false;
 810         }
 811 /*
 812         Window target = (Window)this.target;
 813         if (!target.isVisible() ||
 814             !target.isEnabled() ||
 815             !target.isFocusable())
 816         {
 817             return false;
 818         }
 819 */
 820         if (isModalBlocked()) {
 821             return false;
 822         }
 823         return true;


 993             XQueryTree qt = new XQueryTree(wi);
 994             try {
 995                 if (qt.execute() == 0) {
 996                     return 0;
 997                 }
 998                 root = qt.get_root();
 999                 wi = qt.get_parent();
1000             } finally {
1001                 qt.dispose();
1002             }
1003 
1004         } while (wi != root);
1005 
1006         return ret;
1007     }
1008     private boolean isDesktopWindow( long wi ) {
1009         return XWM.getWM().isDesktopWindow( wi );
1010     }
1011 
1012     private void updateAlwaysOnTop() {

1013         log.log(Level.FINE, "Promoting always-on-top state {0}", Boolean.valueOf(alwaysOnTop));

1014         XWM.getWM().setLayer(this,
1015                              alwaysOnTop ?
1016                              XLayerProtocol.LAYER_ALWAYS_ON_TOP :
1017                              XLayerProtocol.LAYER_NORMAL);
1018     }
1019 
1020     public void updateAlwaysOnTopState() {
1021         this.alwaysOnTop = ((Window) this.target).isAlwaysOnTop();
1022         updateAlwaysOnTop();
1023     }
1024 
1025     boolean isLocationByPlatform() {
1026         return locationByPlatform;
1027     }
1028 
1029     private void promoteDefaultPosition() {
1030         this.locationByPlatform = ((Window)target).isLocationByPlatform();
1031         if (locationByPlatform) {
1032             XToolkit.awtLock();
1033             try {


1780         } else {
1781             focusLog.fine("Parent window is not active");
1782         }
1783         ComponentPeer peer = ComponentAccessor.getPeer(owner);
1784         if (peer instanceof XDecoratedPeer) {
1785             XDecoratedPeer wpeer = (XDecoratedPeer) peer;
1786             if (wpeer.requestWindowFocus(this, time, timeProvided)) {
1787                 focusLog.fine("Parent window accepted focus request - generating focus for this window");
1788                 return true;
1789             }
1790         }
1791         focusLog.fine("Denied - parent window is not active and didn't accept focus request");
1792         return false;
1793     }
1794 
1795     // This method is to be overriden in XDecoratedPeer.
1796     void setActualFocusedWindow(XWindowPeer actualFocusedWindow) {
1797     }
1798 
1799     public void xSetVisible(boolean visible) {
1800         if (log.isLoggable(Level.FINE)) log.fine("Setting visible on " + this + " to " + visible);


1801         XToolkit.awtLock();
1802         try {
1803             this.visible = visible;
1804             if (visible) {
1805                 XlibWrapper.XMapRaised(XToolkit.getDisplay(), getWindow());
1806             } else {
1807                 XlibWrapper.XUnmapWindow(XToolkit.getDisplay(), getWindow());
1808             }
1809             XlibWrapper.XFlush(XToolkit.getDisplay());
1810         }
1811         finally {
1812             XToolkit.awtUnlock();
1813         }
1814     }
1815 
1816     private int dropTargetCount = 0;
1817 
1818     public synchronized void addDropTarget() {
1819         if (dropTargetCount == 0) {
1820             long window = getWindow();


1964             // that XBaseWindow.dispatchEvent does the opposite
1965             // translation)
1966             // Note that we need to retarget XCrossingEvents to content window
1967             // since it generates MOUSE_ENTERED/MOUSE_EXITED for frame and dialog.
1968             // (fix for 6390326)
1969             XBaseWindow target = XToolkit.windowToXWindow(xce.get_window());
1970             if (grabLog.isLoggable(Level.FINER)) {
1971                 grabLog.log(Level.FINER, "  -  Grab event target {0}",
1972                             new Object[] {String.valueOf(target)});
1973             }
1974             if (target != null && target != this) {
1975                 target.dispatchEvent(xev);
1976                 return;
1977             }
1978         }
1979         super.handleXCrossingEvent(xev);
1980     }
1981 
1982     public void handleMotionNotify(XEvent xev) {
1983         XMotionEvent xme = xev.get_xmotion();
1984         if (grabLog.isLoggable(Level.FINE)) {
1985             grabLog.log(Level.FINER, "{0}, when grabbed {1}, contains {2}",
1986                         new Object[] {String.valueOf(xme), isGrabbed(),
1987                                       containsGlobal(xme.get_x_root(), xme.get_y_root())});
1988         }
1989         if (isGrabbed()) {
1990             boolean dragging = (xme.get_state() & (Button1Mask | Button2Mask | Button3Mask)) != 0;
1991             // When window is grabbed, all events are dispatched to
1992             // it.  Retarget them to the corresponding windows (notice
1993             // that XBaseWindow.dispatchEvent does the opposite
1994             // translation)
1995             XBaseWindow target = XToolkit.windowToXWindow(xme.get_window());
1996             if (dragging && pressTarget != target) {
1997                 // for some reasons if we grab input MotionNotify for drag is reported with target
1998                 // to underlying window, not to window on which we have initiated drag
1999                 // so we need to retarget them.  Here I use simplified logic which retarget all
2000                 // such events to source of mouse press (or the grabber).  It helps with fix for 6390326.
2001                 // So, I do not want to implement complicated logic for better retargeting.
2002                 target = pressTarget.isVisible() ? pressTarget : this;
2003                 xme.set_window(target.getWindow());
2004                 xme.set_x(xme.get_x_root() - target.getX());


2146         }
2147         if (iOpacity > maxOpacity) {
2148             iOpacity = maxOpacity;
2149         }
2150 
2151         XAtom netWmWindowOpacityAtom = XAtom.get("_NET_WM_WINDOW_OPACITY");
2152 
2153         if (iOpacity == maxOpacity) {
2154             netWmWindowOpacityAtom.DeleteProperty(getWindow());
2155         } else {
2156             netWmWindowOpacityAtom.setCard32Property(getWindow(), iOpacity);
2157         }
2158     }
2159 
2160     @Override
2161     public void setOpaque(boolean isOpaque) {
2162         // no-op
2163     }
2164 
2165     @Override
2166     public void updateWindow(BufferedImage backBuffer) {
2167         // no-op
2168     }
2169 }


 187     protected String getWMName() {
 188         String name = target.getName();
 189         if (name == null || name.trim().equals("")) {
 190             name = " ";
 191         }
 192         return name;
 193     }
 194 
 195     void postInit(XCreateWindowParams params) {
 196         super.postInit(params);
 197 
 198         // Init WM_PROTOCOLS atom
 199         initWMProtocols();
 200 
 201         // Set WM_TRANSIENT_FOR and group_leader
 202         Window t_window = (Window)target;
 203         Window owner = t_window.getOwner();
 204         if (owner != null) {
 205             ownerPeer = (XWindowPeer)owner.getPeer();
 206             if (focusLog.isLoggable(Level.FINER)) {
 207                 focusLog.finer("Owner is " + owner);
 208                 focusLog.finer("Owner peer is " + ownerPeer);
 209                 focusLog.finer("Owner X window " + Long.toHexString(ownerPeer.getWindow()));
 210                 focusLog.finer("Owner content X window " + Long.toHexString(ownerPeer.getContentWindow()));
 211             }
 212             // as owner window may be an embedded window, we must get a toplevel window
 213             // to set as TRANSIENT_FOR hint
 214             long ownerWindow = ownerPeer.getWindow();
 215             if (ownerWindow != 0) {
 216                 XToolkit.awtLock();
 217                 try {
 218                     // Set WM_TRANSIENT_FOR
 219                     if (focusLog.isLoggable(Level.FINE)) {
 220                         focusLog.fine("Setting transient on " + Long.toHexString(getWindow())
 221                                       + " for " + Long.toHexString(ownerWindow));
 222                     }
 223                     setToplevelTransientFor(this, ownerPeer, false, true);
 224 
 225                     // Set group leader
 226                     XWMHints hints = getWMHints();
 227                     hints.set_flags(hints.get_flags() | (int)XlibWrapper.WindowGroupHint);
 228                     hints.set_window_group(ownerWindow);
 229                     XlibWrapper.XSetWMHints(XToolkit.getDisplay(), getWindow(), hints.pData);
 230                 }
 231                 finally {
 232                     XToolkit.awtUnlock();
 233                 }
 234             }
 235         }
 236 
 237          // Init warning window(for applets)
 238         if (((Window)target).getWarningString() != null) {
 239             // accessSystemTray permission allows to display TrayIcon, TrayIcon tooltip
 240             // and TrayIcon balloon windows without a warning window.
 241             if (!WindowAccessor.isTrayIconWindow((Window)target)) {
 242                 warningWindow = new XWarningWindow((Window)target, getWindow(), this);


 785         repositionSecurityWarning();
 786     }
 787 
 788     final void requestXFocus(long time) {
 789         requestXFocus(time, true);
 790     }
 791 
 792     final void requestXFocus() {
 793         requestXFocus(0, false);
 794     }
 795 
 796     /**
 797      * Requests focus to this top-level. Descendants should override to provide
 798      * implementations based on a class of top-level.
 799      */
 800     protected void requestXFocus(long time, boolean timeProvided) {
 801         // Since in XAWT focus is synthetic and all basic Windows are
 802         // override_redirect all we can do is check whether our parent
 803         // is active. If it is - we can freely synthesize focus transfer.
 804         // Luckily, this logic is already implemented in requestWindowFocus.
 805         if (focusLog.isLoggable(Level.FINE)) {
 806             focusLog.fine("Requesting window focus");
 807         }
 808         requestWindowFocus(time, timeProvided);
 809     }
 810 
 811     public final boolean focusAllowedFor() {
 812         if (isNativelyNonFocusableWindow()) {
 813             return false;
 814         }
 815 /*
 816         Window target = (Window)this.target;
 817         if (!target.isVisible() ||
 818             !target.isEnabled() ||
 819             !target.isFocusable())
 820         {
 821             return false;
 822         }
 823 */
 824         if (isModalBlocked()) {
 825             return false;
 826         }
 827         return true;


 997             XQueryTree qt = new XQueryTree(wi);
 998             try {
 999                 if (qt.execute() == 0) {
1000                     return 0;
1001                 }
1002                 root = qt.get_root();
1003                 wi = qt.get_parent();
1004             } finally {
1005                 qt.dispose();
1006             }
1007 
1008         } while (wi != root);
1009 
1010         return ret;
1011     }
1012     private boolean isDesktopWindow( long wi ) {
1013         return XWM.getWM().isDesktopWindow( wi );
1014     }
1015 
1016     private void updateAlwaysOnTop() {
1017         if (log.isLoggable(Level.FINE)) {
1018             log.log(Level.FINE, "Promoting always-on-top state {0}", Boolean.valueOf(alwaysOnTop));
1019         }
1020         XWM.getWM().setLayer(this,
1021                              alwaysOnTop ?
1022                              XLayerProtocol.LAYER_ALWAYS_ON_TOP :
1023                              XLayerProtocol.LAYER_NORMAL);
1024     }
1025 
1026     public void updateAlwaysOnTopState() {
1027         this.alwaysOnTop = ((Window) this.target).isAlwaysOnTop();
1028         updateAlwaysOnTop();
1029     }
1030 
1031     boolean isLocationByPlatform() {
1032         return locationByPlatform;
1033     }
1034 
1035     private void promoteDefaultPosition() {
1036         this.locationByPlatform = ((Window)target).isLocationByPlatform();
1037         if (locationByPlatform) {
1038             XToolkit.awtLock();
1039             try {


1786         } else {
1787             focusLog.fine("Parent window is not active");
1788         }
1789         ComponentPeer peer = ComponentAccessor.getPeer(owner);
1790         if (peer instanceof XDecoratedPeer) {
1791             XDecoratedPeer wpeer = (XDecoratedPeer) peer;
1792             if (wpeer.requestWindowFocus(this, time, timeProvided)) {
1793                 focusLog.fine("Parent window accepted focus request - generating focus for this window");
1794                 return true;
1795             }
1796         }
1797         focusLog.fine("Denied - parent window is not active and didn't accept focus request");
1798         return false;
1799     }
1800 
1801     // This method is to be overriden in XDecoratedPeer.
1802     void setActualFocusedWindow(XWindowPeer actualFocusedWindow) {
1803     }
1804 
1805     public void xSetVisible(boolean visible) {
1806         if (log.isLoggable(Level.FINE)) {
1807             log.fine("Setting visible on " + this + " to " + visible);
1808         }
1809         XToolkit.awtLock();
1810         try {
1811             this.visible = visible;
1812             if (visible) {
1813                 XlibWrapper.XMapRaised(XToolkit.getDisplay(), getWindow());
1814             } else {
1815                 XlibWrapper.XUnmapWindow(XToolkit.getDisplay(), getWindow());
1816             }
1817             XlibWrapper.XFlush(XToolkit.getDisplay());
1818         }
1819         finally {
1820             XToolkit.awtUnlock();
1821         }
1822     }
1823 
1824     private int dropTargetCount = 0;
1825 
1826     public synchronized void addDropTarget() {
1827         if (dropTargetCount == 0) {
1828             long window = getWindow();


1972             // that XBaseWindow.dispatchEvent does the opposite
1973             // translation)
1974             // Note that we need to retarget XCrossingEvents to content window
1975             // since it generates MOUSE_ENTERED/MOUSE_EXITED for frame and dialog.
1976             // (fix for 6390326)
1977             XBaseWindow target = XToolkit.windowToXWindow(xce.get_window());
1978             if (grabLog.isLoggable(Level.FINER)) {
1979                 grabLog.log(Level.FINER, "  -  Grab event target {0}",
1980                             new Object[] {String.valueOf(target)});
1981             }
1982             if (target != null && target != this) {
1983                 target.dispatchEvent(xev);
1984                 return;
1985             }
1986         }
1987         super.handleXCrossingEvent(xev);
1988     }
1989 
1990     public void handleMotionNotify(XEvent xev) {
1991         XMotionEvent xme = xev.get_xmotion();
1992         if (grabLog.isLoggable(Level.FINER)) {
1993             grabLog.log(Level.FINER, "{0}, when grabbed {1}, contains {2}",
1994                         new Object[] {String.valueOf(xme), isGrabbed(),
1995                                       containsGlobal(xme.get_x_root(), xme.get_y_root())});
1996         }
1997         if (isGrabbed()) {
1998             boolean dragging = (xme.get_state() & (Button1Mask | Button2Mask | Button3Mask)) != 0;
1999             // When window is grabbed, all events are dispatched to
2000             // it.  Retarget them to the corresponding windows (notice
2001             // that XBaseWindow.dispatchEvent does the opposite
2002             // translation)
2003             XBaseWindow target = XToolkit.windowToXWindow(xme.get_window());
2004             if (dragging && pressTarget != target) {
2005                 // for some reasons if we grab input MotionNotify for drag is reported with target
2006                 // to underlying window, not to window on which we have initiated drag
2007                 // so we need to retarget them.  Here I use simplified logic which retarget all
2008                 // such events to source of mouse press (or the grabber).  It helps with fix for 6390326.
2009                 // So, I do not want to implement complicated logic for better retargeting.
2010                 target = pressTarget.isVisible() ? pressTarget : this;
2011                 xme.set_window(target.getWindow());
2012                 xme.set_x(xme.get_x_root() - target.getX());


2154         }
2155         if (iOpacity > maxOpacity) {
2156             iOpacity = maxOpacity;
2157         }
2158 
2159         XAtom netWmWindowOpacityAtom = XAtom.get("_NET_WM_WINDOW_OPACITY");
2160 
2161         if (iOpacity == maxOpacity) {
2162             netWmWindowOpacityAtom.DeleteProperty(getWindow());
2163         } else {
2164             netWmWindowOpacityAtom.setCard32Property(getWindow(), iOpacity);
2165         }
2166     }
2167 
2168     @Override
2169     public void setOpaque(boolean isOpaque) {
2170         // no-op
2171     }
2172 
2173     @Override
2174     public void updateWindow() {
2175         // no-op
2176     }
2177 }
< prev index next >