diff options
author | dscho <dscho> | 2004-06-07 11:43:00 +0000 |
---|---|---|
committer | dscho <dscho> | 2004-06-07 11:43:00 +0000 |
commit | fefcb9188a0810577ee8d17a384af19c39d8a49e (patch) | |
tree | 7dfa2bb0b08c235324f0d31be13b1f17aaf3c2ad | |
parent | fc45b97d6503cf7fc72cdacd4611055c5554e77c (diff) | |
download | libvncserver-fefcb9188a0810577ee8d17a384af19c39d8a49e.zip libvncserver-fefcb9188a0810577ee8d17a384af19c39d8a49e.tar.gz |
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).
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | libvncserver/cursor.c | 16 | ||||
-rw-r--r-- | rfb/rfb.h | 2 |
4 files changed, 17 insertions, 4 deletions
@@ -1,4 +1,5 @@ 2004-06-07 Johannes E. Schindelin <Johannes.Schindelin@gmx.de> + * libvncserver/cursor.c, rfb/rfb.h: fix cursor trails * */Makefile.am: stop automake nagging * libvncclient/*, client_examples/*: streamline API, SDLvncviewer added * examples/, libvncclient/, test/: moved tests to test/ @@ -1,7 +1,6 @@ immediate: ---------- -cursor drawing does not get undone prior to sending TightVNC encoding!!! Regression!!! extra_bytes in rfbDrawCharWithClip. tested mouse buttons make copy rect, but text is not marked as mod. @@ -19,6 +18,7 @@ CORBA done: ----- +.cursor drawing does not get undone prior to sending .following two items overridden by RealVNC's idea: if there are too many rectangles (like >50), just use the bounding box. cursor drawing: set optional grain to mark bigger rectangles as drawn (else 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); @@ -248,7 +248,7 @@ typedef struct _rfbScreenInfo struct _rfbClientRec* rfbClientHead; /* cursor */ - int cursorX, cursorY,underCursorBufferLen; + int cursorX, cursorY,oldCursorX,oldCursorY,underCursorBufferLen; char* underCursorBuffer; rfbBool dontConvertRichCursorToXCursor; struct rfbCursor* cursor; |