From 71ca8d546baaf13cca282c840b6521a98078fb42 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Fri, 15 Sep 2017 11:03:12 +0200 Subject: [PATCH] Clear client cursor when switching to server side Otherwise the client can end up with two visible cursors. --- common/rfb/VNCSConnectionST.cxx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index 53dd364a..c92bdb46 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -64,6 +64,8 @@ struct RTTInfo { 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 @@ bool VNCSConnectionST::getComparerState() 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 @@ void VNCSConnectionST::setCursor() 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()) { -- 2.39.5