Regression fix for Java window size
6262bac introduced a regression that resulted in a 1 pixel border
around the window on some platforms. The underlying issue was
actually caused by overriding the getPreferredSize() method in
DesktopWindow and returning the scaled width & height, which
might not have been set to valid values.
diff --git a/java/com/tigervnc/vncviewer/CConn.java b/java/com/tigervnc/vncviewer/CConn.java
index f592cb5..9128b21 100644
--- a/java/com/tigervnc/vncviewer/CConn.java
+++ b/java/com/tigervnc/vncviewer/CConn.java
@@ -266,7 +266,6 @@
pendingPFChange = false;
if (viewer.embed.getValue()) {
- desktop.setScaledSize();
setupEmbeddedFrame();
} else {
recreateViewport();
@@ -301,7 +300,7 @@
}
sp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
- sp.getViewport().setView(desktop);
+ desktop.setViewport(sp.getViewport());
viewer.getContentPane().removeAll();
viewer.add(sp);
viewer.addFocusListener(new FocusAdapter() {
@@ -537,7 +536,6 @@
desktop.resize();
if (viewer.embed.getValue()) {
- desktop.setScaledSize();
setupEmbeddedFrame();
} else {
recreateViewport();
@@ -565,7 +563,7 @@
if (viewport != null) viewport.dispose();
viewport = new Viewport(cp.name(), this);
viewport.setUndecorated(fullScreen);
- desktop.setViewport(viewport);
+ desktop.setViewport(viewport.getViewport());
reconfigureViewport();
if ((cp.width > 0) && (cp.height > 0))
viewport.setVisible(true);
@@ -573,9 +571,7 @@
}
private void reconfigureViewport() {
- boolean pack = true;
Dimension dpySize = viewport.getScreenSize();
- desktop.setScaledSize();
int w = desktop.scaledWidth;
int h = desktop.scaledHeight;
if (fullScreen) {
@@ -587,26 +583,21 @@
} else {
int wmDecorationWidth = viewport.getInsets().left + viewport.getInsets().right;
int wmDecorationHeight = viewport.getInsets().top + viewport.getInsets().bottom;
- if (w + wmDecorationWidth >= dpySize.width) {
+ if (w + wmDecorationWidth >= dpySize.width)
w = dpySize.width - wmDecorationWidth;
- pack = false;
- }
- if (h + wmDecorationHeight >= dpySize.height) {
+ if (h + wmDecorationHeight >= dpySize.height)
h = dpySize.height - wmDecorationHeight;
- pack = false;
- }
-
if (viewport.getExtendedState() == JFrame.MAXIMIZED_BOTH) {
w = viewport.getSize().width;
h = viewport.getSize().height;
int x = viewport.getLocation().x;
int y = viewport.getLocation().y;
- viewport.setGeometry(x, y, w, h, pack);
+ viewport.setGeometry(x, y, w, h);
} else {
int x = (dpySize.width - w - wmDecorationWidth) / 2;
int y = (dpySize.height - h - wmDecorationHeight)/2;
viewport.setExtendedState(JFrame.NORMAL);
- viewport.setGeometry(x, y, w, h, pack);
+ viewport.setGeometry(x, y, w, h);
}
Viewport.setFullScreenWindow(null);
}
@@ -1005,8 +996,6 @@
}
int scaleFactor =
Integer.parseInt(scaleString.substring(0, scaleString.length()));
- if (desktop != null)
- desktop.setScaledSize();
}
if (viewer.desktopSize.getValue() != null &&
viewer.desktopSize.getValue().split("x").length == 2) {
diff --git a/java/com/tigervnc/vncviewer/DesktopWindow.java b/java/com/tigervnc/vncviewer/DesktopWindow.java
index 10d158c..ff48fc1 100644
--- a/java/com/tigervnc/vncviewer/DesktopWindow.java
+++ b/java/com/tigervnc/vncviewer/DesktopWindow.java
@@ -53,6 +53,7 @@
CConn cc_) {
cc = cc_;
setSize(width, height);
+ setScaledSize();
setOpaque(false);
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
@@ -105,8 +106,14 @@
public final PixelFormat getPF() { return im.getPF(); }
- public void setViewport(Viewport viewport) {
- viewport.setChild(this);
+ public void setViewport(JViewport viewport) {
+ setScaledSize();
+ viewport.setView(this);
+ // pack() must be called on a JFrame before getInsets()
+ // will return anything other than 0.
+ if (viewport.getRootPane() != null)
+ if (getRootPane().getParent() instanceof JFrame)
+ ((JFrame)getRootPane().getParent()).pack();
}
// Methods called from the RFB thread - these need to be synchronized
@@ -244,6 +251,7 @@
int h = cc.cp.height;
hideLocalCursor();
setSize(w, h);
+ setScaledSize();
im.resize(w, h);
}
diff --git a/java/com/tigervnc/vncviewer/Viewport.java b/java/com/tigervnc/vncviewer/Viewport.java
index f509901..3d01b25 100644
--- a/java/com/tigervnc/vncviewer/Viewport.java
+++ b/java/com/tigervnc/vncviewer/Viewport.java
@@ -155,16 +155,12 @@
}
}
- public void setChild(DesktopWindow child) {
- sp.getViewport().setView(child);
+ public JViewport getViewport() {
+ return sp.getViewport();
}
- public void setGeometry(int x, int y, int w, int h, boolean pack) {
- if (pack) {
- pack();
- } else {
- setSize(w, h);
- }
+ public void setGeometry(int x, int y, int w, int h) {
+ pack();
if (!cc.fullScreen)
setLocation(x, y);
}
@@ -182,10 +178,6 @@
for (GraphicsDevice gd : ge.getScreenDevices())
for (GraphicsConfiguration gc : gd.getConfigurations())
r = r.union(gc.getBounds());
- Dimension d = getPreferredSize();
- if (!cc.fullScreen)
- if ((d.width > 0) && (d.height > 0))
- pack();
Rectangle mb = new Rectangle(r);
mb.grow(getInsets().left, getInsets().bottom);
setMaximizedBounds(mb);