From 7e6d5c65eb90a567b665965643f3c874cb4a1658 Mon Sep 17 00:00:00 2001 From: dscho Date: Sun, 28 Jul 2002 16:45:16 +0000 Subject: [PATCH] NewFB encoding added --- CHANGES | 1 + classes/VncViewer.jar | Bin 36406 -> 37317 bytes classes/index.vnc | 3 +- example.c | 42 +++++++++-- httpd.c | 2 + main.c | 161 ++++++++++++++++++++++++++++++++---------- rfb.h | 18 +++-- rfbproto.h | 1 + rfbserver.c | 62 ++++++++++++++++ stats.c | 2 +- 10 files changed, 246 insertions(+), 46 deletions(-) diff --git a/CHANGES b/CHANGES index 8767a12..bba61b9 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,4 @@ + support for NewFB from Const Kaplinsky memory leaks squashed (localtime pseudo leak is still there :-) small improvements for OSXvnc (still not working correctly) synced with TightVNC 1.2.3 diff --git a/classes/VncViewer.jar b/classes/VncViewer.jar index ac3586503c3e0c2d90bffb7ebf87b29d5795d36b..cf4c1240f09737ea889b38df867d4c1d326b633c 100644 GIT binary patch delta 28720 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 delta 27802 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 j7mWYR|9eMc6|Wyl`adP^$KRYs`}nL_GT55%f0O $USER's $DESKTOP desktop ($DISPLAY) - +
www.TightVNC.com diff --git a/example.c b/example.c index 01ec504..2100b41 100644 --- a/example.c +++ b/example.c @@ -34,7 +34,8 @@ #include "rfb.h" #include "keysym.h" -const int maxx=640, maxy=480, bpp=4; +const int bpp=4; +int maxx=800, maxy=600; /* TODO: odd maxx doesn't work (vncviewer bug) */ /* This initializes a nice (?) background */ @@ -74,6 +75,23 @@ enum rfbNewClientAction newclient(rfbClientPtr cl) return RFB_CLIENT_ACCEPT; } +/* switch to new framebuffer contents */ + +void newframebuffer(rfbScreenInfoPtr screen, int width, int height) +{ + char *oldfb, *newfb; + + maxx = width; + maxy = height; + oldfb = screen->frameBuffer; + newfb = (char*)malloc(maxx * maxy * bpp); + initBuffer(newfb); + rfbNewFramebuffer(screen, newfb, maxx, maxy, 8, 3, bpp); + free(oldfb); + + /*** FIXME: Re-install cursor. ***/ +} + /* aux function to draw a line */ void drawline(unsigned char* buffer,int rowstride,int bpp,int x1,int y1,int x2,int y2) @@ -158,6 +176,22 @@ void dokey(Bool down,KeySym key,rfbClientPtr cl) rfbUndrawCursor(cl->screen); initBuffer(cl->screen->frameBuffer); rfbMarkRectAsModified(cl->screen,0,0,maxx,maxy); + } else if (key == XK_Up) { + if (maxx < 1024) { + if (maxx < 800) { + newframebuffer(cl->screen, 800, 600); + } else { + newframebuffer(cl->screen, 1024, 768); + } + } + } else if(key==XK_Down) { + if (maxx > 640) { + if (maxx > 800) { + newframebuffer(cl->screen, 800, 600); + } else { + newframebuffer(cl->screen, 640, 480); + } + } } else if(key>=' ' && key<0x100) { ClientData* cd=cl->clientData; int x1=cd->oldx,y1=cd->oldy,x2,y2; @@ -266,7 +300,7 @@ int main(int argc,char** argv) #ifdef USE_OWN_LOOP { int i; - for(i=0;i<200;i++) { + for(i=0;;i++) { fprintf(stderr,"%d\r",i); rfbProcessEvents(rfbScreen,100000); } @@ -275,7 +309,7 @@ int main(int argc,char** argv) #ifndef BACKGROUND_LOOP_TEST /* this is the blocking event loop, i.e. it never returns */ - /* 40000 are the microseconds, i.e. 0.04 seconds */ + /* 40000 are the microseconds to wait on select(), i.e. 0.04 seconds */ rfbRunEventLoop(rfbScreen,40000,FALSE); #elif !defined(HAVE_PTHREADS) #error "I need pthreads for that." @@ -283,7 +317,7 @@ int main(int argc,char** argv) /* this is the non-blocking event loop; a background thread is started */ rfbRunEventLoop(rfbScreen,-1,TRUE); - /* now we could do some cool things like rendering */ + /* now we could do some cool things like rendering in idle time */ while(1) sleep(5); /* render(); */ #endif diff --git a/httpd.c b/httpd.c index 8f6aa01..813b239 100644 --- a/httpd.c +++ b/httpd.c @@ -218,6 +218,8 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen) fname = &fullFname[strlen(fullFname)]; maxFnameLen = 255 - strlen(fullFname); + buf_filled=0; + /* Read data from the HTTP client until we get a complete request. */ while (1) { ssize_t got = read (rfbScreen->httpSock, buf + buf_filled, diff --git a/main.c b/main.c index f1f800a..ea2eeb9 100644 --- a/main.c +++ b/main.c @@ -468,12 +468,57 @@ enum rfbNewClientAction defaultNewClientHook(rfbClientPtr cl) return RFB_CLIENT_ACCEPT; } +/* + * Update server's pixel format in rfbScreenInfo structure. This + * function is called from rfbGetScreen() and rfbNewFramebuffer(). + */ + +static void rfbInitServerFormat(rfbScreenInfoPtr rfbScreen, int bitsPerSample) +{ + rfbPixelFormat* format=&rfbScreen->rfbServerFormat; + + format->bitsPerPixel = rfbScreen->bitsPerPixel; + format->depth = rfbScreen->depth; + format->bigEndian = rfbEndianTest?FALSE:TRUE; + format->trueColour = TRUE; + rfbScreen->colourMap.count = 0; + rfbScreen->colourMap.is16 = 0; + rfbScreen->colourMap.data.bytes = NULL; + + if (format->bitsPerPixel == 8) { + format->redMax = 7; + format->greenMax = 7; + format->blueMax = 3; + format->redShift = 0; + format->greenShift = 3; + format->blueShift = 6; + } else { + format->redMax = (1 << bitsPerSample) - 1; + format->greenMax = (1 << bitsPerSample) - 1; + format->blueMax = (1 << bitsPerSample) - 1; + if(rfbEndianTest) { + format->redShift = 0; + format->greenShift = bitsPerSample; + format->blueShift = bitsPerSample * 2; + } else { + if(format->bitsPerPixel==8*3) { + format->redShift = bitsPerSample*2; + format->greenShift = bitsPerSample*1; + format->blueShift = 0; + } else { + format->redShift = bitsPerSample*3; + format->greenShift = bitsPerSample*2; + format->blueShift = bitsPerSample; + } + } + } +} + rfbScreenInfoPtr rfbGetScreen(int* argc,char** argv, int width,int height,int bitsPerSample,int samplesPerPixel, int bytesPerPixel) { rfbScreenInfoPtr rfbScreen=malloc(sizeof(rfbScreenInfo)); - rfbPixelFormat* format=&rfbScreen->rfbServerFormat; INIT_MUTEX(logMutex); @@ -530,41 +575,7 @@ rfbScreenInfoPtr rfbGetScreen(int* argc,char** argv, /* format */ - format->bitsPerPixel = rfbScreen->bitsPerPixel; - format->depth = rfbScreen->depth; - format->bigEndian = rfbEndianTest?FALSE:TRUE; - format->trueColour = TRUE; - rfbScreen->colourMap.count = 0; - rfbScreen->colourMap.is16 = 0; - rfbScreen->colourMap.data.bytes = NULL; - - if(bytesPerPixel == 1) { - format->redMax = 7; - format->greenMax = 7; - format->blueMax = 3; - format->redShift = 0; - format->greenShift = 3; - format->blueShift = 6; - } else { - format->redMax = (1 << bitsPerSample) - 1; - format->greenMax = (1 << bitsPerSample) - 1; - format->blueMax = (1 << bitsPerSample) - 1; - if(rfbEndianTest) { - format->redShift = 0; - format->greenShift = bitsPerSample; - format->blueShift = bitsPerSample * 2; - } else { - if(bytesPerPixel==3) { - format->redShift = bitsPerSample*2; - format->greenShift = bitsPerSample*1; - format->blueShift = 0; - } else { - format->redShift = bitsPerSample*3; - format->greenShift = bitsPerSample*2; - format->blueShift = bitsPerSample; - } - } - } + rfbInitServerFormat(rfbScreen, bitsPerSample); /* cursor */ @@ -597,6 +608,84 @@ rfbScreenInfoPtr rfbGetScreen(int* argc,char** argv, return(rfbScreen); } +/* + * Switch to another framebuffer (maybe of different size and color + * format). Clients supporting NewFBSize pseudo-encoding will change + * their local framebuffer dimensions if necessary. + * NOTE: Rich cursor data should be converted to new pixel format by + * the caller. + */ + +void rfbNewFramebuffer(rfbScreenInfoPtr rfbScreen, char *framebuffer, + int width, int height, + int bitsPerSample, int samplesPerPixel, + int bytesPerPixel) +{ + rfbPixelFormat old_format; + Bool format_changed = FALSE; + rfbClientIteratorPtr iterator; + rfbClientPtr cl; + + /* Remove the pointer */ + + rfbUndrawCursor(rfbScreen); + + /* Update information in the rfbScreenInfo structure */ + + old_format = rfbScreen->rfbServerFormat; + + if (width & 3) + rfbLog("WARNING: New width (%d) is not a multiple of 4.\n", width); + + rfbScreen->width = width; + rfbScreen->height = height; + rfbScreen->bitsPerPixel = rfbScreen->depth = 8*bytesPerPixel; + rfbScreen->paddedWidthInBytes = width*bytesPerPixel; + + rfbInitServerFormat(rfbScreen, bitsPerSample); + + if (memcmp(&rfbScreen->rfbServerFormat, &old_format, + sizeof(rfbPixelFormat)) != 0) { + format_changed = TRUE; + } + + rfbScreen->frameBuffer = framebuffer; + + /* Adjust pointer position if necessary */ + + if (rfbScreen->cursorX >= width) + rfbScreen->cursorX = width - 1; + if (rfbScreen->cursorY >= height) + rfbScreen->cursorY = height - 1; + + /* For each client: */ + iterator = rfbGetClientIterator(rfbScreen); + while ((cl = rfbClientIteratorNext(iterator)) != NULL) { + + /* Re-install color translation tables if necessary */ + + if (format_changed) + rfbScreen->setTranslateFunction(cl); + + /* Mark the screen contents as changed, and schedule sending + NewFBSize message if supported by this client. */ + + LOCK(cl->updateMutex); + sraRgnDestroy(cl->modifiedRegion); + cl->modifiedRegion = sraRgnCreateRect(0, 0, width, height); + sraRgnMakeEmpty(cl->copyRegion); + cl->copyDX = 0; + cl->copyDY = 0; + + if (cl->useNewFBSize) + cl->newFBSizePending = TRUE; + + TSIGNAL(cl->updateCond); + UNLOCK(cl->updateMutex); + } + rfbReleaseClientIterator(iterator); +} + void rfbScreenCleanup(rfbScreenInfoPtr rfbScreen) { rfbClientIteratorPtr i=rfbGetClientIterator(rfbScreen); diff --git a/rfb.h b/rfb.h index 7c7121c..98dc004 100644 --- a/rfb.h +++ b/rfb.h @@ -503,8 +503,12 @@ typedef struct _rfbClientRec { Bool enableCursorShapeUpdates; /* client supports cursor shape updates */ Bool useRichCursorEncoding; /* rfbEncodingRichCursor is preferred */ Bool cursorWasChanged; /* cursor shape update should be sent */ + + Bool useNewFBSize; /* client supports NewFBSize encoding */ + Bool newFBSizePending; /* framebuffer size was changed */ + #ifdef BACKCHANNEL - Bool enableBackChannel; + Bool enableBackChannel; /* custom channel for special clients */ #endif struct _rfbClientRec *prev; @@ -532,9 +536,10 @@ typedef struct _rfbClientRec { * be sent to the client. */ -#define FB_UPDATE_PENDING(cl) \ - ((!(cl)->enableCursorShapeUpdates && !(cl)->screen->cursorIsDrawn) || \ - ((cl)->enableCursorShapeUpdates && (cl)->cursorWasChanged) || \ +#define FB_UPDATE_PENDING(cl) \ + ((!(cl)->enableCursorShapeUpdates && !(cl)->screen->cursorIsDrawn) || \ + ((cl)->enableCursorShapeUpdates && (cl)->cursorWasChanged) || \ + ((cl)->useNewFBSize && (cl)->newFBSizePending) || \ !sraRgnEmpty((cl)->copyRegion) || !sraRgnEmpty((cl)->modifiedRegion)) /* @@ -603,6 +608,7 @@ extern Bool rfbSendUpdateBuf(rfbClientPtr cl); extern void rfbSendServerCutText(rfbScreenInfoPtr rfbScreen,char *str, int len); extern Bool rfbSendCopyRegion(rfbClientPtr cl,sraRegionPtr reg,int dx,int dy); extern Bool rfbSendLastRectMarker(rfbClientPtr cl); +extern Bool rfbSendNewFBSize(rfbClientPtr cl, int w, int h); extern Bool rfbSendSetColourMapEntries(rfbClientPtr cl, int firstColour, int nColours); extern void rfbSendBell(rfbScreenInfoPtr rfbScreen); @@ -796,6 +802,10 @@ extern rfbScreenInfoPtr rfbGetScreen(int* argc,char** argv, int width,int height,int bitsPerSample,int samplesPerPixel, int bytesPerPixel); extern void rfbInitServer(rfbScreenInfoPtr rfbScreen); +extern void rfbNewFramebuffer(rfbScreenInfoPtr rfbScreen,char *framebuffer, + int width,int height, int bitsPerSample,int samplesPerPixel, + int bytesPerPixel); + extern void rfbScreenCleanup(rfbScreenInfoPtr screenInfo); /* functions to accept/refuse a client that has been put on hold diff --git a/rfbproto.h b/rfbproto.h index 6ea6a62..f839019 100644 --- a/rfbproto.h +++ b/rfbproto.h @@ -328,6 +328,7 @@ typedef struct { #define rfbEncodingRichCursor 0xFFFFFF11 #define rfbEncodingLastRect 0xFFFFFF20 +#define rfbEncodingNewFBSize 0xFFFFFF21 #define rfbEncodingQualityLevel0 0xFFFFFFE0 #define rfbEncodingQualityLevel1 0xFFFFFFE1 diff --git a/rfbserver.c b/rfbserver.c index 11aeff6..f2dfada 100644 --- a/rfbserver.c +++ b/rfbserver.c @@ -266,6 +266,7 @@ rfbNewTCPOrUDPClient(rfbScreen,sock,isUDP) cl->enableCursorShapeUpdates = FALSE; cl->useRichCursorEncoding = FALSE; cl->enableLastRectEncoding = FALSE; + cl->useNewFBSize = FALSE; cl->compStreamInited = FALSE; cl->compStream.total_in = 0; @@ -663,6 +664,7 @@ rfbProcessClientNormalMessage(cl) cl->useCopyRect = FALSE; cl->enableCursorShapeUpdates = FALSE; cl->enableLastRectEncoding = FALSE; + cl->useNewFBSize = FALSE; for (i = 0; i < msg.se.nEncodings; i++) { if ((n = ReadExact(cl, (char *)&enc, 4)) <= 0) { @@ -742,6 +744,13 @@ rfbProcessClientNormalMessage(cl) cl->enableLastRectEncoding = TRUE; } break; + case rfbEncodingNewFBSize: + if (!cl->useNewFBSize) { + rfbLog("Enabling NewFBSize protocol extension for client " + "%s\n", cl->host); + cl->useNewFBSize = TRUE; + } + break; #ifdef BACKCHANNEL case rfbEncodingBackChannel: if (!cl->enableBackChannel) { @@ -924,6 +933,25 @@ rfbSendFramebufferUpdate(cl, givenUpdateRegion) if(cl->screen->displayHook) cl->screen->displayHook(cl); + + /* + * If framebuffer size was changed and the client supports NewFBSize + * encoding, just send NewFBSize marker and return. + */ + + if (cl->useNewFBSize && cl->newFBSizePending) { + LOCK(cl->updateMutex); + cl->newFBSizePending = FALSE; + UNLOCK(cl->updateMutex); + cl->rfbFramebufferUpdateMessagesSent++; + fu->type = rfbFramebufferUpdate; + fu->nRects = Swap16IfLE(1); + cl->ublen = sz_rfbFramebufferUpdateMsg; + if (!rfbSendNewFBSize(cl, cl->screen->width, cl->screen->height)) { + return FALSE; + } + return rfbSendUpdateBuf(cl); + } /* * If this client understands cursor shape updates, cursor should be @@ -1309,6 +1337,40 @@ rfbSendLastRectMarker(cl) } +/* + * Send NewFBSize pseudo-rectangle. This tells the client to change + * its framebuffer size. + */ + +Bool +rfbSendNewFBSize(cl, w, h) + rfbClientPtr cl; + int w, h; +{ + rfbFramebufferUpdateRectHeader rect; + + if (cl->ublen + sz_rfbFramebufferUpdateRectHeader > UPDATE_BUF_SIZE) { + if (!rfbSendUpdateBuf(cl)) + return FALSE; + } + + rect.encoding = Swap32IfLE(rfbEncodingNewFBSize); + rect.r.x = 0; + rect.r.y = 0; + rect.r.w = Swap16IfLE(w); + rect.r.h = Swap16IfLE(h); + + memcpy(&cl->updateBuf[cl->ublen], (char *)&rect, + sz_rfbFramebufferUpdateRectHeader); + cl->ublen += sz_rfbFramebufferUpdateRectHeader; + + cl->rfbLastRectMarkersSent++; + cl->rfbLastRectBytesSent += sz_rfbFramebufferUpdateRectHeader; + + return TRUE; +} + + /* * Send the contents of cl->updateBuf. Returns 1 if successful, -1 if * not (errno should be set). diff --git a/stats.c b/stats.c index 7774d2f..a0b5ccc 100644 --- a/stats.c +++ b/stats.c @@ -78,7 +78,7 @@ rfbPrintStats(rfbClientPtr cl) totalBytesSent); if (cl->rfbLastRectMarkersSent != 0) - rfbLog(" LastRect markers %d, bytes %d\n", + rfbLog(" LastRect and NewFBSize markers %d, bytes %d\n", cl->rfbLastRectMarkersSent, cl->rfbLastRectBytesSent); if (cl->rfbCursorUpdatesSent != 0)