Add support for VMware LED status
diff --git a/common/rfb/CConnection.cxx b/common/rfb/CConnection.cxx
index 3a6b744..fcad405 100644
--- a/common/rfb/CConnection.cxx
+++ b/common/rfb/CConnection.cxx
@@ -604,8 +604,10 @@
encodings.push_back(pseudoEncodingDesktopSize);
encodings.push_back(pseudoEncodingExtendedDesktopSize);
}
- if (supportsLEDState)
+ if (supportsLEDState) {
encodings.push_back(pseudoEncodingLEDState);
+ encodings.push_back(pseudoEncodingVMwareLEDState);
+ }
encodings.push_back(pseudoEncodingDesktopName);
encodings.push_back(pseudoEncodingLastRect);
diff --git a/common/rfb/CMsgReader.cxx b/common/rfb/CMsgReader.cxx
index 5519166..0141e6b 100644
--- a/common/rfb/CMsgReader.cxx
+++ b/common/rfb/CMsgReader.cxx
@@ -111,6 +111,10 @@
break;
case pseudoEncodingLEDState:
readLEDState();
+ break;
+ case pseudoEncodingVMwareLEDState:
+ readVMwareLEDState();
+ break;
case pseudoEncodingQEMUKeyEvent:
handler->supportsQEMUKeyEvent();
break;
@@ -485,3 +489,15 @@
handler->setLEDState(state);
}
+
+void CMsgReader::readVMwareLEDState()
+{
+ rdr::U32 state;
+
+ state = is->readU32();
+
+ // As luck has it, this extension uses the same bit definitions,
+ // so no conversion required
+
+ handler->setLEDState(state);
+}
diff --git a/common/rfb/CMsgReader.h b/common/rfb/CMsgReader.h
index 029e95c..03f3d8d 100644
--- a/common/rfb/CMsgReader.h
+++ b/common/rfb/CMsgReader.h
@@ -67,6 +67,7 @@
void readSetDesktopName(int x, int y, int w, int h);
void readExtendedDesktopSize(int x, int y, int w, int h);
void readLEDState();
+ void readVMwareLEDState();
CMsgHandler* handler;
rdr::InStream* is;
diff --git a/common/rfb/ClientParams.cxx b/common/rfb/ClientParams.cxx
index bf2caa4..e42d494 100644
--- a/common/rfb/ClientParams.cxx
+++ b/common/rfb/ClientParams.cxx
@@ -162,6 +162,8 @@
{
if (supportsEncoding(pseudoEncodingLEDState))
return true;
+ if (supportsEncoding(pseudoEncodingVMwareLEDState))
+ return true;
return false;
}
diff --git a/common/rfb/SMsgWriter.cxx b/common/rfb/SMsgWriter.cxx
index 2d59dde..6a2c2ba 100644
--- a/common/rfb/SMsgWriter.cxx
+++ b/common/rfb/SMsgWriter.cxx
@@ -153,7 +153,8 @@
void SMsgWriter::writeLEDState()
{
- if (!client->supportsEncoding(pseudoEncodingLEDState))
+ if (!client->supportsEncoding(pseudoEncodingLEDState) &&
+ !client->supportsEncoding(pseudoEncodingVMwareLEDState))
throw Exception("Client does not support LED state");
if (client->ledState() == ledUnknown)
throw Exception("Server has not specified LED state");
@@ -532,7 +533,8 @@
void SMsgWriter::writeLEDStateRect(rdr::U8 state)
{
- if (!client->supportsEncoding(pseudoEncodingLEDState))
+ if (!client->supportsEncoding(pseudoEncodingLEDState) &&
+ !client->supportsEncoding(pseudoEncodingVMwareLEDState))
throw Exception("Client does not support LED state updates");
if (client->ledState() == ledUnknown)
throw Exception("Server does not support LED state updates");
@@ -543,8 +545,13 @@
os->writeS16(0);
os->writeU16(0);
os->writeU16(0);
- os->writeU32(pseudoEncodingLEDState);
- os->writeU8(state);
+ if (client->supportsEncoding(pseudoEncodingLEDState)) {
+ os->writeU32(pseudoEncodingLEDState);
+ os->writeU8(state);
+ } else {
+ os->writeU32(pseudoEncodingVMwareLEDState);
+ os->writeU32(state);
+ }
}
void SMsgWriter::writeQEMUKeyEventRect()
diff --git a/common/rfb/encodings.h b/common/rfb/encodings.h
index 315ff54..acb86ec 100644
--- a/common/rfb/encodings.h
+++ b/common/rfb/encodings.h
@@ -61,6 +61,7 @@
// VMware-specific
const int pseudoEncodingVMwareCursor = 0x574d5664;
+ const int pseudoEncodingVMwareLEDState = 0x574d5668;
int encodingNum(const char* name);
const char* encodingName(int num);