]> source.dussan.org Git - tigervnc.git/commitdiff
[Enhancements, refactoring] Rationalized functions to control video
authorConstantin Kaplinsky <const@tightvnc.com>
Fri, 5 Sep 2008 02:26:35 +0000 (02:26 +0000)
committerConstantin Kaplinsky <const@tightvnc.com>
Fri, 5 Sep 2008 02:26:35 +0000 (02:26 +0000)
rectangle selection and default video rectangle. Added more logging and
improved error checking in the related code.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@2753 3789f03b-4d11-0410-bbf8-ca57d06f2519

common/rfb/SMsgHandler.cxx
common/rfb/SMsgHandler.h
common/rfb/SMsgReader.cxx
common/rfb/VNCSConnectionST.cxx
common/rfb/VNCSConnectionST.h
common/rfb/VNCServerST.cxx
common/rfb/VNCServerST.h
unix/x0vncserver/x0vncserver.cxx

index 64f05345c47feacd74753da414e3335057439bde..a4ae46d2dbdfcf1bfefd12751bc0970245db50c1 100644 (file)
@@ -54,8 +54,3 @@ void SMsgHandler::supportsLocalCursor()
 void SMsgHandler::setVideoRectangle(const Rect& r)
 {
 }
-
-void SMsgHandler::unsetVideoRectangle()
-{
-}
-
index f6d714c7ed02535af7ebff82cdfbbeb544e0a8c3..16b3c900023ca938dfdd04df11a4f975699e9e38 100644 (file)
@@ -48,7 +48,6 @@ namespace rfb {
     virtual void framebufferUpdateRequest(const Rect& r, bool incremental);
 
     virtual void setVideoRectangle(const Rect& r);
-    virtual void unsetVideoRectangle();
 
     // InputHandler interface
     // The InputHandler methods will be called for the corresponding messages.
index c55e8f16210d15e59ee450e81d982f95d159aacc..d22706407f17995ee9860282d4efbba17cf9631d 100644 (file)
@@ -106,15 +106,18 @@ void SMsgReader::readVideoRectangleSelection()
   int y = is->readU16();
   int w = is->readU16();
   int h = is->readU16();
-  bool enable = w > 0 && h > 0;
+  Rect rect(x, y, x+w, y+h);
 
-  if (enable) {
+  if (!rect.is_empty()) {
     vlog.debug("Video area selected by client: %dx%d at (%d,%d)",
                w, h, x, y);
-    handler->setVideoRectangle(Rect(x, y, x+w, y+h));
+  } else if (x != 0 || y != 0 || w != 0 || h != 0) {
+    vlog.debug("Empty video area selected by client: %dx%d at (%d,%d)",
+               w, h, x, y);
+    rect.clear();
   } else {
     vlog.debug("Video area discarded by client");
-    handler->unsetVideoRectangle();
   }
+  handler->setVideoRectangle(rect);
 }
 
index 84da709eb43abd636c372bfbc8266c31db1c70f5..8c52bcbbd7d5346ad69f3abaeb3b338469264dc3 100644 (file)
@@ -497,11 +497,6 @@ void VNCSConnectionST::setVideoRectangle(const Rect& r)
   server->setVideoRectangle(r);
 }
 
