Grabbing the screen moved from PollingManager to XPixelBuffer.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2568 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/unix/x0vncserver/PollingManager.cxx b/unix/x0vncserver/PollingManager.cxx
index 71b5d66..9a9f28a 100644
--- a/unix/x0vncserver/PollingManager.cxx
+++ b/unix/x0vncserver/PollingManager.cxx
@@ -64,9 +64,6 @@
                ((buffer->height() + 31) / 32)),
     m_pollingStep(0)
 {
-  // Get initial screen image.
-  m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop);
-
   // Create additional images used in polling algorithm, warn if
   // underlying class names are different from the class name of the
   // primary image.
@@ -290,7 +287,6 @@
         if (rect.br.y > m_height)
           rect.br.y = m_height;
         // Add to the changed region maintained by the server.
-        getScreenRect(rect);
         m_server->add_changed(rect);
         // Skip processed tiles.
         x += count;
diff --git a/unix/x0vncserver/PollingManager.h b/unix/x0vncserver/PollingManager.h
index 015b3ca..97a158f 100644
--- a/unix/x0vncserver/PollingManager.h
+++ b/unix/x0vncserver/PollingManager.h
@@ -64,7 +64,7 @@
   Display *m_dpy;
   VNCServer *m_server;
 
-  Image *m_image;
+  const Image *m_image;
   const int m_bytesPerPixel;
 
   const int m_offsetLeft;
@@ -74,16 +74,6 @@
 
 private:
 
-  inline void getScreen() {
-    m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop);
-  }
-
-  inline void getScreenRect(const Rect& r) {
-    m_image->get(DefaultRootWindow(m_dpy),
-                 m_offsetLeft + r.tl.x, m_offsetTop + r.tl.y,
-                 r.width(), r.height(), r.tl.x, r.tl.y);
-  }
-
   inline void getRow(int x, int y, int w) {
     if (w == m_width) {
       // Getting full row may be more efficient.
diff --git a/unix/x0vncserver/XPixelBuffer.cxx b/unix/x0vncserver/XPixelBuffer.cxx
index 78ac558..2692c18 100644
--- a/unix/x0vncserver/XPixelBuffer.cxx
+++ b/unix/x0vncserver/XPixelBuffer.cxx
@@ -20,6 +20,8 @@
 // XPixelBuffer.cxx
 //
 
+#include <vector>
+#include <rfb/Region.h>
 #include <X11/Xlib.h>
 #include <x0vncserver/XPixelBuffer.h>
 
@@ -36,6 +38,8 @@
     m_offsetTop(offsetTop),
     m_stride(image->xim->bytes_per_line * 8 / image->xim->bits_per_pixel)
 {
+  // Get initial screen image.
+  m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop);
 }
 
 XPixelBuffer::~XPixelBuffer()
@@ -45,6 +49,11 @@
 void
 XPixelBuffer::grabRegion(const rfb::Region& region)
 {
-  // m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop);
+  std::vector<Rect> rects;
+  std::vector<Rect>::const_iterator i;
+  region.get_rects(&rects);
+  for (i = rects.begin(); i != rects.end(); i++) {
+    grabRect(*i);
+  }
 }
 
diff --git a/unix/x0vncserver/XPixelBuffer.h b/unix/x0vncserver/XPixelBuffer.h
index 2f84245..b909bb8 100644
--- a/unix/x0vncserver/XPixelBuffer.h
+++ b/unix/x0vncserver/XPixelBuffer.h
@@ -59,6 +59,14 @@
 
   // The number of pixels in a row, with padding included.
   int m_stride;
+
+  // Copy pixels from the screen to the pixel buffer,
+  // for the specified rectangular area of the buffer.
+  inline void grabRect(const Rect &r) {
+    m_image->get(DefaultRootWindow(m_dpy),
+		 m_offsetLeft + r.tl.x, m_offsetTop + r.tl.y,
+		 r.width(), r.height(), r.tl.x, r.tl.y);
+  }
 };
 
 #endif // __XPIXELBUFFER_H__