From 303433aae8f929bda55edcea911382e236973ef1 Mon Sep 17 00:00:00 2001 From: Constantin Kaplinsky Date: Wed, 4 Jun 2008 05:57:06 +0000 Subject: [PATCH] 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 --- unix/x0vncserver/PollingManager.cxx | 6 +++--- unix/x0vncserver/PollingManager.h | 11 +---------- unix/x0vncserver/XPixelBuffer.cxx | 6 ++++++ unix/x0vncserver/XPixelBuffer.h | 9 ++++++++- unix/x0vncserver/x0vncserver.cxx | 16 +++------------- 5 files changed, 21 insertions(+), 27 deletions(-) diff --git a/unix/x0vncserver/PollingManager.cxx b/unix/x0vncserver/PollingManager.cxx index 99518833..81624a9c 100644 --- a/unix/x0vncserver/PollingManager.cxx +++ b/unix/x0vncserver/PollingManager.cxx @@ -48,7 +48,7 @@ const int PollingManager::m_pollingOrder[32] = { // 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 @@ PollingManager::PollingManager(Display *dpy, const Image *image, // 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 779e88b8..2ed9ff5e 100644 --- a/unix/x0vncserver/PollingManager.h +++ b/unix/x0vncserver/PollingManager.h @@ -38,19 +38,10 @@ class PollingManager { 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 ed22508d..f691c576 100644 --- a/unix/x0vncserver/XPixelBuffer.cxx +++ b/unix/x0vncserver/XPixelBuffer.cxx @@ -30,6 +30,7 @@ using namespace rfb; 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 @@ XPixelBuffer::XPixelBuffer(Display *dpy, ImageFactory &factory, // 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 3632f804..29ae94a8 100644 --- a/unix/x0vncserver/XPixelBuffer.h +++ b/unix/x0vncserver/XPixelBuffer.h @@ -24,7 +24,9 @@ #define __XPIXELBUFFER_H__ #include +#include #include +#include using namespace rfb; @@ -40,7 +42,10 @@ public: 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 @@ public: 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 b63e9379..2fe599e8 100644 --- a/unix/x0vncserver/x0vncserver.cxx +++ b/unix/x0vncserver/x0vncserver.cxx @@ -47,7 +47,6 @@ #include #include #include -#include #include // XXX Lynx/OS 2.3: protos for select(), bzero() @@ -138,7 +137,7 @@ class XDesktop : public SDesktop, public ColourMap { 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 @@ public: 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 @@ public: running = false; delete pb; - delete pollmgr; - pb = 0; - pollmgr = 0; } inline bool isRunning() { @@ -208,12 +200,11 @@ public: } 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 @@ protected: Geometry* geometry; XPixelBuffer* pb; VNCServer* server; - PollingManager* pollmgr; int oldButtonMask; bool haveXtest; int maxButtons; -- 2.39.5