Implemented support for DesktopName pseudo encoding, which allows
updating the desktop name on the fly.
Tested in ThinLinc since 2008-01-07.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3549 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/rfb/SMsgWriterV3.cxx b/common/rfb/SMsgWriterV3.cxx
index a85f85e..1271619 100644
--- a/common/rfb/SMsgWriterV3.cxx
+++ b/common/rfb/SMsgWriterV3.cxx
@@ -27,7 +27,7 @@
SMsgWriterV3::SMsgWriterV3(ConnParams* cp, rdr::OutStream* os)
: SMsgWriter(cp, os), updateOS(0), realOS(os), nRectsInUpdate(0),
nRectsInHeader(0), wsccb(0),
- needSetDesktopSize(false)
+ needSetDesktopSize(false), needSetDesktopName(false)
{
}
@@ -64,6 +64,12 @@
return true;
}
+bool SMsgWriterV3::writeSetDesktopName() {
+ if (!cp->supportsDesktopRename) return false;
+ needSetDesktopName = true;
+ return true;
+}
+
void SMsgWriterV3::cursorChange(WriteSetCursorCallback* cb)
{
wsccb = cb;
@@ -118,6 +124,7 @@
os->pad(1);
if (wsccb) nRects++;
if (needSetDesktopSize) nRects++;
+ if (needSetDesktopName) nRects++;
os->writeU16(nRects);
nRectsInUpdate = 0;
nRectsInHeader = nRects;
@@ -150,6 +157,18 @@
needSetDesktopSize = false;
}
+ if (needSetDesktopName) {
+ if (++nRectsInUpdate > nRectsInHeader && nRectsInHeader)
+ throw Exception("SMsgWriterV3 setDesktopName: nRects out of sync");
+ os->writeS16(0);
+ os->writeS16(0);
+ os->writeU16(0);
+ os->writeU16(0);
+ os->writeU32(pseudoEncodingDesktopName);
+ os->writeString(cp->name());
+ needSetDesktopName = false;
+ }
+
if (nRectsInUpdate != nRectsInHeader && nRectsInHeader)
throw Exception("SMsgWriterV3::writeFramebufferUpdateEnd: "
"nRects out of sync");
@@ -168,7 +187,7 @@
bool SMsgWriterV3::needFakeUpdate()
{
- return wsccb || needSetDesktopSize;
+ return wsccb || needSetDesktopSize || needSetDesktopName;
}
void SMsgWriterV3::startRect(const Rect& r, unsigned int encoding)