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