summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/rfb/ServerCore.cxx7
-rw-r--r--common/rfb/ServerCore.h3
-rw-r--r--common/rfb/UpdateTracker.h5
-rw-r--r--common/rfb/VNCSConnectionST.cxx8
-rw-r--r--common/rfb/VNCServerST.cxx16
-rw-r--r--common/rfb/VNCServerST.h1
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;