From 2b8c2a5c3a71364e402b4df334a6f5aff5ed77a9 Mon Sep 17 00:00:00 2001 From: dscho Date: Mon, 7 Jun 2004 08:31:57 +0000 Subject: add client_examples/, add SDLvncviewer, libvncclient API changes, suppress automake CFLAGS nagging --- client_examples/ppmtest.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 client_examples/ppmtest.c (limited to 'client_examples/ppmtest.c') diff --git a/client_examples/ppmtest.c b/client_examples/ppmtest.c new file mode 100644 index 0000000..01ee6a7 --- /dev/null +++ b/client_examples/ppmtest.c @@ -0,0 +1,93 @@ +/* A simple example of an RFB client */ + +#include +#include +#include +#include +#include + +void PrintRect(rfbClient* client, int x, int y, int w, int h) { + rfbClientLog("Received an update for %d,%d,%d,%d.\n",x,y,w,h); +} + +void SaveFramebufferAsPPM(rfbClient* client, int x, int y, int w, int h) { + static time_t t=0,t1; + FILE* f; + int i,j; + rfbPixelFormat* pf=&client->format; + int bpp=pf->bitsPerPixel/8; + int row_stride=client->width*bpp; + + /* save one picture only if the last is older than 2 seconds */ + t1=time(0); + if(t1-t>2) + t=t1; + else + return; + + /* assert bpp=4 */ + if(bpp!=4 && bpp!=2) { + rfbClientLog("bpp = %d (!=4)\n",bpp); + return; + } + + f=fopen("/tmp/framebuffer.ppm","wb"); + + fprintf(f,"P6\n# %s\n%d %d\n255\n",client->desktopName,client->width,client->height); + for(j=0;jheight*row_stride;j+=row_stride) + for(i=0;iwidth*bpp;i+=bpp) { + const char* p=client->frameBuffer+j+i; + unsigned int v; + if(bpp==4) + v=*(unsigned int*)p; + else if(bpp==2) + v=*(unsigned short*)p; + fputc((v>>pf->redShift)*256/(pf->redMax+1),f); + fputc((v>>pf->greenShift)*256/(pf->greenMax+1),f); + fputc((v>>pf->blueShift)*256/(pf->blueMax+1),f); + } + fclose(f); +} + + int +main(int argc, char **argv) +{ + int i; + rfbClient* client = rfbGetClient(8,3,4); + const char* vncServerHost=""; + int vncServerPort=5900; + time_t t=time(0); + + if(argc>1 && !strcmp("-print",argv[1])) { + client->GotFrameBufferUpdate = PrintRect; + argv[1]=argv[0]; argv++; argc--; + } else + client->GotFrameBufferUpdate = SaveFramebufferAsPPM; + + /* The -listen option is used to make us a daemon process which listens for + incoming connections from servers, rather than actively connecting to a + given server. The -tunnel and -via options are useful to create + connections tunneled via SSH port forwarding. We must test for the + -listen option before invoking any Xt functions - this is because we use + forking, and Xt doesn't seem to cope with forking very well. For -listen + option, when a successful incoming connection has been accepted, + listenForIncomingConnections() returns, setting the listenSpecified + flag. */ + + if (!rfbInitClient(client,&argc,argv)) + return 1; + + while (time(0)-t<5) { + static int i=0; + fprintf(stderr,"\r%d",i++); + if(WaitForMessage(client,50)<0) + break; + if(!HandleRFBServerMessage(client)) + break; + } + + rfbClientCleanup(client); + + return 0; +} + -- cgit v1.2.3