Refactoring: now PollingManager is owned by XPixelBuffer. No other classes
know about PollingManager.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2576 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/unix/x0vncserver/PollingManager.cxx b/unix/x0vncserver/PollingManager.cxx
index 9951883..81624a9 100644
--- a/unix/x0vncserver/PollingManager.cxx
+++ b/unix/x0vncserver/PollingManager.cxx
@@ -48,7 +48,7 @@
 //
 
 PollingManager::PollingManager(Display *dpy, const Image *image,
-                               ImageFactory *factory,
+                               ImageFactory &factory,
                                int offsetLeft, int offsetTop)
   : m_dpy(dpy),
     m_image(image),
@@ -66,8 +66,8 @@
   // Create additional images used in polling algorithm, warn if
   // underlying class names are different from the class name of the
   // primary image.
-  m_rowImage = factory->newImage(m_dpy, m_width, 1);
-  m_columnImage = factory->newImage(m_dpy, 1, m_height);
+  m_rowImage = factory.newImage(m_dpy, m_width, 1);
+  m_columnImage = factory.newImage(m_dpy, 1, m_height);
   const char *primaryImgClass = m_image->className();
   const char *rowImgClass = m_rowImage->className();
   const char *columnImgClass = m_columnImage->className();
diff --git a/unix/x0vncserver/PollingManager.h b/unix/x0vncserver/PollingManager.h
index 779e88b..2ed9ff5 100644
--- a/unix/x0vncserver/PollingManager.h
+++ b/unix/x0vncserver/PollingManager.h
@@ -38,19 +38,10 @@
 
 public:
 
-  PollingManager(Display *dpy, const Image *image, ImageFactory *factory,
+  PollingManager(Display *dpy, const Image *image, ImageFactory &factory,
                  int offsetLeft = 0, int offsetTop = 0);
   virtual ~PollingManager();
 
-  // Currently, these functions do nothing. In past versions, we used
-  // to poll area around the pointer if its position has been changed
-  // recently. But that rather decreased overal polling performance,
-  // so we don't do that any more. However, pointer position may be a
-  // useful hint and might be used in future code, so we do not remove
-  // these functions, just in case.
-  void setPointerPos(const Point &pos) {}
-  void unsetPointerPos() {}
-
   void poll(VNCServer *server);
 
 protected:
diff --git a/unix/x0vncserver/XPixelBuffer.cxx b/unix/x0vncserver/XPixelBuffer.cxx
index ed22508..f691c57 100644
--- a/unix/x0vncserver/XPixelBuffer.cxx
+++ b/unix/x0vncserver/XPixelBuffer.cxx
@@ -30,6 +30,7 @@
 XPixelBuffer::XPixelBuffer(Display *dpy, ImageFactory &factory,
                            const Rect &rect, ColourMap* cm)
   : FullFramePixelBuffer(),
+    m_poller(0),
     m_dpy(dpy),
     m_image(factory.newImage(dpy, rect.width(), rect.height())),
     m_offsetLeft(rect.tl.x),
@@ -60,10 +61,15 @@
 
   // Get initial screen image from the X display.
   m_image->get(DefaultRootWindow(m_dpy), m_offsetLeft, m_offsetTop);
+
+  // PollingManager will detect changed pixels.
+  m_poller = new PollingManager(dpy, getImage(), factory,
+                                m_offsetLeft, m_offsetTop);
 }
 
 XPixelBuffer::~XPixelBuffer()
 {
+  delete m_poller;
   delete m_image;
 }
 
diff --git a/unix/x0vncserver/XPixelBuffer.h b/unix/x0vncserver/XPixelBuffer.h
index 3632f80..29ae94a 100644
--- a/unix/x0vncserver/XPixelBuffer.h
+++ b/unix/x0vncserver/XPixelBuffer.h
@@ -24,7 +24,9 @@
 #define __XPIXELBUFFER_H__
 
 #include <rfb/PixelBuffer.h>
+#include <rfb/VNCServer.h>
 #include <x0vncserver/Image.h>
+#include <x0vncserver/PollingManager.h>
 
 using namespace rfb;
 
@@ -40,7 +42,10 @@
   virtual ~XPixelBuffer();
 
   // Provide access to the underlying Image object.
-  virtual const Image *getImage() const { return m_image; }
+  const Image *getImage() const { return m_image; }
+
+  // Detect changed pixels, notify the server.
+  inline void poll(VNCServer *server) { m_poller->poll(server); }
 
   // Override PixelBuffer::getStride().
   virtual int getStride() const { return m_stride; }
@@ -49,6 +54,8 @@
   virtual void grabRegion(const rfb::Region& region);
 
 protected:
+  PollingManager *m_poller;
+
   Display *m_dpy;
   Image* m_image;
   int m_offsetLeft;
diff --git a/unix/x0vncserver/x0vncserver.cxx b/unix/x0vncserver/x0vncserver.cxx
index b63e937..2fe599e 100644
--- a/unix/x0vncserver/x0vncserver.cxx
+++ b/unix/x0vncserver/x0vncserver.cxx
@@ -47,7 +47,6 @@
 #include <x0vncserver/Geometry.h>
 #include <x0vncserver/Image.h>
 #include <x0vncserver/XPixelBuffer.h>
-#include <x0vncserver/PollingManager.h>
 #include <x0vncserver/PollingScheduler.h>
 
 // XXX Lynx/OS 2.3: protos for select(), bzero()
@@ -138,7 +137,7 @@
 {
 public:
   XDesktop(Display* dpy_, Geometry *geometry_)
-    : dpy(dpy_), geometry(geometry_), pb(0), server(0), pollmgr(0),
+    : dpy(dpy_), geometry(geometry_), pb(0), server(0),
       oldButtonMask(0), haveXtest(false), maxButtons(0), running(false)
   {
 #ifdef HAVE_XTEST
@@ -186,10 +185,6 @@
     server = vs;
     server->setPixelBuffer(pb);
 
-    // Create polling manager object for detection of pixel changes.
-    pollmgr = new PollingManager(dpy, pb->getImage(), &factory,
-                                 geometry->offsetLeft(),
-                                 geometry->offsetTop());
     running = true;
   }
 
@@ -197,10 +192,7 @@
     running = false;
 
     delete pb;
-    delete pollmgr;
-
     pb = 0;
-    pollmgr = 0;
   }
 
   inline bool isRunning() {
@@ -208,12 +200,11 @@
   }
 
   inline void poll() {
-    if (pollmgr)
-      pollmgr->poll(server);
+    if (pb)
+      pb->poll(server);
   }
 
   virtual void pointerEvent(const Point& pos, int buttonMask) {
-    pollmgr->setPointerPos(pos);
 #ifdef HAVE_XTEST
     if (!haveXtest) return;
     XTestFakeMotionEvent(dpy, DefaultScreen(dpy),
@@ -270,7 +261,6 @@
   Geometry* geometry;
   XPixelBuffer* pb;
   VNCServer* server;
-  PollingManager* pollmgr;
   int oldButtonMask;
   bool haveXtest;
   int maxButtons;