Clear client cursor when switching to server side
Otherwise the client can end up with two visible cursors.
diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx
index 53dd364..c92bdb4 100644
--- a/common/rfb/VNCSConnectionST.cxx
+++ b/common/rfb/VNCSConnectionST.cxx
@@ -64,6 +64,8 @@
unsigned inFlight;
};
+static Cursor emptyCursor(0, 0, Point(0, 0), NULL);
+
VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s,
bool reverse)
: sock(s), reverseConnection(reverse),
@@ -357,6 +359,9 @@
void VNCSConnectionST::renderedCursorChange()
{
if (state() != RFBSTATE_NORMAL) return;
+ // Are we switching between client-side and server-side cursor?
+ if (damagedCursorRegion.is_empty() != needRenderedCursor())
+ setCursorOrClose();
if (!damagedCursorRegion.is_empty())
removeRenderedCursor = true;
if (needRenderedCursor()) {
@@ -1132,7 +1137,11 @@
if (state() != RFBSTATE_NORMAL)
return;
- cp.setCursor(*server->cursor);
+ // We need to blank out the client's cursor or there will be two
+ if (needRenderedCursor())
+ cp.setCursor(emptyCursor);
+ else
+ cp.setCursor(*server->cursor);
if (!writer()->writeSetCursorWithAlpha()) {
if (!writer()->writeSetCursor()) {