diff options
-rw-r--r-- | CHANGES | 2 | ||||
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | TODO | 7 | ||||
-rw-r--r-- | main.c | 80 | ||||
-rw-r--r-- | rfb.h | 11 | ||||
-rw-r--r-- | rfbserver.c | 5 |
6 files changed, 96 insertions, 13 deletions
@@ -1,4 +1,6 @@ 0.2 + flag backgroundLoop in rfbScreenInfo + rfbCopyRect & rfbCopyRegion (really copies rectangle in frameBuffer) added flag to optionally not send XCursor updates. fixed java viewer on server side: SendCursorUpdate would send data even before the client pixel format @@ -2,8 +2,8 @@ INCLUDES=-I. VNCSERVERLIB=-L. -lvncserver -L/usr/local/lib -lz -ljpeg # Uncomment these two lines to enable use of PThreads -PTHREADDEF = -DHAVE_PTHREADS -PTHREADLIB = -lpthread +#PTHREADDEF = -DHAVE_PTHREADS +#PTHREADLIB = -lpthread # Comment the following line to disable the use of 3 Bytes/Pixel. # The code for 3 Bytes/Pixel is not very efficient! @@ -1,10 +1,13 @@ immediate: ---------- +copyRect and pthreads possible problem. +authentification schemes (secure vnc) udp documentation - perhaps the option (or just hint) not to mark very tiny regions as - modified, because that is inefficient for the encodings. + hint that to mark very tiny regions as + modified is possibly inefficient for the encodings. + (a trail of points could be better a small rectangle). later: ------ @@ -23,9 +23,6 @@ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> -#ifdef HAVE_PTHREADS -#include <pthread.h> -#endif #include <unistd.h> #include <signal.h> #include <time.h> @@ -33,9 +30,7 @@ #include "rfb.h" #include "sraRegion.h" -#ifdef HAVE_PTHREADS MUTEX(logMutex); -#endif /* * rfbLog prints a time-stamped message to the log file (stderr). @@ -67,6 +62,77 @@ void rfbLogPerror(char *str) rfbLog("%s: %s\n", str, strerror(errno)); } +void rfbScheduleCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,int dx,int dy) +{ + rfbClientIteratorPtr iterator; + rfbClientPtr cl; + + 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; + } else { + sraRgnOr(cl->modifiedRegion,copyRegion); + } + SIGNAL(cl->updateCond); + UNLOCK(cl->updateMutex); + } + + rfbReleaseClientIterator(iterator); +} + +void rfbDoCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,int dx,int dy) +{ + sraRectangleIterator* i; + sraRect rect; + int j,widthInBytes,bpp=rfbScreen->rfbServerFormat.bitsPerPixel/8, + rowstride=rfbScreen->paddedWidthInBytes; + char *in,*out; + + /* copy it, really */ + i = sraRgnGetReverseIterator(copyRegion,dx<0,dy<0); + while(sraRgnIteratorNext(i,&rect)) { + widthInBytes = (rect.x2-rect.x1)*bpp; + out = rfbScreen->frameBuffer+rect.x1*bpp+rect.y1*rowstride; + in = rfbScreen->frameBuffer+(rect.x1-dx)*bpp+(rect.y1-dy)*rowstride; + if(dy<0) + for(j=rect.y1;j<rect.y2;j++,out+=rowstride,in+=rowstride) + memmove(out,in,widthInBytes); + else { + out += rowstride*(rect.y2-rect.y1-1); + in += rowstride*(rect.y2-rect.y1-1); + for(j=rect.y2-1;j>=rect.y1;j--,out-=rowstride,in-=rowstride) + memmove(out,in,widthInBytes); + } + } + + rfbScheduleCopyRegion(rfbScreen,copyRegion,dx,dy); +} + +void rfbDoCopyRect(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2,int dx,int dy) +{ + sraRegionPtr region = sraRgnCreateRect(x1,y1,x2,y2); + rfbDoCopyRegion(rfbScreen,region,dx,dy); +} + +void rfbScheduleCopyRect(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2,int dx,int dy) +{ + sraRegionPtr region = sraRgnCreateRect(x1,y1,x2,y2); + rfbScheduleCopyRegion(rfbScreen,region,dx,dy); +} void rfbMarkRegionAsModified(rfbScreenInfoPtr rfbScreen,sraRegionPtr modRegion) { @@ -395,6 +461,8 @@ rfbScreenInfoPtr rfbGetScreen(int argc,char** argv, rfbScreen->cursor = &myCursor; INIT_MUTEX(rfbScreen->cursorMutex); + IF_PTHREADS(rfbScreen->backgroundLoop = FALSE); + /* proc's and hook's */ rfbScreen->kbdAddEvent = defaultKbdAddEvent; @@ -456,6 +524,8 @@ void rfbRunEventLoop(rfbScreenInfoPtr rfbScreen, long usec, Bool runInBackground #ifdef HAVE_PTHREADS pthread_t listener_thread; + rfbScreen->backgroundLoop = TRUE; + pthread_create(&listener_thread, NULL, listenerRun, rfbScreen); return; #else @@ -118,7 +118,7 @@ int max(int,int); #define MUTEX(mutex) #define INIT_MUTEX(mutex) #define TINI_MUTEX(mutex) -#define SIGNAL(cond) this_is_unsupported +#define SIGNAL(cond) #define WAIT(cond,mutex) this_is_unsupported #define COND(cond) #define INIT_COND(cond) @@ -256,6 +256,8 @@ typedef struct struct rfbCursor* cursor; MUTEX(cursorMutex); + IF_PTHREADS(Bool backgroundLoop); + /* the following members have to be supplied by the serving process */ char* frameBuffer; KbdAddEventProcPtr kbdAddEvent; @@ -516,7 +518,12 @@ static const int rfbEndianTest = (_BYTE_ORDER == _LITTLE_ENDIAN); extern void rfbLog(char *format, ...); extern void rfbLogPerror(char *str); -extern int runVNCServer(int argc, char *argv[]); + +void rfbScheduleCopyRect(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2,int dx,int dy); +void rfbScheduleCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,int dx,int dy); + +void rfbDoCopyRect(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2,int dx,int dy); +void rfbDoCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,int dx,int dy); /* sockets.c */ diff --git a/rfbserver.c b/rfbserver.c index 2695170..5266e5a 100644 --- a/rfbserver.c +++ b/rfbserver.c @@ -225,7 +225,7 @@ rfbNewClient(rfbScreen,sock) LOCK(rfbClientListMutex); - cl->refCount = 0; + IF_PTHREADS(cl->refCount = 0); cl->next = rfbScreen->rfbClientHead; cl->prev = NULL; if (rfbScreen->rfbClientHead) @@ -834,6 +834,7 @@ rfbProcessClientNormalMessage(cl) /* * rfbSendFramebufferUpdate - send the currently pending framebuffer update to * the RFB client. + * givenUpdateRegion is not changed. */ Bool @@ -1112,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; |