add support for SetDesktopSize

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@4426 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/java/src/com/tigervnc/vncviewer/CConn.java b/java/src/com/tigervnc/vncviewer/CConn.java
index 26dd2a5..a85c0bc 100644
--- a/java/src/com/tigervnc/vncviewer/CConn.java
+++ b/java/src/com/tigervnc/vncviewer/CConn.java
@@ -31,7 +31,8 @@
 

 package com.tigervnc.vncviewer;

 

-import java.awt.*;

+import java.awt.Color;
+import java.awt.Graphics;
 import java.awt.event.*;

 import java.awt.Component;

 import java.awt.Dimension;

@@ -88,6 +89,11 @@
     getContentPane().add(sp);

   }

 

+  public void setChild(DesktopWindow child) {

+    getContentPane().removeAll();
+    addChild(child);
+  }

+

   public void setGeometry(int x, int y, int w, int h) {

     pack();

     if (cc.fullScreen) setSize(w, h);

@@ -266,14 +272,14 @@
   public void setExtendedDesktopSize(int reason, int result, int w, int h,

                                      ScreenSet layout) {

     super.setExtendedDesktopSize(reason, result, w, h, layout);

-

+
     if ((reason == screenTypes.reasonClient) &&

         (result != screenTypes.resultSuccess)) {

       vlog.error("SetDesktopSize failed: "+result);

       return;

     }

-    

-    resizeFramebuffer();

+

+    resizeFramebuffer();
   }

 

   // setName() is called when the desktop name changes

@@ -306,12 +312,13 @@
     desktop.framebufferUpdateEnd();

 

     if (firstUpdate) {

-      //int width = (int)viewer.desktopSize.getValue().split("x")[0];

-      //int height = (int)viewer.desktopSize.getValue().split("x")[1];

+      int width, height;

       

-/*

       if (cp.supportsSetDesktopSize &&

-          ((width != 0) && (height != 0))) {

+          viewer.desktopSize.getValue() != null &&

+          viewer.desktopSize.getValue().split("x").length == 2) {

+        width = Integer.parseInt(viewer.desktopSize.getValue().split("x")[0]);

+        height = Integer.parseInt(viewer.desktopSize.getValue().split("x")[1]);

         ScreenSet layout;

 

         layout = cp.screenLayout;

@@ -322,23 +329,23 @@
 

           while (true) {

             Iterator iter = layout.screens.iterator(); 

-            iter.next();

+            Screen screen = (Screen)iter.next();

         

             if (!iter.hasNext())

               break;

 

-            layout.remove_screen(iter.id);

+            layout.remove_screen(screen.id);

           }

         }

 

-        layout.screens.iterator().dimensions.tl.x = 0;

-        layout.screens.iterator().dimensions.tl.y = 0;

-        layout.screens.iterator().dimensions.by.x = width;

-        layout.screens.iterator().dimensions.by.y = height;

+        Screen screen0 = (Screen)layout.screens.iterator().next();

+        screen0.dimensions.tl.x = 0;

+        screen0.dimensions.tl.y = 0;

+        screen0.dimensions.br.x = width;

+        screen0.dimensions.br.y = height;

 

         writer().writeSetDesktopSize(width, height, layout);

       }

-*/

 

       firstUpdate = false;

     }

@@ -415,6 +422,7 @@
     if (viewport != null) viewport.dispose();

     viewport = new ViewportFrame(cp.name(), this);

     viewport.setUndecorated(fullScreen);

+    desktop.setViewport(viewport);
     ClassLoader loader = this.getClass().getClassLoader();

     URL url = loader.getResource("com/tigervnc/vncviewer/tigervnc.ico");

     ImageIcon icon = null;

@@ -432,23 +440,24 @@
   private void reconfigureViewport()

   {

     //viewport->setMaxSize(cp.width, cp.height);

-    int w = cp.width;

-    int h = cp.height;

-    Dimension dpySize = viewport.getToolkit().getScreenSize();

-    int wmDecorationWidth = 0;

-    int wmDecorationHeight = 24;

-    if (w + wmDecorationWidth >= dpySize.width)

-      w = dpySize.width - wmDecorationWidth;

-    if (h + wmDecorationHeight >= dpySize.height)

-      h = dpySize.height - wmDecorationHeight;

-

-    int x = (dpySize.width - w - wmDecorationWidth) / 2;

-    int y = (dpySize.height - h - wmDecorationHeight)/2;

-

     if (fullScreen) {

+      Dimension dpySize = viewport.getToolkit().getScreenSize();

       viewport.setExtendedState(JFrame.MAXIMIZED_BOTH);

       viewport.setGeometry(0, 0, dpySize.width, dpySize.height);

     } else {

+      int w = cp.width;

+      int h = cp.height;

+      Dimension dpySize = viewport.getToolkit().getScreenSize();

+      int wmDecorationWidth = 0;

+      int wmDecorationHeight = 24;

+      if (w + wmDecorationWidth >= dpySize.width)

+        w = dpySize.width - wmDecorationWidth;

+      if (h + wmDecorationHeight >= dpySize.height)

+        h = dpySize.height - wmDecorationHeight;

+

+      int x = (dpySize.width - w - wmDecorationWidth) / 2;

+      int y = (dpySize.height - h - wmDecorationHeight)/2;

+

       viewport.setExtendedState(JFrame.NORMAL);

       viewport.setGeometry(x, y, w, h);

     }

@@ -528,6 +537,10 @@
   private void requestNewUpdate()

   {

     if (formatChange) {

+
+      /* Catch incorrect requestNewUpdate calls */
+      assert(pendingUpdate == false);
+
       if (fullColour) {

         desktop.setPF(fullColourPF);

       } else {

@@ -621,6 +634,7 @@
 

   synchronized public void refresh() {

     writer().writeFramebufferUpdateRequest(new Rect(0,0,cp.width,cp.height), false);

+    pendingUpdate = true;
   }

 

 

diff --git a/java/src/com/tigervnc/vncviewer/DesktopWindow.java b/java/src/com/tigervnc/vncviewer/DesktopWindow.java
index d008b41..7a8cda8 100644
--- a/java/src/com/tigervnc/vncviewer/DesktopWindow.java
+++ b/java/src/com/tigervnc/vncviewer/DesktopWindow.java
@@ -95,6 +95,11 @@
     im.setPF(pf); 

   }

 

+  public void setViewport(ViewportFrame viewport)
+  {
+    viewport.setChild(this);
+  }
+
   // Methods called from the RFB thread - these need to be synchronized

   // wherever they access data shared with the GUI thread.

 

@@ -193,7 +198,6 @@
 

   // resize() is called when the desktop has changed size

   synchronized public void resize() {

-    vlog.debug("DesktopWindow.resize() called");

     int w = cc.cp.width;

     int h = cc.cp.height;

     hideLocalCursor();

diff --git a/java/src/com/tigervnc/vncviewer/VncViewer.java b/java/src/com/tigervnc/vncviewer/VncViewer.java
index ba54918..1547013 100644
--- a/java/src/com/tigervnc/vncviewer/VncViewer.java
+++ b/java/src/com/tigervnc/vncviewer/VncViewer.java
@@ -229,6 +229,10 @@
   BoolParameter sendClipboard
   = new BoolParameter("SendClipboard",
                           "Send clipboard changes to the server", true);
+  StringParameter desktopSize
+  = new StringParameter("DesktopSize",
+                        "Reconfigure desktop size on the server on "+
+                        "connect (if possible)", "");
   BoolParameter alwaysShowServerDialog
   = new BoolParameter("AlwaysShowServerDialog",
                           "Always show the server dialog even if a server "+