summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian P. Hinz <bphinz@users.sf.net>2017-02-09 23:41:56 -0500
committerBrian P. Hinz <bphinz@users.sf.net>2017-02-10 18:31:14 -0500
commit99a855a20743484576a1d3e2e1cbd9d0e19aa4c6 (patch)
tree965f9d7ff520cbfaaba95190fbe4352b6e00c637
parent455566e8b5b2ea5bd78350769eb2d62279cc0dc6 (diff)
downloadtigervnc-99a855a20743484576a1d3e2e1cbd9d0e19aa4c6.tar.gz
tigervnc-99a855a20743484576a1d3e2e1cbd9d0e19aa4c6.zip
Fix regression that omitted support for client redirect.
Also, delay showing DesktopWindow until first valid rect has been recieved. This allows for a ClientRedirect to take place before any data rects have been received.
-rw-r--r--java/com/tigervnc/rfb/CMsgReader.java16
-rw-r--r--java/com/tigervnc/vncviewer/CConn.java2
-rw-r--r--java/com/tigervnc/vncviewer/DesktopWindow.java68
3 files changed, 52 insertions, 34 deletions
diff --git a/java/com/tigervnc/rfb/CMsgReader.java b/java/com/tigervnc/rfb/CMsgReader.java
index e7b4deb8..e9cad89d 100644
--- a/java/com/tigervnc/rfb/CMsgReader.java
+++ b/java/com/tigervnc/rfb/CMsgReader.java
@@ -104,6 +104,10 @@ public class CMsgReader {
case Encodings.pseudoEncodingExtendedDesktopSize:
readExtendedDesktopSize(x, y, w, h);
break;
+ case Encodings.pseudoEncodingClientRedirect:
+ nUpdateRectsLeft = 0;
+ readClientRedirect(x, y, w, h);
+ return;
default:
readRect(new Rect(x, y, x+w, y+h), encoding);
break;
@@ -259,6 +263,18 @@ public class CMsgReader {
handler.setExtendedDesktopSize(x, y, w, h, layout);
}
+ protected void readClientRedirect(int x, int y, int w, int h)
+ {
+ int port = is.readU16();
+ String host = is.readString();
+ String x509subject = is.readString();
+
+ if (x != 0 || y != 0 || w != 0 || h != 0)
+ vlog.error("Ignoring ClientRedirect rect with non-zero position/size");
+ else
+ handler.clientRedirect(port, host, x509subject);
+ }
+
public int[] getImageBuf(int required) { return getImageBuf(required, 0, 0); }
public int[] getImageBuf(int required, int requested, int nPixels)
diff --git a/java/com/tigervnc/vncviewer/CConn.java b/java/com/tigervnc/vncviewer/CConn.java
index 8a2303b0..128867b9 100644
--- a/java/com/tigervnc/vncviewer/CConn.java
+++ b/java/com/tigervnc/vncviewer/CConn.java
@@ -326,6 +326,8 @@ public class CConn extends CConnection implements
setServerPort(port);
sock.inStream().setBlockCallback(this);
setStreams(sock.inStream(), sock.outStream());
+ if (desktop != null)
+ desktop.dispose();
initialiseProtocol();
} catch (java.lang.Exception e) {
throw new Exception(e.getMessage());
diff --git a/java/com/tigervnc/vncviewer/DesktopWindow.java b/java/com/tigervnc/vncviewer/DesktopWindow.java
index e76a0156..187fbad0 100644
--- a/java/com/tigervnc/vncviewer/DesktopWindow.java
+++ b/java/com/tigervnc/vncviewer/DesktopWindow.java
@@ -151,21 +151,6 @@ public class DesktopWindow extends JFrame
}
});
- pack();
- if (embed.getValue()) {
- scroll.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_AS_NEEDED);
- scroll.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_AS_NEEDED);
- VncViewer.setupEmbeddedFrame(scroll);
- } else {
- if (fullScreen.getValue())
- fullscreen_on();
- else
- setVisible(true);
-
- if (maximize.getValue())
- setExtendedState(JFrame.MAXIMIZED_BOTH);
- }
-
}
// Remove resize listener in order to prevent recursion when resizing
@@ -227,25 +212,40 @@ public class DesktopWindow extends JFrame
setTitle(name);
}
- // Copy the areas of the framebuffer that have been changed (damaged)
- // to the displayed window.
-
- public void updateWindow()
- {
- if (firstUpdate) {
- if (cc.cp.supportsSetDesktopSize && !desktopSize.getValue().equals("")) {
- // Hack: Wait until we're in the proper mode and position until
- // resizing things, otherwise we might send the wrong thing.
- if (delayedFullscreen)
- delayedDesktopSize = true;
- else
- handleDesktopSize();
- }
- firstUpdate = false;
- }
-
- viewport.updateWindow();
- }
+ // Copy the areas of the framebuffer that have been changed (damaged)
+ // to the displayed window.
+
+ public void updateWindow()
+ {
+ if (firstUpdate) {
+ pack();
+ if (embed.getValue()) {
+ scroll.setHorizontalScrollBarPolicy(HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ scroll.setVerticalScrollBarPolicy(VERTICAL_SCROLLBAR_AS_NEEDED);
+ VncViewer.setupEmbeddedFrame(scroll);
+ } else {
+ if (fullScreen.getValue())
+ fullscreen_on();
+ else
+ setVisible(true);
+
+ if (maximize.getValue())
+ setExtendedState(JFrame.MAXIMIZED_BOTH);
+ }
+
+ if (cc.cp.supportsSetDesktopSize && !desktopSize.getValue().equals("")) {
+ // Hack: Wait until we're in the proper mode and position until
+ // resizing things, otherwise we might send the wrong thing.
+ if (delayedFullscreen)
+ delayedDesktopSize = true;
+ else
+ handleDesktopSize();
+ }
+ firstUpdate = false;
+ }
+
+ viewport.updateWindow();
+ }
public void resizeFramebuffer(int new_w, int new_h)
{