--- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDecoratedPeer.java Thu Dec 22 11:02:49 2016 -0800
+++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XDecoratedPeer.java Wed Dec 28 12:43:57 2016 +0300
@@ -51,9 +51,9 @@
boolean insets_corrected;
XIconWindow iconWindow;
- WindowDimensions dimensions;
+ volatile WindowDimensions dimensions;
XContentWindow content;
- Insets currentInsets;
+ volatile Insets currentInsets;
XFocusProxyWindow focusProxy;
static final Map<Class<?>,Insets> lastKnownInsets =
Collections.synchronizedMap(new HashMap<>());
@@ -106,7 +106,7 @@
// The lines that follow need to be in a postInit, so they
// happen after the X window is created.
- initResizability();
+ setResizable(winAttr.initialResizability);
XWM.requestWMExtents(getWindow());
content = XContentWindow.createContent(this);
@@ -130,7 +130,12 @@
public void updateMinimumSize() {
super.updateMinimumSize();
- updateMinSizeHints();
+ XToolkit.awtLock();
+ try {
+ updateMinSizeHints();
+ } finally {
+ XToolkit.awtUnlock();
+ }
}
private void updateMinSizeHints() {
@@ -193,8 +198,13 @@
if (log.isLoggable(PlatformLogger.Level.FINE)) {
log.fine("Title is " + title);
}
- winAttr.title = title;
- updateWMName();
+ XToolkit.awtLock();
+ try {
+ winAttr.title = title;
+ updateWMName();
+ } finally {
+ XToolkit.awtUnlock();
+ }
}
protected String getWMName() {
@@ -206,10 +216,10 @@
}
void updateWMName() {
- super.updateWMName();
- String name = getWMName();
XToolkit.awtLock();
try {
+ super.updateWMName();
+ String name = getWMName();
if (name == null || name.trim().equals("")) {
name = "Java";
}
@@ -304,6 +314,8 @@
if (XWM.getWMID() != XWM.UNITY_COMPIZ_WM) {
currentInsets = new Insets(0, 0, 0, 0);
wm_set_insets = null;
+ } else {
+ insets_corrected = false;
}
}
@@ -330,7 +342,7 @@
if (XWM.getWMID() != XWM.UNITY_COMPIZ_WM) {
getWMSetInsets(XAtom.get(ev.get_atom()));
} else {
- if(!isReparented()) {
+ if (!isReparented()) {
return;
}
wm_set_insets = null;
@@ -377,137 +389,127 @@
insLog.fine(xe.toString());
}
reparent_serial = xe.get_serial();
- XToolkit.awtLock();
- try {
- long root = XlibWrapper.RootWindow(XToolkit.getDisplay(), getScreenNumber());
+ long root = XlibWrapper.RootWindow(XToolkit.getDisplay(), getScreenNumber());
+
+ if (isEmbedded()) {
+ setReparented(true);
+ insets_corrected = true;
+ return;
+ }
+ if (getDecorations() == XWindowAttributesData.AWT_DECOR_NONE) {
+ setReparented(true);
+ insets_corrected = true;
+ reshape(dimensions, SET_SIZE, false);
+ } else if (xe.get_parent() == root) {
+ configure_seen = false;
+ insets_corrected = false;
- if (isEmbedded()) {
- setReparented(true);
- insets_corrected = true;
+ /*
+ * We can be repareted to root for two reasons:
+ * . setVisible(false)
+ * . WM exited
+ */
+ if (isVisible()) { /* WM exited */
+ /* Work around 4775545 */
+ XWM.getWM().unshadeKludge(this);
+ insLog.fine("- WM exited");
+ } else {
+ insLog.fine(" - reparent due to hide");
+ }
+ } else { /* reparented to WM frame, figure out our insets */
+ setReparented(true);
+ insets_corrected = false;
+ if (XWM.getWMID() == XWM.UNITY_COMPIZ_WM) {
return;
}
- Component t = target;
- if (getDecorations() == XWindowAttributesData.AWT_DECOR_NONE) {
- setReparented(true);
- insets_corrected = true;
- reshape(dimensions, SET_SIZE, false);
- } else if (xe.get_parent() == root) {
- configure_seen = false;
- insets_corrected = false;
- /*
- * We can be repareted to root for two reasons:
- * . setVisible(false)
- * . WM exited
- */
- if (isVisible()) { /* WM exited */
- /* Work around 4775545 */
- XWM.getWM().unshadeKludge(this);
- insLog.fine("- WM exited");
- } else {
- insLog.fine(" - reparent due to hide");
+ // Check if we have insets provided by the WM
+ Insets correctWM = getWMSetInsets(null);
+ if (correctWM != null) {
+ if (insLog.isLoggable(PlatformLogger.Level.FINER)) {
+ insLog.finer("wm-provided insets {0}", correctWM);
}
- } else { /* reparented to WM frame, figure out our insets */
- setReparented(true);
- insets_corrected = false;
- if (XWM.getWMID() == XWM.UNITY_COMPIZ_WM) {
+ // If these insets are equal to our current insets - no actions are necessary
+ Insets dimInsets = dimensions.getInsets();
+ if (correctWM.equals(dimInsets)) {
+ insLog.finer("Insets are the same as estimated - no additional reshapes necessary");
+ no_reparent_artifacts = true;
+ insets_corrected = true;
+ applyGuessedInsets();
return;
}
+ } else {
+ correctWM = XWM.getWM().getInsets(this, xe.get_window(), xe.get_parent());
+ if (correctWM != null) {
+ correctWM = copyAndScaleDown(correctWM);
+ }
- // Check if we have insets provided by the WM
- Insets correctWM = getWMSetInsets(null);
- if (correctWM != null) {
- if (insLog.isLoggable(PlatformLogger.Level.FINER)) {
- insLog.finer("wm-provided insets {0}", correctWM);
- }
- // If these insets are equal to our current insets - no actions are necessary
- Insets dimInsets = dimensions.getInsets();
- if (correctWM.equals(dimInsets)) {
- insLog.finer("Insets are the same as estimated - no additional reshapes necessary");
- no_reparent_artifacts = true;
- insets_corrected = true;
- applyGuessedInsets();
- return;
- }
- } else {
- correctWM = XWM.getWM().getInsets(this, xe.get_window(), xe.get_parent());
+ if (insLog.isLoggable(PlatformLogger.Level.FINER)) {
if (correctWM != null) {
- correctWM = copyAndScaleDown(correctWM);
- }
-
- if (insLog.isLoggable(PlatformLogger.Level.FINER)) {
- if (correctWM != null) {
- insLog.finer("correctWM {0}", correctWM);
- } else {
- insLog.finer("correctWM insets are not available, waiting for configureNotify");
- }
+ insLog.finer("correctWM {0}", correctWM);
+ } else {
+ insLog.finer("correctWM insets are not available, waiting for configureNotify");
}
}
+ }
- if (correctWM != null) {
- handleCorrectInsets(correctWM);
- }
+ if (correctWM != null) {
+ handleCorrectInsets(correctWM);
}
- } finally {
- XToolkit.awtUnlock();
}
}
- protected void handleCorrectInsets(Insets correctWM) {
- XToolkit.awtLock();
- try {
- /*
- * Ok, now see if we need adjust window size because
- * initial insets were wrong (most likely they were).
- */
- Insets correction = difference(correctWM, currentInsets);
- if (insLog.isLoggable(PlatformLogger.Level.FINEST)) {
- insLog.finest("Corrention {0}", correction);
- }
- if (!isNull(correction)) {
- currentInsets = copy(correctWM);
- applyGuessedInsets();
+ private void handleCorrectInsets(Insets correctWM) {
+ /*
+ * Ok, now see if we need adjust window size because
+ * initial insets were wrong (most likely they were).
+ */
+ Insets correction = difference(correctWM, currentInsets);
+ if (insLog.isLoggable(PlatformLogger.Level.FINEST)) {
+ insLog.finest("Corrention {0}", correction);
+ }
+ if (!isNull(correction)) {
+ currentInsets = copy(correctWM);
+ applyGuessedInsets();
- //Fix for 6318109: PIT: Min Size is not honored properly when a
- //smaller size is specified in setSize(), XToolkit
- //update minimum size hints
- updateMinSizeHints();
- }
- if (insLog.isLoggable(PlatformLogger.Level.FINER)) {
- insLog.finer("Dimensions before reparent: " + dimensions);
- }
-
- dimensions.setInsets(getRealInsets());
- insets_corrected = true;
+ //Fix for 6318109: PIT: Min Size is not honored properly when a
+ //smaller size is specified in setSize(), XToolkit
+ //update minimum size hints
+ updateMinSizeHints();
+ }
+ if (insLog.isLoggable(PlatformLogger.Level.FINER)) {
+ insLog.finer("Dimensions before reparent: " + dimensions);
+ }
+ WindowDimensions newDimensions = new WindowDimensions(dimensions);
+ newDimensions.setInsets(getRealInsets());
+ dimensions = newDimensions;
+ insets_corrected = true;
- if (isMaximized()) {
- return;
- }
+ if (isMaximized()) {
+ return;
+ }
- /*
- * If this window has been sized by a pack() we need
- * to keep the interior geometry intact. Since pack()
- * computed width and height with wrong insets, we
- * must adjust the target dimensions appropriately.
- */
- if ((getHints().get_flags() & (XUtilConstants.USPosition | XUtilConstants.PPosition)) != 0) {
- reshape(dimensions, SET_BOUNDS, false);
- } else {
- reshape(dimensions, SET_SIZE, false);
- }
- } finally {
- XToolkit.awtUnlock();
+ /*
+ * If this window has been sized by a pack() we need
+ * to keep the interior geometry intact. Since pack()
+ * computed width and height with wrong insets, we
+ * must adjust the target dimensions appropriately.
+ */
+ if ((getHints().get_flags() & (XUtilConstants.USPosition | XUtilConstants.PPosition)) != 0) {
+ reshape(dimensions, SET_BOUNDS, false);
+ } else {
+ reshape(dimensions, SET_SIZE, false);
}
}
- public void handleMoved(WindowDimensions dims) {
+ void handleMoved(WindowDimensions dims) {
Point loc = dims.getLocation();
AWTAccessor.getComponentAccessor().setLocation(target, loc.x, loc.y);
postEvent(new ComponentEvent(target, ComponentEvent.COMPONENT_MOVED));
}
- protected Insets guessInsets() {
+ private Insets guessInsets() {
if (isEmbedded() || isTargetUndecorated()) {
return new Insets(0, 0, 0, 0);
} else {
@@ -532,16 +534,7 @@
currentInsets = copy(guessed);
}
- public void revalidate() {
- XToolkit.executeOnEventHandlerThread(target, new Runnable() {
- public void run() {
- target.invalidate();
- target.validate();
- }
- });
- }
-
- Insets getRealInsets() {
+ private Insets getRealInsets() {
if (isNull(currentInsets)) {
applyGuessedInsets();
}
@@ -578,7 +571,7 @@
// Coordinates are that of the target
// Called only on Toolkit thread
- public void reshape(WindowDimensions newDimensions, int op,
+ private void reshape(WindowDimensions newDimensions, int op,
boolean userReshape)
{
if (insLog.isLoggable(PlatformLogger.Level.FINE)) {
@@ -599,81 +592,75 @@
}
newDimensions = new WindowDimensions(newBounds, insets, newDimensions.isClientSizeSet());
}
- XToolkit.awtLock();
- try {
- if (!isReparented() || !isVisible()) {
- if (insLog.isLoggable(PlatformLogger.Level.FINE)) {
- insLog.fine("- not reparented({0}) or not visible({1}), default reshape",
- Boolean.valueOf(isReparented()), Boolean.valueOf(visible));
- }
-
- // Fix for 6323293.
- // This actually is needed to preserve compatibility with previous releases -
- // some of licensees are expecting componentMoved event on invisible one while
- // its location changes.
- Point oldLocation = getLocation();
+ if (!isReparented() || !isVisible()) {
+ if (insLog.isLoggable(PlatformLogger.Level.FINE)) {
+ insLog.fine("- not reparented({0}) or not visible({1}), default reshape",
+ Boolean.valueOf(isReparented()), Boolean.valueOf(visible));
+ }
- Point newLocation = new Point(AWTAccessor.getComponentAccessor().getX(target),
- AWTAccessor.getComponentAccessor().getY(target));
-
- if (!newLocation.equals(oldLocation)) {
- handleMoved(newDimensions);
- }
+ // Fix for 6323293.
+ // This actually is needed to preserve compatibility with previous releases -
+ // some of licensees are expecting componentMoved event on invisible one while
+ // its location changes.
+ Point oldLocation = getLocation();
- dimensions = new WindowDimensions(newDimensions);
- updateSizeHints(dimensions);
- Rectangle client = dimensions.getClientRect();
- checkShellRect(client);
- setShellBounds(client);
- if (content != null &&
- !content.getSize().equals(newDimensions.getSize()))
- {
- reconfigureContentWindow(newDimensions);
- }
- return;
+ Point newLocation = new Point(AWTAccessor.getComponentAccessor().getX(target),
+ AWTAccessor.getComponentAccessor().getY(target));
+
+ if (!newLocation.equals(oldLocation)) {
+ handleMoved(newDimensions);
}
- int wm = XWM.getWMID();
- updateChildrenSizes();
- applyGuessedInsets();
-
- Rectangle shellRect = newDimensions.getClientRect();
-
- if (gravityBug()) {
- Insets in = newDimensions.getInsets();
- shellRect.translate(in.left, in.top);
+ dimensions = new WindowDimensions(newDimensions);
+ updateSizeHints(dimensions);
+ Rectangle client = dimensions.getClientRect();
+ checkShellRect(client);
+ setShellBounds(client);
+ if (content != null &&
+ !content.getSize().equals(newDimensions.getSize()))
+ {
+ reconfigureContentWindow(newDimensions);
}
+ return;
+ }
- if ((op & NO_EMBEDDED_CHECK) == 0 && isEmbedded()) {
- shellRect.setLocation(0, 0);
- }
+ updateChildrenSizes();
+ applyGuessedInsets();
- checkShellRectSize(shellRect);
- if (!isEmbedded()) {
- checkShellRectPos(shellRect);
- }
+ Rectangle shellRect = newDimensions.getClientRect();
+
+ if (gravityBug()) {
+ Insets in = newDimensions.getInsets();
+ shellRect.translate(in.left, in.top);
+ }
- op = op & ~NO_EMBEDDED_CHECK;
+ if ((op & NO_EMBEDDED_CHECK) == 0 && isEmbedded()) {
+ shellRect.setLocation(0, 0);
+ }
- if (op == SET_LOCATION) {
- setShellPosition(shellRect);
- } else if (isResizable()) {
- if (op == SET_BOUNDS) {
- setShellBounds(shellRect);
- } else {
- setShellSize(shellRect);
- }
+ checkShellRectSize(shellRect);
+ if (!isEmbedded()) {
+ checkShellRectPos(shellRect);
+ }
+
+ op = op & ~NO_EMBEDDED_CHECK;
+
+ if (op == SET_LOCATION) {
+ setShellPosition(shellRect);
+ } else if (isResizable()) {
+ if (op == SET_BOUNDS) {
+ setShellBounds(shellRect);
} else {
- XWM.setShellNotResizable(this, newDimensions, shellRect, true);
- if (op == SET_BOUNDS) {
- setShellPosition(shellRect);
- }
+ setShellSize(shellRect);
}
+ } else {
+ XWM.setShellNotResizable(this, newDimensions, shellRect, true);
+ if (op == SET_BOUNDS) {
+ setShellPosition(shellRect);
+ }
+ }
- reconfigureContentWindow(newDimensions);
- } finally {
- XToolkit.awtUnlock();
- }
+ reconfigureContentWindow(newDimensions);
}
/**
@@ -682,8 +669,6 @@
private void reshape(int x, int y, int width, int height, int operation,
boolean userReshape)
{
- Rectangle newRec;
- boolean setClient = false;
WindowDimensions dims = new WindowDimensions(dimensions);
switch (operation & (~NO_EMBEDDED_CHECK)) {
case SET_LOCATION:
@@ -726,7 +711,12 @@
*/
public void setBounds(int x, int y, int width, int height, int op) {
// TODO: Rewrite with WindowDimensions
- reshape(x, y, width, height, op, true);
+ XToolkit.awtLock();
+ try {
+ reshape(x, y, width, height, op, true);
+ } finally {
+ XToolkit.awtUnlock();
+ }
validateSurface();
}
@@ -861,81 +851,74 @@
checkShellRectPos(shellRect);
}
- public void setShellBounds(Rectangle rec) {
+ private void setShellBounds(Rectangle rec) {
if (insLog.isLoggable(PlatformLogger.Level.FINE)) {
insLog.fine("Setting shell bounds on " + this + " to " + rec);
}
- XToolkit.awtLock();
- try {
- updateSizeHints(rec.x, rec.y, rec.width, rec.height);
- XlibWrapper.XMoveResizeWindow(XToolkit.getDisplay(), getShell(),
- scaleUp(rec.x), scaleUp(rec.y),
- scaleUp(rec.width), scaleUp(rec.height));
- }
- finally {
- XToolkit.awtUnlock();
- }
+ updateSizeHints(rec.x, rec.y, rec.width, rec.height);
+ XlibWrapper.XMoveResizeWindow(XToolkit.getDisplay(), getShell(),
+ scaleUp(rec.x), scaleUp(rec.y),
+ scaleUp(rec.width), scaleUp(rec.height));
}
- public void setShellSize(Rectangle rec) {
+
+ private void setShellSize(Rectangle rec) {
if (insLog.isLoggable(PlatformLogger.Level.FINE)) {
insLog.fine("Setting shell size on " + this + " to " + rec);
}
- XToolkit.awtLock();
- try {
- updateSizeHints(rec.x, rec.y, rec.width, rec.height);
- XlibWrapper.XResizeWindow(XToolkit.getDisplay(), getShell(),
- scaleUp(rec.width), scaleUp(rec.height));
- }
- finally {
- XToolkit.awtUnlock();
- }
+ updateSizeHints(rec.x, rec.y, rec.width, rec.height);
+ XlibWrapper.XResizeWindow(XToolkit.getDisplay(), getShell(),
+ scaleUp(rec.width), scaleUp(rec.height));
}
- public void setShellPosition(Rectangle rec) {
+
+ private void setShellPosition(Rectangle rec) {
if (insLog.isLoggable(PlatformLogger.Level.FINE)) {
insLog.fine("Setting shell position on " + this + " to " + rec);
}
- XToolkit.awtLock();
- try {
- updateSizeHints(rec.x, rec.y, rec.width, rec.height);
- XlibWrapper.XMoveWindow(XToolkit.getDisplay(), getShell(),
- scaleUp(rec.x), scaleUp(rec.y));
- }
- finally {
- XToolkit.awtUnlock();
- }
+ updateSizeHints(rec.x, rec.y, rec.width, rec.height);
+ XlibWrapper.XMoveWindow(XToolkit.getDisplay(), getShell(),
+ scaleUp(rec.x), scaleUp(rec.y));
}
- void initResizability() {
- setResizable(winAttr.initialResizability);
- }
public void setResizable(boolean resizable) {
- int fs = winAttr.functions;
- if (!isResizable() && resizable) {
- resetWMSetInsets();
- if (!isEmbedded()) {
- setReparented(false);
- }
- winAttr.isResizable = resizable;
- if ((fs & MWMConstants.MWM_FUNC_ALL) != 0) {
- fs &= ~(MWMConstants.MWM_FUNC_RESIZE | MWMConstants.MWM_FUNC_MAXIMIZE);
- } else {
- fs |= (MWMConstants.MWM_FUNC_RESIZE | MWMConstants.MWM_FUNC_MAXIMIZE);
+ XToolkit.awtLock();
+ try {
+ int fs = winAttr.functions;
+ if (!isResizable() && resizable) {
+ resetWMSetInsets();
+ if (!isEmbedded()) {
+ setReparented(false);
+ }
+ winAttr.isResizable = resizable;
+ if ((fs & MWMConstants.MWM_FUNC_ALL) != 0) {
+ fs &= ~(MWMConstants.MWM_FUNC_RESIZE
+ | MWMConstants.MWM_FUNC_MAXIMIZE);
+ } else {
+ fs |= (MWMConstants.MWM_FUNC_RESIZE
+ | MWMConstants.MWM_FUNC_MAXIMIZE);
+ }
+ winAttr.functions = fs;
+ XWM.setShellResizable(this);
+ } else if (isResizable() && !resizable) {
+ resetWMSetInsets();
+ if (!isEmbedded()) {
+ setReparented(false);
+ }
+ winAttr.isResizable = resizable;
+ if ((fs & MWMConstants.MWM_FUNC_ALL) != 0) {
+ fs |= (MWMConstants.MWM_FUNC_RESIZE
+ | MWMConstants.MWM_FUNC_MAXIMIZE);
+ } else {
+ fs &= ~(MWMConstants.MWM_FUNC_RESIZE
+ | MWMConstants.MWM_FUNC_MAXIMIZE);
+ }
+ winAttr.functions = fs;
+ XWM.setShellNotResizable(this, dimensions,
+ XWM.getWMID() == XWM.UNITY_COMPIZ_WM && configure_seen ?
+ dimensions.getScreenBounds() :
+ dimensions.getBounds(), false);
}
- winAttr.functions = fs;
- XWM.setShellResizable(this);
- } else if (isResizable() && !resizable) {
- resetWMSetInsets();
- if (!isEmbedded()) {
- setReparented(false);
- }
- winAttr.isResizable = resizable;
- if ((fs & MWMConstants.MWM_FUNC_ALL) != 0) {
- fs |= (MWMConstants.MWM_FUNC_RESIZE | MWMConstants.MWM_FUNC_MAXIMIZE);
- } else {
- fs &= ~(MWMConstants.MWM_FUNC_RESIZE | MWMConstants.MWM_FUNC_MAXIMIZE);
- }
- winAttr.functions = fs;
- XWM.setShellNotResizable(this, dimensions, dimensions.getBounds(), false);
+ } finally {
+ XToolkit.awtUnlock();
}
}
@@ -990,17 +973,16 @@
try {
if (configure_seen) {
return toGlobal(0,0);
- } else {
- Point location = target.getLocation();
- if (insLog.isLoggable(PlatformLogger.Level.FINE)) {
- insLog.fine("getLocationOnScreen {0} not reparented: {1} ",
- this, location);
- }
- return location;
}
} finally {
XToolkit.awtUnlock();
}
+ Point location = target.getLocation();
+ if (insLog.isLoggable(PlatformLogger.Level.FINE)) {
+ insLog.fine("getLocationOnScreen {0} not reparented: {1} ",
+ this, location);
+ }
+ return location;
}
@@ -1134,7 +1116,7 @@
return focusProxy;
}
- public void handleQuit() {
+ private void handleQuit() {
postEvent(new WindowEvent((Window)target, WindowEvent.WINDOW_CLOSING));
}