From: Pierre Ossman Date: Fri, 15 Sep 2017 09:03:12 +0000 (+0200) Subject: Clear client cursor when switching to server side X-Git-Tag: v1.8.90~117 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=71ca8d546baaf13cca282c840b6521a98078fb42;p=tigervnc.git 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 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()) {