diff options
-rw-r--r-- | font.c | 5 | ||||
-rw-r--r-- | rfb.h | 3 | ||||
-rw-r--r-- | rfbproto.h | 1 | ||||
-rw-r--r-- | rfbserver.c | 35 | ||||
-rw-r--r-- | vncauth.c | 2 |
5 files changed, 31 insertions, 15 deletions
@@ -4,8 +4,8 @@ int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font, int x,int y,unsigned char c,Pixel col) { int i,j,width,height; - unsigned char d; unsigned char* data=font->data+font->metaData[c*5]; + unsigned char d=*data; int rowstride=rfbScreen->paddedWidthInBytes; int bpp=rfbScreen->rfbServerFormat.bitsPerPixel/8; char *colour=(char*)&col; @@ -49,8 +49,8 @@ int rfbDrawCharWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font, Pixel col,Pixel bcol) { int i,j,width,height; - unsigned char d; unsigned char* data=font->data+font->metaData[c*5]; + unsigned char d; int rowstride=rfbScreen->paddedWidthInBytes; int bpp=rfbScreen->rfbServerFormat.bitsPerPixel/8,extra_bytes=0; char* colour=(char*)&col; @@ -73,6 +73,7 @@ int rfbDrawCharWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font, if(y2<y+height) height-=y+height-y2; if(x2<x+width) { extra_bytes+=(x1+width)/8-(x+width-x2+7)/8; width-=x+width-x2; } + d=*data; for(j=y1;j<height;j++) { if((x1&7)!=0) d=data[-1]; /* TODO: check if in this case extra_bytes is correct! */ @@ -473,6 +473,9 @@ typedef struct rfbClientRec { Bool enableCursorShapeUpdates; /* client supports cursor shape updates */ Bool useRichCursorEncoding; /* rfbEncodingRichCursor is preferred */ Bool cursorWasChanged; /* cursor shape update should be sent */ +#ifdef BACKCHANNEL + Bool enableBackChannel; +#endif struct rfbClientRec *prev; struct rfbClientRec *next; @@ -610,6 +610,7 @@ typedef struct { #ifdef BACKCHANNEL typedef rfbServerCutTextMsg rfbBackChannelMsg; +#define sz_rfbBackChannelMsg 8 #endif diff --git a/rfbserver.c b/rfbserver.c index 94533f3..b938d91 100644 --- a/rfbserver.c +++ b/rfbserver.c @@ -709,6 +709,15 @@ rfbProcessClientNormalMessage(cl) cl->enableLastRectEncoding = TRUE; } break; +#ifdef BACKCHANNEL + case rfbEncodingBackChannel: + if (!cl->enableBackChannel) { + rfbLog("Enabling BackChannel protocol extension for " + "client %s\n", cl->host); + cl->enableBackChannel = TRUE; + } + break; +#endif default: if ( enc >= (CARD32)rfbEncodingCompressLevel0 && enc <= (CARD32)rfbEncodingCompressLevel9 ) { @@ -1470,18 +1479,20 @@ void rfbSendBackChannel(rfbScreenInfoPtr rfbScreen,char* str,int len) iterator = rfbGetClientIterator(rfbScreen); while ((cl = rfbClientIteratorNext(iterator)) != NULL) { - sct.type = rfbBackChannel; - sct.length = Swap32IfLE(len); - if (WriteExact(cl, (char *)&sct, - sz_rfbServerCutTextMsg) < 0) { - rfbLogPerror("rfbSendServerCutText: write"); - rfbCloseClient(cl); - continue; - } - if (WriteExact(cl, str, len) < 0) { - rfbLogPerror("rfbSendServerCutText: write"); - rfbCloseClient(cl); - } + if (cl->enableBackChannel) { + sct.type = rfbBackChannel; + sct.length = Swap32IfLE(len); + if (WriteExact(cl, (char *)&sct, + sz_rfbBackChannelMsg) < 0) { + rfbLogPerror("rfbSendBackChannel: write"); + rfbCloseClient(cl); + continue; + } + if (WriteExact(cl, str, len) < 0) { + rfbLogPerror("rfbSendBackChannel: write"); + rfbCloseClient(cl); + } + } } rfbReleaseClientIterator(iterator); } @@ -26,8 +26,8 @@ #include <string.h> #include <sys/types.h> #include <sys/stat.h> -#ifdef WIN32 #include <time.h> +#ifdef WIN32 #define srandom srand #define random rand #else |