-void VNCSConnectionST::unsetVideoRectangle()
-{
-  server->unsetVideoRectangle();
-}
-
 void VNCSConnectionST::setInitialColourMap()
 {
   setColourMapEntries(0, 0);
index 1df718af2970fdcf558a17211f5893072c025e20..d48c8c73f5f8662ad767a9180335b53251e4b0ad 100644 (file)
@@ -131,7 +131,6 @@ namespace rfb {
     virtual void supportsLocalCursor();
 
     virtual void setVideoRectangle(const Rect& r);
-    virtual void unsetVideoRectangle();
 
     // setAccessRights() allows a security package to limit the access rights
     // of a VNCSConnectioST to the server.  These access rights are applied
index 0577d0563ec15d15cdc19ce34fe34fcc8a103aaf..838f06c3a02e5baf32cecd2efa04dc38976ea032 100644 (file)
@@ -259,6 +259,7 @@ void VNCServerST::setPixelBuffer(PixelBuffer* pb_)
 
   if (pb) {
     comparer = new ComparingUpdateTracker(pb);
+    applyVideoRectangle();
     cursor.setPF(pb->getPF());
     renderedCursor.setPF(pb->getPF());
 
@@ -302,17 +303,23 @@ void VNCServerST::serverCutText(const char* str, int len)
 
 void VNCServerST::add_changed(const Region& region)
 {
-  comparer->add_changed(region);
+  if (comparer != 0) {
+    comparer->add_changed(region);
+  }
 }
 
 void VNCServerST::add_copied(const Region& dest, const Point& delta)
 {
-  comparer->add_copied(dest, delta);
+  if (comparer != 0) {
+    comparer->add_copied(dest, delta);
+  }
 }
 
 void VNCServerST::set_video_area(const Rect &rect)
 {
-  comparer->set_video_area(rect);
+  if (comparer != 0) {
+    comparer->set_video_area(rect);
+  }
 }
 
 bool VNCServerST::clientsReadyForUpdate()
@@ -553,28 +560,43 @@ void VNCServerST::setConnStatus(ListConnInfo* listConn)
   }
 }
 
-void VNCServerST::setVideoRectangle(const Rect& r)
+void VNCServerST::enableVideoSelection(bool enable)
 {
-  if (isVideoSelectionEnabled()) {
-    // FIXME: Duplication between m_videoRect and comparer->video_area.
-    m_videoRect = r;
-    set_video_area(m_videoRect);
-  }
+  slog.debug("Enabling video selection");
+  m_videoSelectionEnabled = enable;
+  applyVideoRectangle();
 }
 
-void VNCServerST::unsetVideoRectangle()
+bool VNCServerST::isVideoSelectionEnabled() const
 {
-  if (isVideoSelectionEnabled()) {
-    // FIXME: Duplication between m_videoRect and comparer->video_area.
-    m_videoRect.clear();
-    set_video_area(m_defaultVideoRect);
-  }
+  return m_videoSelectionEnabled;
+}
+
+void VNCServerST::setVideoRectangle(const Rect& r)
+{
+  m_videoRect = r;
+  applyVideoRectangle();
 }
 
-void VNCServerST::setDefaultVideoRect(const Rect& r)
+void VNCServerST::setDefaultVideoRectangle(const Rect& r)
 {
   m_defaultVideoRect = r;
-  if (m_videoRect.is_empty()) {
-    set_video_area(m_defaultVideoRect);
+  applyVideoRectangle();
+}
+
+void VNCServerST::applyVideoRectangle()
+{
+  if (pb != 0) {
+    if (isVideoSelectionEnabled() && !m_videoRect.is_empty()) {
+      slog.debug("Applying video selection");
+      set_video_area(m_videoRect);
+    } else {
+      if (!m_defaultVideoRect.is_empty()) {
+        slog.debug("Applying default video area");
+      } else {
+        slog.debug("Applying empty video area");
+      }
+      set_video_area(m_defaultVideoRect);
+    }
   }
 }
index 1dd7afd1373ec450d1ee3bb358ecdacf8a6b3e89..90bbeb5c098bc6282730d676c5f073c9a96bb6cd 100644 (file)
@@ -199,13 +199,11 @@ namespace rfb {
     // request, as we expect that video data is changing continuously. By
     // default, this option is disabled, as it's rather a specialized feature
     // and video selection GUI can confuse users of the TightVNC client.
-    void enableVideoSelection(bool enable) { m_videoSelectionEnabled = enable; }
-    bool isVideoSelectionEnabled() { return m_videoSelectionEnabled; }
+    void enableVideoSelection(bool enable);
+    bool isVideoSelectionEnabled() const;
 
     void setVideoRectangle(const Rect& r);
-    void unsetVideoRectangle();
-
-    void setDefaultVideoRect(const Rect& r);
+    void setDefaultVideoRectangle(const Rect& r);
 
   protected:
 
@@ -259,6 +257,8 @@ namespace rfb {
     bool m_videoSelectionEnabled;
     Rect m_videoRect;
     Rect m_defaultVideoRect;
+
+    void applyVideoRectangle();
   };
 
 };
index d21e71b14cbd8deae07aa40346b3122d6af285ad..9b589d9a6781dc63448b95e7a6e9ff281e09f4dc 100644 (file)
@@ -188,7 +188,7 @@ public:
 
     server = (VNCServerST *)vs;
     server->setPixelBuffer(pb);
-    server->setDefaultVideoRect(geometry->getVideoRect());
+    server->setDefaultVideoRectangle(geometry->getVideoRect());
 
     running = true;
   }