Browse Source

Add support for VMware LED status

tags/v1.9.90
Pierre Ossman 5 years ago
parent
commit
62b0786cc8

+ 3
- 1
common/rfb/CConnection.cxx View File

@@ -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);

+ 16
- 0
common/rfb/CMsgReader.cxx View File

@@ -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);
}

+ 1
- 0
common/rfb/CMsgReader.h View File

@@ -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;

+ 2
- 0
common/rfb/ClientParams.cxx View File

@@ -162,6 +162,8 @@ bool ClientParams::supportsLEDState() const
{
if (supportsEncoding(pseudoEncodingLEDState))
return true;
if (supportsEncoding(pseudoEncodingVMwareLEDState))
return true;
return false;
}


+ 11
- 4
common/rfb/SMsgWriter.cxx View File

@@ -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()

+ 1
- 0
common/rfb/encodings.h View File

@@ -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);

Loading…
Cancel
Save