3 * A simple example of an RFB client
10 #include <rfb/rfbclient.h>
12 static void PrintRect(rfbClient
* client
, int x
, int y
, int w
, int h
) {
13 rfbClientLog("Received an update for %d,%d,%d,%d.\n",x
,y
,w
,h
);
16 static void SaveFramebufferAsPPM(rfbClient
* client
, int x
, int y
, int w
, int h
) {
20 rfbPixelFormat
* pf
=&client
->format
;
21 int bpp
=pf
->bitsPerPixel
/8;
22 int row_stride
=client
->width
*bpp
;
24 /* save one picture only if the last is older than 2 seconds */
32 if(bpp
!=4 && bpp
!=2) {
33 rfbClientLog("bpp = %d (!=4)\n",bpp
);
37 f
=fopen("framebuffer.ppm","wb");
39 rfbClientErr("Could not open framebuffer.ppm\n");
43 fprintf(f
,"P6\n# %s\n%d %d\n255\n",client
->desktopName
,client
->width
,client
->height
);
44 for(j
=0;j
<client
->height
*row_stride
;j
+=row_stride
)
45 for(i
=0;i
<client
->width
*bpp
;i
+=bpp
) {
46 unsigned char* p
=client
->frameBuffer
+j
+i
;
51 v
=*(unsigned short*)p
;
54 fputc((v
>>pf
->redShift
)*256/(pf
->redMax
+1),f
);
55 fputc((v
>>pf
->greenShift
)*256/(pf
->greenMax
+1),f
);
56 fputc((v
>>pf
->blueShift
)*256/(pf
->blueMax
+1),f
);
62 main(int argc
, char **argv
)
64 rfbClient
* client
= rfbGetClient(8,3,4);
67 if(argc
>1 && !strcmp("-print",argv
[1])) {
68 client
->GotFrameBufferUpdate
= PrintRect
;
69 argv
[1]=argv
[0]; argv
++; argc
--;
71 client
->GotFrameBufferUpdate
= SaveFramebufferAsPPM
;
73 /* The -listen option is used to make us a daemon process which listens for
74 incoming connections from servers, rather than actively connecting to a
75 given server. The -tunnel and -via options are useful to create
76 connections tunneled via SSH port forwarding. We must test for the
77 -listen option before invoking any Xt functions - this is because we use
78 forking, and Xt doesn't seem to cope with forking very well. For -listen
79 option, when a successful incoming connection has been accepted,
80 listenForIncomingConnections() returns, setting the listenSpecified
83 if (!rfbInitClient(client
,&argc
,argv
))
86 /* TODO: better wait for update completion */
87 while (time(NULL
)-t
<5) {
89 fprintf(stderr
,"\r%d",i
++);
90 if(WaitForMessage(client
,50)<0)
92 if(!HandleRFBServerMessage(client
))
96 rfbClientCleanup(client
);