Adam Tkac b7e5d18
Index: unix/vncviewer/CConn.cxx
Adam Tkac b7e5d18
===================================================================
Adam Tkac b7e5d18
--- unix/vncviewer/CConn.cxx	(revision 4003)
Adam Tkac b7e5d18
+++ unix/vncviewer/CConn.cxx	(revision 4004)
Adam Tkac b7e5d18
@@ -33,6 +33,7 @@
Adam Tkac b7e5d18
 #include <rfb/Password.h>
Adam Tkac b7e5d18
 #include <rfb/screenTypes.h>
Adam Tkac b7e5d18
 #include <network/TcpSocket.h>
Adam Tkac b7e5d18
+#include <cassert>
Adam Tkac b7e5d18
 
Adam Tkac b7e5d18
 #include "TXViewport.h"
Adam Tkac b7e5d18
 #include "DesktopWindow.h"
Adam Tkac b7e5d18
@@ -62,7 +63,7 @@
Adam Tkac b7e5d18
     encodingChange(false), sameMachine(false), fullScreen(::fullScreen),
Adam Tkac b7e5d18
     ctrlDown(false), altDown(false),
Adam Tkac b7e5d18
     menuKeysym(0), menu(dpy, this), options(dpy, this), about(dpy), info(dpy),
Adam Tkac b7e5d18
-    reverseConnection(reverse), firstUpdate(true)
Adam Tkac b7e5d18
+    reverseConnection(reverse), firstUpdate(true), pendingUpdate(false)
Adam Tkac b7e5d18
 {
Adam Tkac b7e5d18
   CharArray menuKeyStr(menuKey.getData());
Adam Tkac b7e5d18
   menuKeysym = XStringToKeysym(menuKeyStr.buf);
Adam Tkac b7e5d18
@@ -306,8 +307,11 @@
Adam Tkac b7e5d18
 // one. We cannot do this if we're in the middle of a format change
Adam Tkac b7e5d18
 // though.
Adam Tkac b7e5d18
 void CConn::framebufferUpdateStart() {
Adam Tkac b7e5d18
-  if (!formatChange)
Adam Tkac b7e5d18
+  if (!formatChange) {
Adam Tkac b7e5d18
+    pendingUpdate = true;
Adam Tkac b7e5d18
     requestNewUpdate();
Adam Tkac b7e5d18
+  } else
Adam Tkac b7e5d18
+    pendingUpdate = false;
Adam Tkac b7e5d18
 }
Adam Tkac b7e5d18
 
Adam Tkac b7e5d18
 // framebufferUpdateEnd() is called at the end of an update.
Adam Tkac b7e5d18
@@ -367,7 +371,7 @@
Adam Tkac b7e5d18
 
Adam Tkac b7e5d18
   // A format change prevented us from sending this before the update,
Adam Tkac b7e5d18
   // so make sure to send it now.
Adam Tkac b7e5d18
-  if (formatChange)
Adam Tkac b7e5d18
+  if (formatChange && !pendingUpdate)
Adam Tkac b7e5d18
     requestNewUpdate();
Adam Tkac b7e5d18
 
Adam Tkac b7e5d18
   // Compute new settings based on updated bandwidth values
Adam Tkac b7e5d18
@@ -536,8 +540,11 @@
Adam Tkac b7e5d18
     break;
Adam Tkac b7e5d18
   case ID_REFRESH:
Adam Tkac b7e5d18
     menu.unmap();
Adam Tkac b7e5d18
-    writer()->writeFramebufferUpdateRequest(Rect(0, 0, cp.width, cp.height),
Adam Tkac b7e5d18
-                                            false);
Adam Tkac b7e5d18
+    if (!formatChange) {
Adam Tkac b7e5d18
+      writer()->writeFramebufferUpdateRequest(Rect(0, 0, cp.width, cp.height),
Adam Tkac b7e5d18
+                                              false);
Adam Tkac b7e5d18
+      pendingUpdate = true;
Adam Tkac b7e5d18
+    }
Adam Tkac b7e5d18
     break;
Adam Tkac b7e5d18
   case ID_F8:
Adam Tkac b7e5d18
     menu.unmap();
Adam Tkac b7e5d18
@@ -840,6 +847,10 @@
Adam Tkac b7e5d18
 void CConn::requestNewUpdate()
Adam Tkac b7e5d18
 {
Adam Tkac b7e5d18
   if (formatChange) {
Adam Tkac b7e5d18
+
Adam Tkac b7e5d18
+    /* Catch incorrect requestNewUpdate calls */
Adam Tkac b7e5d18
+    assert(pendingUpdate == false);
Adam Tkac b7e5d18
+
Adam Tkac b7e5d18
     if (fullColour) {
Adam Tkac b7e5d18
       desktop->setPF(fullColourPF);
Adam Tkac b7e5d18
     } else {
Adam Tkac b7e5d18
Index: unix/vncviewer/CConn.h
Adam Tkac b7e5d18
===================================================================
Adam Tkac b7e5d18
--- unix/vncviewer/CConn.h	(revision 4003)
Adam Tkac b7e5d18
+++ unix/vncviewer/CConn.h	(revision 4004)
Adam Tkac b7e5d18
@@ -132,6 +132,7 @@
Adam Tkac b7e5d18
   InfoDialog info;
Adam Tkac b7e5d18
   bool reverseConnection;
Adam Tkac b7e5d18
   bool firstUpdate;
Adam Tkac b7e5d18
+  bool pendingUpdate;
Adam Tkac b7e5d18
 };
Adam Tkac b7e5d18
 
Adam Tkac b7e5d18
 #endif