aboutsummaryrefslogtreecommitdiffstats
path: root/common/rfb
diff options
context:
space:
mode:
Diffstat (limited to 'common/rfb')
-rw-r--r--common/rfb/CConnection.cxx1
-rw-r--r--common/rfb/CMsgHandler.cxx5
-rw-r--r--common/rfb/CMsgHandler.h1
-rw-r--r--common/rfb/CMsgReader.cxx4
-rw-r--r--common/rfb/CMsgWriter.cxx38
-rw-r--r--common/rfb/CMsgWriter.h2
-rw-r--r--common/rfb/ServerParams.cxx2
-rw-r--r--common/rfb/ServerParams.h1
8 files changed, 48 insertions, 6 deletions
diff --git a/common/rfb/CConnection.cxx b/common/rfb/CConnection.cxx
index b4017dba..a6763c05 100644
--- a/common/rfb/CConnection.cxx
+++ b/common/rfb/CConnection.cxx
@@ -835,6 +835,7 @@ void CConnection::updateEncodings()
encodings.push_back(pseudoEncodingContinuousUpdates);
encodings.push_back(pseudoEncodingFence);
encodings.push_back(pseudoEncodingQEMUKeyEvent);
+ encodings.push_back(pseudoEncodingExtendedMouseButtons);
if (Decoder::supported(preferredEncoding)) {
encodings.push_back(preferredEncoding);
diff --git a/common/rfb/CMsgHandler.cxx b/common/rfb/CMsgHandler.cxx
index 4489dbd4..0f3f6cd5 100644
--- a/common/rfb/CMsgHandler.cxx
+++ b/common/rfb/CMsgHandler.cxx
@@ -75,6 +75,11 @@ void CMsgHandler::endOfContinuousUpdates()
server.supportsContinuousUpdates = true;
}
+void CMsgHandler::supportsExtendedMouseButtons()
+{
+ server.supportsExtendedMouseButtons = true;
+}
+
void CMsgHandler::supportsQEMUKeyEvent()
{
server.supportsQEMUKeyEvent = true;
diff --git a/common/rfb/CMsgHandler.h b/common/rfb/CMsgHandler.h
index 9e5f7de2..b484b695 100644
--- a/common/rfb/CMsgHandler.h
+++ b/common/rfb/CMsgHandler.h
@@ -57,6 +57,7 @@ namespace rfb {
virtual void fence(uint32_t flags, unsigned len, const uint8_t data[]);
virtual void endOfContinuousUpdates();
virtual void supportsQEMUKeyEvent();
+ virtual void supportsExtendedMouseButtons();
virtual void serverInit(int width, int height,
const PixelFormat& pf,
const char* name) = 0;
diff --git a/common/rfb/CMsgReader.cxx b/common/rfb/CMsgReader.cxx
index 8bcdbfd0..d7cbc2fd 100644
--- a/common/rfb/CMsgReader.cxx
+++ b/common/rfb/CMsgReader.cxx
@@ -202,6 +202,10 @@ bool CMsgReader::readMsg()
handler->supportsQEMUKeyEvent();
ret = true;
break;
+ case pseudoEncodingExtendedMouseButtons:
+ handler->supportsExtendedMouseButtons();
+ ret = true;
+ break;
default:
ret = readRect(dataRect, rectEncoding);
break;
diff --git a/common/rfb/CMsgWriter.cxx b/common/rfb/CMsgWriter.cxx
index 1bd8040f..8c379d66 100644
--- a/common/rfb/CMsgWriter.cxx
+++ b/common/rfb/CMsgWriter.cxx
@@ -22,6 +22,7 @@
#endif
#include <stdio.h>
+#include <assert.h>
#include <rdr/OutStream.h>
#include <rdr/MemOutStream.h>
@@ -173,18 +174,47 @@ void CMsgWriter::writeKeyEvent(uint32_t keysym, uint32_t keycode, bool down)
}
-void CMsgWriter::writePointerEvent(const Point& pos, uint8_t buttonMask)
+void CMsgWriter::writePointerEvent(const Point& pos, uint16_t buttonMask)
{
Point p(pos);
+ bool extendedMouseButtons;
+
if (p.x < 0) p.x = 0;
if (p.y < 0) p.y = 0;
if (p.x >= server->width()) p.x = server->width() - 1;
if (p.y >= server->height()) p.y = server->height() - 1;
+ /* The highest bit in buttonMask is never sent to the server */
+ assert(!(buttonMask & 0x8000));
+
+ /* Only send extended pointerEvent message when needed */
+ extendedMouseButtons = buttonMask & 0x7f80;
+
startMsg(msgTypePointerEvent);
- os->writeU8(buttonMask);
- os->writeU16(p.x);
- os->writeU16(p.y);
+ if (server->supportsExtendedMouseButtons && extendedMouseButtons) {
+ int higherBits;
+ int lowerBits;
+
+ higherBits = (buttonMask >> 7) & 0xff;
+ assert(!(higherBits & 0xfc)); /* Bits 2-7 are reserved */
+
+ lowerBits = buttonMask & 0x7f;
+ lowerBits |= 0x80; /* Set marker bit to 1 */
+
+ os->writeU8(lowerBits);
+ os->writeU16(p.x);
+ os->writeU16(p.y);
+ os->writeU8(higherBits);
+ } else {
+ /* Marker bit must be set to 0, otherwise the server might confuse
+ * the marker bit with the highest bit in a normal PointerEvent
+ * message.
+ */
+ buttonMask &= 0x7f;
+ os->writeU8(buttonMask);
+ os->writeU16(p.x);
+ os->writeU16(p.y);
+ }
endMsg();
}
diff --git a/common/rfb/CMsgWriter.h b/common/rfb/CMsgWriter.h
index 61df567f..9cb4adec 100644
--- a/common/rfb/CMsgWriter.h
+++ b/common/rfb/CMsgWriter.h
@@ -54,7 +54,7 @@ namespace rfb {
void writeFence(uint32_t flags, unsigned len, const uint8_t data[]);
void writeKeyEvent(uint32_t keysym, uint32_t keycode, bool down);
- void writePointerEvent(const Point& pos, uint8_t buttonMask);
+ void writePointerEvent(const Point& pos, uint16_t buttonMask);
void writeClientCutText(const char* str);
diff --git a/common/rfb/ServerParams.cxx b/common/rfb/ServerParams.cxx
index 9f6f5307..7c596036 100644
--- a/common/rfb/ServerParams.cxx
+++ b/common/rfb/ServerParams.cxx
@@ -32,7 +32,7 @@ ServerParams::ServerParams()
: majorVersion(0), minorVersion(0),
supportsQEMUKeyEvent(false),
supportsSetDesktopSize(false), supportsFence(false),
- supportsContinuousUpdates(false),
+ supportsContinuousUpdates(false), supportsExtendedMouseButtons(false),
width_(0), height_(0),
ledState_(ledUnknown)
{
diff --git a/common/rfb/ServerParams.h b/common/rfb/ServerParams.h
index 791e3e7f..d730b891 100644
--- a/common/rfb/ServerParams.h
+++ b/common/rfb/ServerParams.h
@@ -79,6 +79,7 @@ namespace rfb {
bool supportsSetDesktopSize;
bool supportsFence;
bool supportsContinuousUpdates;
+ bool supportsExtendedMouseButtons;
private: