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).