--- old/src/solaris/classes/sun/awt/X11/XWindow.java 2009-08-11 19:21:26.000000000 +0400 +++ new/src/solaris/classes/sun/awt/X11/XWindow.java 2009-08-11 19:21:25.000000000 +0400 @@ -281,12 +281,84 @@ return new String[] {XToolkit.getCorrectXIDString(getClass().getName()), XToolkit.getAWTAppClassName()}; } - void setReparented(boolean newValue) { - reparented = newValue; + /** + * Current native parent of this window. + * + * Synchronization: state lock. + */ + private long nativeParent = XConstants.None; + + /** + * Get the current native parent window of this window as reported via + * the ReparentNotify. + */ + public final long getNativeParent() { + synchronized (getStateLock()) { + return nativeParent; + } + } + + /** + * Sets the current native parent of the window. + * Primarily intended to be called from the handleReparentNotifyEvent(). + */ + public void setNativeParent(long parent) { + synchronized (getStateLock()) { + nativeParent = parent; + } + } + + @Override + public void handleReparentNotifyEvent(XEvent xev) { + super.handleReparentNotifyEvent(xev); + + XReparentEvent xe = xev.get_xreparent(); + + if (xe.get_window() != getWindow()) { + return; + } + + setNativeParent(xe.get_parent()); + } + + /** + * Returns the root window of the current window. + */ + public final long getRootWindow() { + if (getWindow() == XConstants.None) { + return XConstants.None; + } + XToolkit.awtLock(); + try { + XlibUtil.getWindowGeometry(getWindow(), XlibWrapper.larg1); + return Native.getWindow(XlibWrapper.larg1); + } finally { + XToolkit.awtUnlock(); + } } - boolean isReparented() { - return reparented; + /** + * Indicates whether the window is currently parented or not. + */ + public final boolean isParented() { + long nativeParent = getNativeParent(); + return nativeParent != XConstants.None && + nativeParent != getRootWindow(); + } + + /** + * Indicates if this window has not yet been parented by the window + * manager. + * + * If the window is not expected to be parented at all (like if the WM is + * non-reparenting, or this is an OverrideRedirect window), this method + * returns false. + */ + public boolean mayBeReparented() { + return + XWM.isRunning() && + !XWM.isNonReparentingWM() && + !isParented(); } static long getParentWindowID(Component target) { @@ -994,17 +1066,21 @@ public void doLayout(int x, int y, int width, int height) {} public void handleConfigureNotifyEvent(XEvent xev) { - Rectangle oldBounds = getBounds(); + XConfigureEvent xe = xev.get_xconfigure(); + if (xe.get_window() != getWindow()) { + return; + } + + Rectangle oldBounds = getBounds(); super.handleConfigureNotifyEvent(xev); insLog.log(Level.FINER, "Configure, {0}, event disabled: {1}", - new Object[] {xev.get_xconfigure(), isEventDisabled(xev)}); + new Object[] {xe, isEventDisabled(xev)}); if (isEventDisabled(xev)) { return; } -// if ( Check if it's a resize, a move, or a stacking order change ) -// { + Rectangle bounds = getBounds(); if (!bounds.getSize().equals(oldBounds.getSize())) { postEventToEventQueue(new ComponentEvent(getEventSource(), ComponentEvent.COMPONENT_RESIZED)); @@ -1012,7 +1088,6 @@ if (!bounds.getLocation().equals(oldBounds.getLocation())) { postEventToEventQueue(new ComponentEvent(getEventSource(), ComponentEvent.COMPONENT_MOVED)); } -// } } public void handleMapNotifyEvent(XEvent xev) { @@ -1021,6 +1096,11 @@ if (isEventDisabled(xev)) { return; } + + if (xev.get_xany().get_window() != getWindow()) { + return; + } + ComponentEvent ce; ce = new ComponentEvent(getEventSource(), ComponentEvent.COMPONENT_SHOWN); @@ -1032,6 +1112,10 @@ if (isEventDisabled(xev)) { return; } + if (xev.get_xany().get_window() != getWindow()) { + return; + } + ComponentEvent ce; ce = new ComponentEvent(target, ComponentEvent.COMPONENT_HIDDEN); @@ -1402,7 +1486,7 @@ Object wpeer = XToolkit.targetToPeer(comp); if (wpeer == null || !(wpeer instanceof XDecoratedPeer) - || ((XDecoratedPeer)wpeer).configure_seen) + || !((XDecoratedPeer)wpeer).areBoundsAdjusting()) { return toGlobal(0, 0); }