]> source.dussan.org Git - tigervnc.git/commitdiff
Fix for initial client side cursor
authorPierre Ossman <ossman@cendio.se>
Thu, 16 Nov 2017 15:40:44 +0000 (16:40 +0100)
committerPierre Ossman <ossman@cendio.se>
Fri, 17 Nov 2017 07:06:30 +0000 (08:06 +0100)
Improve the tracking of what cursor we've sent to the client to make
sure the initial cursor is sent properly. We previously tried to infer
this information based on if we've rendered a server side cursor or
not. This logic broke down if things triggered before we've sent the
first update to the client.

common/rfb/VNCSConnectionST.cxx
common/rfb/VNCSConnectionST.h

index 0e97a78471ec2215bef45465a7dce01bedac9fbc..6a3e1c7de2f97c504e2791046168c9976943ac7c 100644 (file)
@@ -80,6 +80,7 @@ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s,
     server(server_), updates(false),
     updateRenderedCursor(false), removeRenderedCursor(false),
     continuousUpdates(false), encodeManager(this), pointerEventTime(0),
+    clientHasCursor(false),
     accessRights(AccessDefault), startTime(time(0))
 {
   setStreams(&sock->inStream(), &sock->outStream());
@@ -379,9 +380,9 @@ void VNCSConnectionST::renderedCursorChange()
 {
   if (state() != RFBSTATE_NORMAL) return;
   // Are we switching between client-side and server-side cursor?
-  bool hasRenderedCursor = !damagedCursorRegion.is_empty();
-  if (hasRenderedCursor != needRenderedCursor())
+  if (clientHasCursor == needRenderedCursor())
     setCursorOrClose();
+  bool hasRenderedCursor = !damagedCursorRegion.is_empty();
   if (hasRenderedCursor)
     removeRenderedCursor = true;
   if (needRenderedCursor()) {
@@ -1256,10 +1257,13 @@ void VNCSConnectionST::setCursor()
     return;
 
   // We need to blank out the client's cursor or there will be two
-  if (needRenderedCursor())
+  if (needRenderedCursor()) {
     cp.setCursor(emptyCursor);
-  else
+    clientHasCursor = false;
+  } else {
     cp.setCursor(*server->cursor);
+    clientHasCursor = true;
+  }
 
   if (!writer()->writeSetCursorWithAlpha()) {
     if (!writer()->writeSetCursor()) {
index 42eb85adec9af8f13723d418dc8f82d0cbd6071f..8d6a7bc6a1643cf53dc677a8a1acfac7969fc1b3 100644 (file)
@@ -215,6 +215,7 @@ namespace rfb {
     time_t lastEventTime;
     time_t pointerEventTime;
     Point pointerEventPos;
+    bool clientHasCursor;
 
     AccessRights accessRights;