< prev index next >
src/java.desktop/unix/classes/sun/awt/X11/XDecoratedPeer.java
Print this page
*** 306,315 ****
--- 306,328 ----
public void handlePropertyNotify(XEvent xev) {
super.handlePropertyNotify(xev);
XPropertyEvent ev = xev.get_xproperty();
+ if( !insets_corrected && isReparented() &&
+ XWM.getWMID() == XWM.UNITY_COMPIZ_WM) {
+ int state = XWM.getWM().getState(this);
+ if ((state & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) {
+ // Stop ignoring ConfigureNotify because no extents will be sent
+ // by WM for initially maximized decorated window.
+ // Re-request window bounds to ensure actual dimensions and
+ // notify the target with the initial size.
+ insets_corrected = true;
+ XlibWrapper.XConfigureWindow(XToolkit.getDisplay(),
+ getWindow(), 0, 0);
+ }
+ }
if (ev.get_atom() == XWM.XA_KDE_NET_WM_FRAME_STRUT.getAtom()
|| ev.get_atom() == XWM.XA_NET_FRAME_EXTENTS.getAtom())
{
if (XWM.getWMID() != XWM.UNITY_COMPIZ_WM) {
getWMSetInsets(XAtom.get(ev.get_atom()));
*** 323,337 ****
return;
}
if (!isEmbedded() && !isTargetUndecorated()) {
lastKnownInsets.put(getClass(), in);
}
! if (!in.equals(dimensions.getInsets()) ||
! !dimensions.isClientSizeSet()) {
handleCorrectInsets(in);
}
insets_corrected = true;
}
}
}
long reparent_serial = 0;
--- 336,369 ----
return;
}
if (!isEmbedded() && !isTargetUndecorated()) {
lastKnownInsets.put(getClass(), in);
}
! if (!in.equals(dimensions.getInsets())) {
! if (insets_corrected || isMaximized()) {
! currentInsets = in;
! insets_corrected = true;
! // insets were changed by WM. To handle this situation
! // re-request window bounds because the current
! // dimensions may be not actual as well.
! XlibWrapper.XConfigureWindow(XToolkit.getDisplay(),
! getWindow(), 0, 0);
! } else {
! // recalculate dimensions when window is just created
! // and the initially guessed insets were wrong
handleCorrectInsets(in);
}
+ } else if (!dimensions.isClientSizeSet()) {
insets_corrected = true;
+ // initial insets were guessed correctly. Re-request
+ // frame bounds because they may be changed by WM if the
+ // initial window position overlapped desktop's toolbars.
+ // This should initiate the final ConfigureNotify upon which
+ // the target will be notified with the final size.
+ XlibWrapper.XConfigureWindow(XToolkit.getDisplay(),
+ getWindow(), 0, 0);
+ }
}
}
}
long reparent_serial = 0;
< prev index next >