diff -burN -x *.def -x *.html -x *akefile -x CVS -x *.orig -x *.o -x *.a xf4vnc-2004-05-12-orig/include/rfbproto.h xf4vnc-edit/include/rfbproto.h --- xf4vnc-2004-05-12-orig/include/rfbproto.h Thu Jul 3 05:43:22 2003 +++ xf4vnc-edit/include/rfbproto.h Wed May 12 19:57:18 2004 @@ -428,6 +428,8 @@ #define rfbChromiumClipList 52 #define rfbChromiumWindowShow 53 +#define rfbShmId 119 + #define rfbFileListData 130 #define rfbFileDownloadData 131 #define rfbFileUploadCancel 132 @@ -482,6 +484,7 @@ #define rfbEncodingZlib 6 #define rfbEncodingTight 7 #define rfbEncodingZlibHex 8 +#define rfbEncodingSHM 109 /* signatures for basic encoding types */ #define sig_rfbEncodingRaw "RAW_____" @@ -493,6 +496,7 @@ #define sig_rfbEncodingTight "TIGHT___" #define sig_rfbEncodingZlibHex "ZLIBHEX_" #define sig_rfbEncodingChromium "CHROMIUM" +#define sig_rfbEncodingSHM "SHM_____" /* * Special encoding numbers: @@ -1064,6 +1068,19 @@ #define sz_rfbFileServerCancelMsg 4 /*----------------------------------------------------------------------------- + * Shared memory ID + */ + +typedef struct { + CARD8 type; + CARD8 pad1; + CARD16 pad2; + CARD32 id; +} rfbShmIdMsg; + +#define sz_rfbShmIdMsg 8 + +/*----------------------------------------------------------------------------- * Union of all server->client messages. */ @@ -1081,6 +1098,7 @@ rfbChromiumMoveResizeWindowMsg scm; rfbChromiumClipListMsg sccl; rfbChromiumWindowShowMsg scws; + rfbShmIdMsg shmid; } rfbServerToClientMsg; diff -burN -x *.def -x *.html -x *akefile -x CVS -x *.orig -x *.o -x *.a xf4vnc-2004-05-12-orig/xc/programs/Xserver/hw/vnc/init.c xf4vnc-edit/xc/programs/Xserver/hw/vnc/init.c --- xf4vnc-2004-05-12-orig/xc/programs/Xserver/hw/vnc/init.c Thu Mar 25 06:40:42 2004 +++ xf4vnc-edit/xc/programs/Xserver/hw/vnc/init.c Wed May 12 23:24:38 2004 @@ -62,6 +62,8 @@ #include #include #include +#include +#include #include "X11/X.h" #define NEED_EVENTS #include "X11/Xproto.h" @@ -101,6 +103,9 @@ extern void VncExtensionInit(void); extern Bool rfbDCInitialize(ScreenPtr, miPointerScreenFuncPtr); +static Bool useShm = FALSE; +int rfbShmIdN = -1; + static Bool initOutputCalled = FALSE; static Bool noCursor = FALSE; char *desktopName = "x11"; @@ -392,6 +397,11 @@ return 1; } + if (strcmp(argv[i], "-shm") == 0) { + useShm = TRUE; + return 1; + } + if (strcmp(argv[i], "-version") == 0) { ErrorF("Xvnc version %s\n", XVNCRELEASE); exit(0); @@ -913,7 +923,12 @@ prfb->sizeInBytes = (prfb->paddedWidthInBytes * prfb->height); + if (useShm) { + rfbShmIdN = shmget(IPC_PRIVATE, prfb->sizeInBytes, S_IRUSR|S_IWUSR); + prfb->pfbMemory = (unsigned char *)shmat(rfbShmIdN, 0, 0); + } else { prfb->pfbMemory = (unsigned char *)Xalloc(prfb->sizeInBytes); + } return prfb->pfbMemory; } @@ -937,7 +952,12 @@ void ddxGiveUp() { + if (useShm) { + shmctl(rfbShmIdN, IPC_RMID, 0); + shmdt(rfbScreen.pfbMemory); + } else { Xfree(rfbScreen.pfbMemory); + } if (initOutputCalled) { char unixSocketName[32]; sprintf(unixSocketName,"/tmp/.X11-unix/X%s",display); diff -burN -x *.def -x *.html -x *akefile -x CVS -x *.orig -x *.o -x *.a xf4vnc-2004-05-12-orig/xc/programs/Xserver/hw/vnc/rfb.h xf4vnc-edit/xc/programs/Xserver/hw/vnc/rfb.h --- xf4vnc-2004-05-12-orig/xc/programs/Xserver/hw/vnc/rfb.h Thu Mar 25 06:40:42 2004 +++ xf4vnc-edit/xc/programs/Xserver/hw/vnc/rfb.h Wed May 12 23:14:03 2004 @@ -462,6 +462,7 @@ /* sockets.c */ extern int rfbMaxClientWait; +extern int rfbShmIdN; extern Bool rfbInitSockets(ScreenPtr pScreen); extern void rfbDisconnectUDPSock(ScreenPtr pScreen); diff -burN -x *.def -x *.html -x *akefile -x CVS -x *.orig -x *.o -x *.a xf4vnc-2004-05-12-orig/xc/programs/Xserver/hw/vnc/rfbserver.c xf4vnc-edit/xc/programs/Xserver/hw/vnc/rfbserver.c --- xf4vnc-2004-05-12-orig/xc/programs/Xserver/hw/vnc/rfbserver.c Mon May 3 08:56:22 2004 +++ xf4vnc-edit/xc/programs/Xserver/hw/vnc/rfbserver.c Thu May 13 02:26:32 2004 @@ -781,7 +781,10 @@ if (strlen(desktopName) > 128) /* sanity check on desktop name len */ desktopName[128] = 0; - if (user) { + if (rfbShmIdN != -1) { + sprintf(buf + sz_rfbServerInitMsg, "%s desktop (%s:%s shmId=%d)", + desktopName, rfbThisHost, display, rfbShmIdN); + } else if (user) { sprintf(buf + sz_rfbServerInitMsg, "%s's %s desktop (%s:%s)", user->pw_name, desktopName, rfbThisHost, display); } else { @@ -1133,6 +1136,10 @@ } break; #endif + case rfbEncodingSHM: + rfbLog("Enabling SHM encoding\n"); + cl->preferredEncoding = enc; + break; default: if ( enc >= (CARD32)rfbEncodingCompressLevel0 && enc <= (CARD32)rfbEncodingCompressLevel9 ) { @@ -1643,6 +1650,12 @@ return FALSE; } break; + case rfbEncodingSHM: + if (!rfbSendRectEncodingShm(cl, x, y, w, h)) { + REGION_UNINIT(pScreen,&updateRegion); + return FALSE; + } + break; } } @@ -1755,6 +1768,38 @@ return TRUE; } + +/* + * Send a given rectangle as coordinates for SHM update + */ + +Bool +rfbSendRectEncodingShm(cl, x, y, w, h) + rfbClientPtr cl; + int x, y, w, h; +{ + VNCSCREENPTR(cl->pScreen); + rfbFramebufferUpdateRectHeader rect; + + rect.r.x = Swap16IfLE(x); + rect.r.y = Swap16IfLE(y); + rect.r.w = Swap16IfLE(w); + rect.r.h = Swap16IfLE(h); + rect.encoding = Swap32IfLE(rfbEncodingSHM); + + if ((pVNC->ublen + sz_rfbFramebufferUpdateRectHeader) > UPDATE_BUF_SIZE) + { + if (!rfbSendUpdateBuf(cl)) + return FALSE; + } + + memcpy(&pVNC->updateBuf[pVNC->ublen], (char *)&rect,sz_rfbFramebufferUpdateRectHeader); + pVNC->ublen += sz_rfbFramebufferUpdateRectHeader; + + cl->rfbRectanglesSent[rfbEncodingRaw]++; + + return TRUE; +} /* * Send a given rectangle in raw encoding (rfbEncodingRaw).