Blob Blame History Raw
diff -up tightvnc-1.5.0-20081015svn3022/unix/xserver/hw/vnc/XserverDesktop.cc.bounds tightvnc-1.5.0-20081015svn3022/unix/xserver/hw/vnc/XserverDesktop.cc
--- tightvnc-1.5.0-20081015svn3022/unix/xserver/hw/vnc/XserverDesktop.cc.bounds	2008-10-15 15:23:24.000000000 +0200
+++ tightvnc-1.5.0-20081015svn3022/unix/xserver/hw/vnc/XserverDesktop.cc	2008-10-23 12:46:31.000000000 +0200
@@ -500,32 +500,36 @@ void XserverDesktop::add_changed(RegionP
 {
   if (ignoreHooks_) return;
   if (grabbing) return;
+
+  BoxRec screenbox;
+  RegionPtr newreg = REGION_CREATE(pScreen, 0, 0);
+
+  screenbox.x1 = screenbox.y1 = 0;
+  screenbox.x2 = pScreen->width;
+  screenbox.y2 = pScreen->height;
+
+  RegionPtr screenreg = REGION_CREATE(pScreen, &screenbox, 0);
+  REGION_INTERSECT(pScreen, newreg, reg, screenreg);
+  REGION_DESTROY (pScreen, screenreg);
+
   try {
     rfb::Region rfbReg;
-    rfbReg.setExtentsAndOrderedRects((ShortRect*)REGION_EXTENTS(pScreen, reg),
-                                     REGION_NUM_RECTS(reg),
-                                     (ShortRect*)REGION_RECTS(reg));
+    rfbReg.setExtentsAndOrderedRects((ShortRect*)REGION_EXTENTS(pScreen, newreg),
+                                     REGION_NUM_RECTS(newreg),
+                                     (ShortRect*)REGION_RECTS(newreg));
     server->add_changed(rfbReg);
     deferUpdate();
   } catch (rdr::Exception& e) {
     vlog.error("XserverDesktop::add_changed: %s",e.str());
   }
+  REGION_DESTROY (pScreen, newreg);
 }
 
 void XserverDesktop::add_copied(RegionPtr dst, int dx, int dy)
 {
-  if (ignoreHooks_) return;
-  if (grabbing) return;
-  try {
-    rfb::Region rfbReg;
-    rfbReg.setExtentsAndOrderedRects((ShortRect*)REGION_EXTENTS(pScreen, dst),
-                                     REGION_NUM_RECTS(dst),
-                                     (ShortRect*)REGION_RECTS(dst));
-    server->add_copied(rfbReg, rfb::Point(dx, dy));
-    deferUpdate();
-  } catch (rdr::Exception& e) {
-    vlog.error("XserverDesktop::add_copied: %s",e.str());
-  }
+  add_changed (dst);
+  REGION_TRANSLATE (pScreen, dst, -dx, -dy);
+  add_changed (dst);
 }
 
 void XserverDesktop::positionCursor()