summaryrefslogtreecommitdiffstats
path: root/libvncserver
diff options
context:
space:
mode:
authordscho <dscho>2004-06-07 11:43:00 +0000
committerdscho <dscho>2004-06-07 11:43:00 +0000
commitfefcb9188a0810577ee8d17a384af19c39d8a49e (patch)
tree7dfa2bb0b08c235324f0d31be13b1f17aaf3c2ad /libvncserver
parentfc45b97d6503cf7fc72cdacd4611055c5554e77c (diff)
downloadlibtdevnc-fefcb9188a0810577ee8d17a384af19c39d8a49e.tar.gz
libtdevnc-fefcb9188a0810577ee8d17a384af19c39d8a49e.zip
fix cursor trails (when not using cursor encoding and moving the cursor,
the redrawn part of the screen didn't get updated, and so left cursor trails).
Diffstat (limited to 'libvncserver')
-rw-r--r--libvncserver/cursor.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/libvncserver/cursor.c b/libvncserver/cursor.c
index 4f290da..9f8f9d6 100644
--- a/libvncserver/cursor.c
+++ b/libvncserver/cursor.c
@@ -390,7 +390,7 @@ void rfbUndrawCursor(rfbScreenInfoPtr s)
int j,x1,x2,y1,y2,bpp=s->rfbServerFormat.bitsPerPixel/8,
rowstride=s->paddedWidthInBytes;
LOCK(s->cursorMutex);
- if(!s->cursorIsDrawn) {
+ if(!s->cursorIsDrawn || !c) {
UNLOCK(s->cursorMutex);
return;
}
@@ -421,6 +421,8 @@ void rfbUndrawCursor(rfbScreenInfoPtr s)
/* rfbMarkRectAsModified(s,x1,y1,x1+x2,y1+y2); */
s->cursorIsDrawn = FALSE;
+ s->oldCursorX=s->cursorX;
+ s->oldCursorY=s->cursorY;
UNLOCK(s->cursorMutex);
}
@@ -431,7 +433,7 @@ void rfbDrawCursor(rfbScreenInfoPtr s)
rowstride=s->paddedWidthInBytes,
bufSize,w;
rfbBool wasChanged=FALSE;
-
+
if(!c) return;
LOCK(s->cursorMutex);
if(s->cursorIsDrawn) {
@@ -439,6 +441,13 @@ void rfbDrawCursor(rfbScreenInfoPtr s)
UNLOCK(s->cursorMutex);
return;
}
+
+ if(s->cursor && s->underCursorBuffer &&
+ (s->cursorX!=s->oldCursorX || s->cursorY!=s->oldCursorY)) {
+ int x1=s->oldCursorX-s->cursor->xhot,x2=x1+s->cursor->width;
+ int y1=s->oldCursorY-s->cursor->yhot,y2=y1+s->cursor->height;
+ rfbMarkRectAsModified(s,x1,y1,x2,y2);
+ }
bufSize=c->width*c->height*bpp;
w=(c->width+7)/8;
if(s->underCursorBufferLen<bufSize) {
@@ -518,6 +527,9 @@ void rfbSetCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr c,rfbBool freeOld)
LOCK(rfbScreen->cursorMutex);
}
+ free(rfbScreen->underCursorBuffer);
+ rfbScreen->underCursorBuffer=0;
+
if(rfbScreen->cursor && (freeOld || rfbScreen->cursor->cleanup))
rfbFreeCursor(rfbScreen->cursor);