@@ -604,8 +604,10 @@ void CConnection::updateEncodings() | |||
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); |
@@ -111,6 +111,10 @@ void CMsgReader::readMsg() | |||
break; | |||
case pseudoEncodingLEDState: | |||
readLEDState(); | |||
break; | |||
case pseudoEncodingVMwareLEDState: | |||
readVMwareLEDState(); | |||
break; | |||
case pseudoEncodingQEMUKeyEvent: | |||
handler->supportsQEMUKeyEvent(); | |||
break; | |||
@@ -485,3 +489,15 @@ void CMsgReader::readLEDState() | |||
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); | |||
} |
@@ -67,6 +67,7 @@ namespace rfb { | |||
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; |
@@ -162,6 +162,8 @@ bool ClientParams::supportsLEDState() const | |||
{ | |||
if (supportsEncoding(pseudoEncodingLEDState)) | |||
return true; | |||
if (supportsEncoding(pseudoEncodingVMwareLEDState)) | |||
return true; | |||
return false; | |||
} | |||
@@ -153,7 +153,8 @@ void SMsgWriter::writeCursor() | |||
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::writeSetVMwareCursorRect(int width, int height, | |||
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 @@ void SMsgWriter::writeLEDStateRect(rdr::U8 state) | |||
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() |
@@ -61,6 +61,7 @@ namespace rfb { | |||
// VMware-specific | |||
const int pseudoEncodingVMwareCursor = 0x574d5664; | |||
const int pseudoEncodingVMwareLEDState = 0x574d5668; | |||
int encodingNum(const char* name); | |||
const char* encodingName(int num); |