diff options
-rw-r--r-- | CHANGES | 8 | ||||
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | cursor.c | 16 | ||||
-rw-r--r-- | example.c | 6 | ||||
-rw-r--r-- | main.c | 30 | ||||
-rw-r--r-- | rfb.h | 4 | ||||
-rw-r--r-- | rfbserver.c | 8 |
7 files changed, 38 insertions, 36 deletions
@@ -1,5 +1,11 @@ 0.2 - flag backgroundLoop in rfbScreenInfo + fixed CopyRect (was using the wrong order of rectangles...) + should also work with pthreads, because copyrects are + always sent immediately (so that two consecutive copy rects + cannot conflict). + changed rfbUndrawCursor(rfbClientPtr) to (rfbScreenInfoPtr), because + this makes more sense! + flag backgroundLoop in rfbScreenInfo (if having pthreads) rfbCopyRect & rfbCopyRegion (really copies rectangle in frameBuffer) added flag to optionally not send XCursor updates. fixed java viewer on server side: @@ -1,7 +1,7 @@ immediate: ---------- -copyRect and pthreads possible problem. +test copyRect and pthreads. authentification schemes (secure vnc) udp documentation @@ -331,9 +331,8 @@ void MakeRichCursorFromXCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr cursor) /* functions to draw/hide cursor directly in the frame buffer */ -void rfbUndrawCursor(rfbClientPtr cl) +void rfbUndrawCursor(rfbScreenInfoPtr s) { - rfbScreenInfoPtr s=cl->screen; rfbCursorPtr c=s->cursor; int j,x1,x2,y1,y2,bpp=s->rfbServerFormat.bitsPerPixel/8, rowstride=s->paddedWidthInBytes; @@ -372,9 +371,8 @@ void rfbUndrawCursor(rfbClientPtr cl) UNLOCK(s->cursorMutex); } -void rfbDrawCursor(rfbClientPtr cl) +void rfbDrawCursor(rfbScreenInfoPtr s) { - rfbScreenInfoPtr s=cl->screen; rfbCursorPtr c=s->cursor; int i,j,x1,x2,y1,y2,i1,j1,bpp=s->rfbServerFormat.bitsPerPixel/8, rowstride=s->paddedWidthInBytes, @@ -453,16 +451,8 @@ void rfbPrintXCursor(rfbCursorPtr cursor) extern void rfbSetCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr c,Bool freeOld) { - rfbClientIteratorPtr i = rfbGetClientIterator(rfbScreen); - rfbClientPtr cl; - LOCK(rfbScreen->cursorMutex); - - while((cl=rfbClientIteratorNext(i))) { - LOCK(cl->updateMutex); - rfbUndrawCursor(cl); - UNLOCK(cl->updateMutex); - } + rfbUndrawCursor(rfbScreen); if(freeOld && rfbScreen->cursor) rfbFreeCursor(rfbScreen->cursor); @@ -102,7 +102,7 @@ void doptr(int buttonMask,int x,int y,rfbClientPtr cl) ClientData* cd=cl->clientData; if(cl->screen->cursorIsDrawn) - rfbUndrawCursor(cl); + rfbUndrawCursor(cl->screen); if(x>=0 && y>=0 && x<maxx && y<maxy) { if(buttonMask) { @@ -149,14 +149,14 @@ void dokey(Bool down,KeySym key,rfbClientPtr cl) rfbCloseClient(cl); else if(key==XK_Page_Up) { if(cl->screen->cursorIsDrawn) - rfbUndrawCursor(cl); + rfbUndrawCursor(cl->screen); initBuffer(cl->screen->frameBuffer); rfbMarkRectAsModified(cl->screen,0,0,maxx,maxy); } else if(key>=' ' && key<0x100) { ClientData* cd=cl->clientData; int x1=cd->oldx,y1=cd->oldy,x2,y2; if(cl->screen->cursorIsDrawn) - rfbUndrawCursor(cl); + rfbUndrawCursor(cl->screen); cd->oldx+=rfbDrawChar(cl->screen,&radonFont,cd->oldx,cd->oldy,key,0xffffff); rfbFontBBox(&radonFont,key,&x1,&y1,&x2,&y2); rfbMarkRectAsModified(cl->screen,x1,y1,x2-1,y2-1); @@ -67,23 +67,29 @@ void rfbScheduleCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,in rfbClientIteratorPtr iterator; rfbClientPtr cl; - iterator=rfbGetClientIterator(rfbScreen); + rfbUndrawCursor(rfbScreen); + + iterator=rfbGetClientIterator(rfbScreen); while((cl=rfbClientIteratorNext(iterator))) { LOCK(cl->updateMutex); if(cl->useCopyRect) { - while(!sraRgnEmpty(cl->copyRegion) && (cl->copyDX!=dx || cl->copyDY!=dy)) { -#ifdef HAVE_PTHREADS - if(cl->screen->backgroundLoop) { - SIGNAL(cl->updateCond); - UNLOCK(cl->updateMutex); - LOCK(cl->updateMutex); - } else -#endif - rfbSendFramebufferUpdate(cl,cl->copyRegion); - } sraRgnOr(cl->copyRegion,copyRegion); cl->copyDX = dx; cl->copyDY = dy; + +#ifdef HAVE_PTHREADS + if(cl->screen->backgroundLoop) { + SIGNAL(cl->updateCond); + UNLOCK(cl->updateMutex); + LOCK(cl->updateMutex); + } else +#endif + { + sraRegionPtr updateRegion = sraRgnCreateRgn(cl->modifiedRegion); + sraRgnOr(updateRegion,cl->copyRegion); + rfbSendFramebufferUpdate(cl,updateRegion); + sraRgnDestroy(updateRegion); + } } else { sraRgnOr(cl->modifiedRegion,copyRegion); } @@ -332,7 +338,7 @@ defaultPtrAddEvent(int buttonMask, int x, int y, rfbClientPtr cl) { if(x!=cl->screen->cursorX || y!=cl->screen->cursorY) { if(cl->screen->cursorIsDrawn) - rfbUndrawCursor(cl); + rfbUndrawCursor(cl->screen); LOCK(cl->screen->cursorMutex); if(!cl->screen->cursorIsDrawn) { cl->screen->cursorX = x; @@ -667,8 +667,8 @@ extern char* rfbMakeMaskForXCursor(int width,int height,char* cursorString); extern void MakeXCursorFromRichCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr cursor); extern void MakeRichCursorFromXCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr cursor); extern void rfbFreeCursor(rfbCursorPtr cursor); -extern void rfbDrawCursor(rfbClientPtr cl); -extern void rfbUndrawCursor(rfbClientPtr cl); +extern void rfbDrawCursor(rfbScreenInfoPtr rfbScreen); +extern void rfbUndrawCursor(rfbScreenInfoPtr rfbScreen); extern void rfbSetCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr c,Bool freeOld); /* cursor handling for the pointer */ diff --git a/rfbserver.c b/rfbserver.c index 5266e5a..2460130 100644 --- a/rfbserver.c +++ b/rfbserver.c @@ -857,14 +857,14 @@ rfbSendFramebufferUpdate(cl, givenUpdateRegion) if (cl->enableCursorShapeUpdates) { if (cl->screen->cursorIsDrawn) { - rfbUndrawCursor(cl); + rfbUndrawCursor(cl->screen); } if (!cl->screen->cursorIsDrawn && cl->cursorWasChanged && cl->readyForSetColourMapEntries) sendCursorShape = TRUE; } else { if (!cl->screen->cursorIsDrawn) { - rfbDrawCursor(cl); + rfbDrawCursor(cl->screen); } } @@ -1093,7 +1093,7 @@ rfbSendCopyRegion(cl, reg, dx, dy) sraRectangleIterator* i; sraRect rect1; - i = sraRgnGetReverseIterator(reg,dx<0,dy<0); + i = sraRgnGetReverseIterator(reg,dx>0,dy>0); while(sraRgnIteratorNext(i,&rect1)) { x = rect1.x1; @@ -1113,7 +1113,7 @@ rfbSendCopyRegion(cl, reg, dx, dy) cr.srcX = Swap16IfLE(x - dx); cr.srcY = Swap16IfLE(y - dy); -fprintf(stderr,"sent copyrect (%d,%d) (%d,%d) (%d,%d)\n",x,y,w,h,x-dx,y-dy); + memcpy(&cl->updateBuf[cl->ublen], (char *)&cr, sz_rfbCopyRect); cl->ublen += sz_rfbCopyRect; |