diff options
-rw-r--r-- | common/rfb/ServerCore.cxx | 7 | ||||
-rw-r--r-- | common/rfb/ServerCore.h | 3 | ||||
-rw-r--r-- | common/rfb/UpdateTracker.h | 5 | ||||
-rw-r--r-- | common/rfb/VNCSConnectionST.cxx | 8 | ||||
-rw-r--r-- | common/rfb/VNCServerST.cxx | 16 | ||||
-rw-r--r-- | common/rfb/VNCServerST.h | 1 |
6 files changed, 39 insertions, 1 deletions
diff --git a/common/rfb/ServerCore.cxx b/common/rfb/ServerCore.cxx index 750daae2..19b8fee4 100644 --- a/common/rfb/ServerCore.cxx +++ b/common/rfb/ServerCore.cxx @@ -92,3 +92,10 @@ rfb::BoolParameter rfb::Server::queryConnect ("QueryConnect", "Prompt the local user to accept or reject incoming connections.", false); + +// TightVNC-specific parameters +// FIXME: Disable special video handling when this parameter is 0. +rfb::IntParameter rfb::Server::videoPriority +("VideoPriority", + "Priority of sending updates for video area (0..8)", + 0, 0, 8); diff --git a/common/rfb/ServerCore.h b/common/rfb/ServerCore.h index 68d7b74b..85d4e902 100644 --- a/common/rfb/ServerCore.h +++ b/common/rfb/ServerCore.h @@ -48,6 +48,9 @@ namespace rfb { static BoolParameter sendCutText; static BoolParameter queryConnect; + // TightVNC-specific parameters + static IntParameter videoPriority; + }; }; diff --git a/common/rfb/UpdateTracker.h b/common/rfb/UpdateTracker.h index b6a7d748..9cd99ab1 100644 --- a/common/rfb/UpdateTracker.h +++ b/common/rfb/UpdateTracker.h @@ -85,6 +85,11 @@ namespace rfb { // FIXME: Provide getUpdateInfo() with no clipping, for better efficiency. virtual void getUpdateInfo(UpdateInfo* info, const Region& cliprgn); + // Get coordinates of the video rectangle + virtual const Rect& getVideoArea() const { + return video_area; + } + // Copy the contained updates to another tracker virtual void copyTo(UpdateTracker* to) const; diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index 95b99fdd..a9c59f3e 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -541,7 +541,13 @@ void VNCSConnectionST::writeFramebufferUpdate() updates.enable_copyrect(cp.useCopyRect); - server->checkUpdate(); + static int counter = 1; + if (--counter > 0) { + server->checkVideoUpdate(); + } else { + counter = rfb::Server::videoPriority; + server->checkUpdate(); + } // Get the lists of updates. Prior to exporting the data to the `ui' object, // getUpdateInfo() will normalize the `updates' object such way that its diff --git a/common/rfb/VNCServerST.cxx b/common/rfb/VNCServerST.cxx index 93f947cf..dc6c7096 100644 --- a/common/rfb/VNCServerST.cxx +++ b/common/rfb/VNCServerST.cxx @@ -507,6 +507,22 @@ void VNCServerST::checkUpdate() comparer->clear(); } +void VNCServerST::checkVideoUpdate() +{ + const Rect &videoRect = comparer->getVideoArea(); + Region videoRegion(videoRect); + + if (!videoRegion.is_empty()) { + pb->grabRegion(videoRegion); + + std::list<VNCSConnectionST*>::iterator ci, ci_next; + for (ci = clients.begin(); ci != clients.end(); ci = ci_next) { + ci_next = ci; ci_next++; + (*ci)->set_video_area(videoRect); + } + } +} + void VNCServerST::getConnInfo(ListConnInfo * listConn) { listConn->Clear(); diff --git a/common/rfb/VNCServerST.h b/common/rfb/VNCServerST.h index 81ad4ecb..213f6b1f 100644 --- a/common/rfb/VNCServerST.h +++ b/common/rfb/VNCServerST.h @@ -238,6 +238,7 @@ namespace rfb { bool needRenderedCursor(); void checkUpdate(); + void checkVideoUpdate(); SSecurityFactory* securityFactory; QueryConnectionHandler* queryConnectionHandler; |