Here is the patch I am testing now:

--- vnc-4.0b4-unixsrc/rfb/SMsgWriter.cxx.crash  2003-06-27 14:10:14.000000000 +0100
+++ vnc-4.0b4-unixsrc/rfb/SMsgWriter.cxx        2003-11-08 13:54:12.000000000 +0000
@@ -92,9 +92,19 @@
 
 void SMsgWriter::writeFramebufferUpdate(const UpdateInfo& ui, ImageGetter* ig)
 {
-  writeFramebufferUpdateStart(ui.numRects());
-  writeRects(ui, ig);
-  writeFramebufferUpdateEnd();
+  int n = ui.numRects ();
+  std::vector<Rect>::const_iterator i;
+  for (i = ui.copied.begin (); i != ui.copied.end (); i++)
+    if (!(i->width () && i->height ()))
+      n--;
+  for (i = ui.changed.begin (); i != ui.changed.end (); i++)
+    if (!(i->width () && i->height ()))
+      n--;
+  if (n) {
+    writeFramebufferUpdateStart(ui.numRects());
+    writeRects(ui, ig);
+    writeFramebufferUpdateEnd();
+  }
 }
 
 void SMsgWriter::writeRects(const UpdateInfo& ui, ImageGetter* ig)
@@ -105,10 +115,8 @@
       writeCopyRect(*i, i->tl.x - ui.copy_delta.x, i->tl.y - ui.copy_delta.y);
   }
 
-  for (i = ui.changed.begin(); i != ui.changed.end(); i++) {
-    if (i->width() && i->height())
-      writeRect(*i, ig);
-  }
+  for (i = ui.changed.begin(); i != ui.changed.end(); i++)
+    writeRect(*i, ig);
 }
 
 
@@ -119,7 +127,8 @@
 
 void SMsgWriter::writeRect(const Rect& r, ImageGetter* ig)
 {
-  writeRect(r, cp->currentEncoding(), ig);
+  if (r.width() && r.height())
+    writeRect(r, cp->currentEncoding(), ig);
 }
 
 void SMsgWriter::writeRect(const Rect& r, unsigned int encoding,
--- vnc-4.0b4-unixsrc/rfb/VNCSConnectionST.cxx.crash    2003-11-08 13:54:12.000000000 
+0000
+++ vnc-4.0b4-unixsrc/rfb/VNCSConnectionST.cxx  2003-11-08 14:18:12.000000000 +0000
@@ -485,13 +485,21 @@
   updates.enable_copyrect(cp.useCopyRect);
   updates.flush_update(info, requested);
   if (!info.is_empty() || writer()->needFakeUpdate() || drawRenderedCursor) {
-    int nRects = info.numRects() + (drawRenderedCursor ? 1 : 0);
-    writer()->writeFramebufferUpdateStart(nRects);
-    writer()->writeRects(info, &image_getter);
-    if (drawRenderedCursor)
-      writeRenderedCursorRect();
-    writer()->writeFramebufferUpdateEnd();
-    requested.clear();
+    int nRects = info.numRects();
+    int rendered_cursor_nonzero = 0;
+    if (drawRenderedCursor &&
+       renderedCursorRect.width () &&
+       renderedCursorRect.height ())
+      rendered_cursor_nonzero = 1;
+    nRects += rendered_cursor_nonzero;
+    if (nRects) {
+      writer()->writeFramebufferUpdateStart(nRects);
+      writer()->writeRects(info, &image_getter);
+      if (rendered_cursor_nonzero)
+        writeRenderedCursorRect();
+      writer()->writeFramebufferUpdateEnd();
+      requested.clear();
+    }
   }
 }
_______________________________________________
VNC-List mailing list
[EMAIL PROTECTED]
To remove yourself from the list visit:
http://www.realvnc.com/mailman/listinfo/vnc-list

Reply via email to