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);