Commit 2b8c2a5c authored by dscho's avatar dscho

add client_examples/, add SDLvncviewer, libvncclient API changes, suppress automake CFLAGS nagging

parent 98e4f895
2004-06-07 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>
* */Makefile.am: stop automake nagging
* libvncclient/*, client_examples/*: streamline API, SDLvncviewer added
* examples/, libvncclient/, test/: moved tests to test/
2004-06-05 Karl Runge <runge@karlrunge.com> 2004-06-05 Karl Runge <runge@karlrunge.com>
* x11vnc: rearrange file for easier maintenance * x11vnc: rearrange file for easier maintenance
* add RFB_CLIENT_COUNT to -accept and -gone commands * add RFB_CLIENT_COUNT to -accept and -gone commands
......
CFLAGS=-g -Wall CFLAGS=-g -Wall
SUBDIRS=libvncserver examples contrib x11vnc vncterm classes libvncclient test SUBDIRS=libvncserver examples contrib x11vnc vncterm classes libvncclient client_examples test
DIST_SUBDIRS=libvncserver examples contrib x11vnc vncterm classes libvncclient test DIST_SUBDIRS=libvncserver examples contrib x11vnc vncterm classes libvncclient client_examples test
bin_SCRIPTS = libvncserver-config bin_SCRIPTS = libvncserver-config
......
immediate: immediate:
---------- ----------
cursor drawing does not get undone prior to sending
TightVNC encoding!!! Regression!!! TightVNC encoding!!! Regression!!!
extra_bytes in rfbDrawCharWithClip. extra_bytes in rfbDrawCharWithClip.
tested mouse buttons make copy rect, but text is not marked as mod. tested mouse buttons make copy rect, but text is not marked as mod.
......
DEFINES=-I.. -g -Wall
LDADD = ../libvncclient/libvncclient.a
if HAVE_LIBSDL
SDLVIEWER=SDLvncviewer
SDLvncviewer_CFLAGS=`sdl-config --cflags`
SDLvncviewer_LDFLAGS=`sdl-config --libs`
endif
noinst_PROGRAMS=ppmtest $(SDLVIEWER)
#include <SDL/SDL.h>
#include <rfb/rfbclient.h>
static rfbBool resize(rfbClient* client) {
static char first=TRUE;
int flags=SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_HWACCEL;
int width=client->width,height=client->height,
depth=client->format.bitsPerPixel;
rfbBool okay=SDL_VideoModeOK(width,height,depth,flags);
if(!okay)
for(depth=24;!okay && depth>4;depth/=2)
okay=SDL_VideoModeOK(width,height,depth,flags);
if(okay) {
SDL_Surface* sdl=SDL_SetVideoMode(width,height,depth,flags);
client->clientData=sdl;
client->frameBuffer=sdl->pixels;
if(first || depth!=client->format.bitsPerPixel) {
first=FALSE;
client->format.bitsPerPixel=depth;
client->format.redShift=sdl->format->Rshift;
client->format.greenShift=sdl->format->Gshift;
client->format.blueShift=sdl->format->Bshift;
client->format.redMax=sdl->format->Rmask>>client->format.redShift;
client->format.greenMax=sdl->format->Gmask>>client->format.greenShift;
client->format.blueMax=sdl->format->Bmask>>client->format.blueShift;
SetFormatAndEncodings(client);
}
} else {
SDL_Surface* sdl=client->clientData;
fprintf(stderr,"Could not set resolution %dx%d!\n",
client->width,client->height);
if(sdl) {
client->width=sdl->w;
client->height=sdl->h;
} else {
client->width=0;
client->height=0;
}
return FALSE;
}
SDL_WM_SetCaption(client->desktopName, "SDL");
return TRUE;
}
rfbKeySym SDL_keysym2rfbKeySym(int keysym) {
switch(keysym) {
case SDLK_BACKSPACE: return XK_BackSpace;
case SDLK_TAB: return XK_ISO_Left_Tab;
case SDLK_CLEAR: return XK_Clear;
case SDLK_RETURN: return XK_Return;
case SDLK_PAUSE: return XK_Pause;
case SDLK_ESCAPE: return XK_Escape;
case SDLK_SPACE: return XK_space;
case SDLK_EXCLAIM: return XK_exclam;
case SDLK_QUOTEDBL: return XK_quotedbl;
case SDLK_HASH: return XK_numbersign;
case SDLK_DOLLAR: return XK_dollar;
case SDLK_AMPERSAND: return XK_ampersand;
case SDLK_QUOTE: return XK_apostrophe;
case SDLK_LEFTPAREN: return XK_parenleft;
case SDLK_RIGHTPAREN: return XK_parenright;
case SDLK_ASTERISK: return XK_asterisk;
case SDLK_PLUS: return XK_plus;
case SDLK_COMMA: return XK_comma;
case SDLK_MINUS: return XK_minus;
case SDLK_PERIOD: return XK_period;
case SDLK_SLASH: return XK_slash;
case SDLK_0: return XK_0;
case SDLK_1: return XK_1;
case SDLK_2: return XK_2;
case SDLK_3: return XK_3;
case SDLK_4: return XK_4;
case SDLK_5: return XK_5;
case SDLK_6: return XK_6;
case SDLK_7: return XK_7;
case SDLK_8: return XK_8;
case SDLK_9: return XK_9;
case SDLK_COLON: return XK_colon;
case SDLK_SEMICOLON: return XK_semicolon;
case SDLK_LESS: return XK_less;
case SDLK_EQUALS: return XK_equal;
case SDLK_GREATER: return XK_greater;
case SDLK_QUESTION: return XK_question;
case SDLK_AT: return XK_at;
case SDLK_LEFTBRACKET: return XK_bracketleft;
case SDLK_BACKSLASH: return XK_backslash;
case SDLK_RIGHTBRACKET: return XK_bracketright;
case SDLK_CARET: return XK_asciicircum;
case SDLK_UNDERSCORE: return XK_underscore;
case SDLK_BACKQUOTE: return XK_grave;
case SDLK_a: return XK_a;
case SDLK_b: return XK_b;
case SDLK_c: return XK_c;
case SDLK_d: return XK_d;
case SDLK_e: return XK_e;
case SDLK_f: return XK_f;
case SDLK_g: return XK_g;
case SDLK_h: return XK_h;
case SDLK_i: return XK_i;
case SDLK_j: return XK_j;
case SDLK_k: return XK_k;
case SDLK_l: return XK_l;
case SDLK_m: return XK_m;
case SDLK_n: return XK_n;
case SDLK_o: return XK_o;
case SDLK_p: return XK_p;
case SDLK_q: return XK_q;
case SDLK_r: return XK_r;
case SDLK_s: return XK_s;
case SDLK_t: return XK_t;
case SDLK_u: return XK_u;
case SDLK_v: return XK_v;
case SDLK_w: return XK_w;
case SDLK_x: return XK_x;
case SDLK_y: return XK_y;
case SDLK_z: return XK_z;
case SDLK_DELETE: return XK_Delete;
case SDLK_KP0: return XK_KP_0;
case SDLK_KP1: return XK_KP_1;
case SDLK_KP2: return XK_KP_2;
case SDLK_KP3: return XK_KP_3;
case SDLK_KP4: return XK_KP_4;
case SDLK_KP5: return XK_KP_5;
case SDLK_KP6: return XK_KP_6;
case SDLK_KP7: return XK_KP_7;
case SDLK_KP8: return XK_KP_8;
case SDLK_KP9: return XK_KP_9;
case SDLK_KP_PERIOD: return XK_KP_Decimal;
case SDLK_KP_DIVIDE: return XK_KP_Divide;
case SDLK_KP_MULTIPLY: return XK_KP_Multiply;
case SDLK_KP_MINUS: return XK_KP_Subtract;
case SDLK_KP_PLUS: return XK_KP_Add;
case SDLK_KP_ENTER: return XK_KP_Enter;
case SDLK_KP_EQUALS: return XK_KP_Equal;
case SDLK_UP: return XK_Up;
case SDLK_DOWN: return XK_Down;
case SDLK_RIGHT: return XK_Right;
case SDLK_LEFT: return XK_Left;
case SDLK_INSERT: return XK_Insert;
case SDLK_HOME: return XK_Home;
case SDLK_END: return XK_End;
case SDLK_PAGEUP: return XK_Page_Up;
case SDLK_PAGEDOWN: return XK_Page_Down;
case SDLK_F1: return XK_F1;
case SDLK_F2: return XK_F2;
case SDLK_F3: return XK_F3;
case SDLK_F4: return XK_F4;
case SDLK_F5: return XK_F5;
case SDLK_F6: return XK_F6;
case SDLK_F7: return XK_F7;
case SDLK_F8: return XK_F8;
case SDLK_F9: return XK_F9;
case SDLK_F10: return XK_F10;
case SDLK_F11: return XK_F11;
case SDLK_F12: return XK_F12;
case SDLK_F13: return XK_F13;
case SDLK_F14: return XK_F14;
case SDLK_F15: return XK_F15;
case SDLK_NUMLOCK: return XK_Num_Lock;
case SDLK_CAPSLOCK: return XK_Caps_Lock;
case SDLK_SCROLLOCK: return XK_Scroll_Lock;
case SDLK_RSHIFT: return XK_Shift_R;
case SDLK_LSHIFT: return XK_Shift_L;
case SDLK_RCTRL: return XK_Control_R;
case SDLK_LCTRL: return XK_Control_L;
case SDLK_RALT: return XK_Alt_R;
case SDLK_LALT: return XK_Alt_L;
case SDLK_RMETA: return XK_Meta_R;
case SDLK_LMETA: return XK_Meta_L;
//case SDLK_LSUPER: return XK_LSuper; /* left "windows" key */
//case SDLK_RSUPER: return XK_RSuper; /* right "windows" key */
case SDLK_MODE: return XK_Mode_switch;
//case SDLK_COMPOSE: return XK_Compose;
case SDLK_HELP: return XK_Help;
case SDLK_PRINT: return XK_Print;
case SDLK_SYSREQ: return XK_Sys_Req;
case SDLK_BREAK: return XK_Break;
default: fprintf(stderr,"Unknown keysym: %d\n",keysym);
}
}
#define main main1
#include "ppmtest.c"
#undef main
void update(rfbClient* cl,int x,int y,int w,int h) {
SDL_UpdateRect(cl->clientData, x, y, w, h);
SaveFramebufferAsPPM(cl,x,y,w,h);
}
int main(int argc,char** argv) {
rfbClient* cl;
int i,buttonMask=0;
SDL_Event e;
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
cl=rfbGetClient(5,3,2);
//cl=rfbGetClient(8,3,4);
cl->MallocFrameBuffer=resize;
cl->GotFrameBufferUpdate=update;
if(!rfbInitClient(cl,&argc,argv))
return 1;
while(1) {
if(SDL_PollEvent(&e))
switch(e.type) {
case SDL_VIDEOEXPOSE:
SendFramebufferUpdateRequest(cl,0,0,cl->width,cl->height,FALSE);
break;
case SDL_MOUSEMOTION: {
int x,y;
SDL_GetMouseState(&x,&y);
SendPointerEvent(cl,x,y,buttonMask);
}
break;
case SDL_KEYUP: case SDL_KEYDOWN:
SendKeyEvent(cl,SDL_keysym2rfbKeySym(e.key.keysym.sym),(e.type==SDL_KEYDOWN)?TRUE:FALSE);
break;
case SDL_QUIT:
rfbClientCleanup(cl);
return 0;
}
else {
i=WaitForMessage(cl,500);
if(i<0)
return 0;
if(i)
if(!HandleRFBServerMessage(cl))
return 0;
}
}
return 0;
}
/* A simple example of an RFB client */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <rfb/rfbclient.h>
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;j<client->height*row_stride;j+=row_stride)
for(i=0;i<client->width*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;
}
...@@ -29,6 +29,10 @@ AC_ARG_WITH(24bpp, ...@@ -29,6 +29,10 @@ AC_ARG_WITH(24bpp,
if test "x$with_24bpp" = "xyes"; then if test "x$with_24bpp" = "xyes"; then
AC_DEFINE(ALLOW24BPP) AC_DEFINE(ALLOW24BPP)
fi fi
AH_TEMPLATE(SDL_CONFIG, [Use sdl-config (for SDLvncviewer)])
AC_ARG_WITH(sdl,
[ --with-sdl use sdl-config],
, [ with_sdl=yes ])
# Checks for X libraries # Checks for X libraries
HAVE_X="false" HAVE_X="false"
...@@ -84,6 +88,14 @@ fi ...@@ -84,6 +88,14 @@ fi
AM_CONDITIONAL(HAVE_LIBPTHREAD, test ! -z "$HAVE_LIBPTHREAD") AM_CONDITIONAL(HAVE_LIBPTHREAD, test ! -z "$HAVE_LIBPTHREAD")
AM_CONDITIONAL(HAVE_LIBZ, test ! -z "$HAVE_ZLIB_H") AM_CONDITIONAL(HAVE_LIBZ, test ! -z "$HAVE_ZLIB_H")
AM_CONDITIONAL(HAVE_LIBJPEG, test ! -z "$HAVE_JPEGLIB_H") AM_CONDITIONAL(HAVE_LIBJPEG, test ! -z "$HAVE_JPEGLIB_H")
if test -z "$with_sdl"; then
if sdl-config >/dev/null 2>&1; then
with_sdl=yes
else
with_sdl=no
fi
fi
AM_CONDITIONAL(HAVE_LIBSDL, test "x$with_sdl" = "xyes")
# Checks for header files. # Checks for header files.
AC_HEADER_STDC AC_HEADER_STDC
...@@ -141,6 +153,7 @@ AC_CONFIG_FILES([Makefile ...@@ -141,6 +153,7 @@ AC_CONFIG_FILES([Makefile
vncterm/Makefile vncterm/Makefile
classes/Makefile classes/Makefile
libvncclient/Makefile libvncclient/Makefile
client_examples/Makefile
test/Makefile test/Makefile
libvncserver.spec libvncserver.spec
libvncserver-config]) libvncserver-config])
......
CFLAGS = -I .. DEFINES = -I ..
LDADD = ../libvncserver/libvncserver.a LDADD = ../libvncserver/libvncserver.a
noinst_PROGRAMS=zippy noinst_PROGRAMS=zippy
......
CFLAGS=-I.. -g -Wall DEFINES=-I.. -g -Wall
LDADD = ../libvncserver/libvncserver.a LDADD = ../libvncserver/libvncserver.a
if HAVE_LIBPTHREAD
BACKGROUND_TEST=blooptest
endif
if OSX if OSX
MAC=mac MAC=mac
mac_LDFLAGS=-framework ApplicationServices -framework Carbon -framework IOKit mac_LDFLAGS=-framework ApplicationServices -framework Carbon -framework IOKit
endif endif
copyrecttest_LDADD=$(LDADD) -lm
noinst_HEADERS=radon.h noinst_HEADERS=radon.h
noinst_PROGRAMS=example pnmshow regiontest pnmshow24 fontsel \ noinst_PROGRAMS=example pnmshow regiontest pnmshow24 fontsel \
vncev storepasswd colourmaptest simple simple15 copyrecttest \ vncev storepasswd colourmaptest simple simple15 $(MAC)
$(BACKGROUND_TEST) $(MAC)
CFLAGS=-g -I.. -I. -Wall DEFINES=-g -I.. -I. -Wall
libvncclient_a_SOURCES=cursor.c listen.c rfbproto.c sockets.c vncviewer.c libvncclient_a_SOURCES=cursor.c listen.c rfbproto.c sockets.c vncviewer.c
...@@ -10,9 +10,4 @@ $(libvncclient_a_OBJECTS): ../rfb/rfbclient.h ...@@ -10,9 +10,4 @@ $(libvncclient_a_OBJECTS): ../rfb/rfbclient.h
lib_LIBRARIES=libvncclient.a lib_LIBRARIES=libvncclient.a
client_test_SOURCES=client_test.c
noinst_PROGRAMS=client_test
#client_test_LDADD=libvncclient.a ../libvncserver.a
client_test_LDADD=libvncclient.a
/* A simple example of an RFB client */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <rfb/rfbclient.h>
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 SaveFramebufferAsPGM(rfbClient* client, int x, int y, int w, int h) {
static time_t t=0,t1;
FILE* f;
int i,j;
int bpp=client->format.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) {
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;j<client->height*row_stride;j+=row_stride)
for(i=0;i<client->width*bpp;i+=bpp) {
if(client->format.bigEndian) {
fputc(client->frameBuffer[j+i+bpp-1],f);
fputc(client->frameBuffer[j+i+bpp-2],f);
fputc(client->frameBuffer[j+i+bpp-3],f);
} else {
fputc(client->frameBuffer[j+i+0],f);
fputc(client->frameBuffer[j+i+1],f);
fputc(client->frameBuffer[j+i+2],f);
}
}
fclose(f);
}
int WaitForMessage(rfbClient* client,unsigned int usecs)
{
fd_set fds;
struct timeval timeout;
int num;
timeout.tv_sec=(usecs/1000000);
timeout.tv_usec=(usecs%1000000);
FD_ZERO(&fds);
FD_SET(client->sock,&fds);
num=select(client->sock+1, &fds, NULL, NULL, &timeout);
if(num<0)
rfbClientLog("Waiting for message failed: %d (%s)\n",errno,strerror(errno));
return num;
}
int
main(int argc, char **argv)
{
int i;
rfbClient* client = rfbGetClient(&argc,argv,8,3,4);
const char* vncServerHost="";
int vncServerPort=5900;
time_t t=time(0);
client->GotFrameBufferUpdate = PrintRect;
//client->GotFrameBufferUpdate = SaveFramebufferAsPGM;
/* 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. */
for (i = 1; i < argc; i++) {
if (strcmp(argv[i], "-listen") == 0) {
listenForIncomingConnections(client);
break;
} else {
char* colon=strchr(argv[i],':');
vncServerHost=argv[i];
if(colon) {
*colon=0;
vncServerPort=atoi(colon+1);
} else
vncServerPort=0;
vncServerPort+=5900;
}
}
client->appData.encodingsString="tight";
if(!rfbInitClient(client,vncServerHost,vncServerPort)) {
rfbClientCleanup(client);
return 1;
}
while (time(0)-t<5) {
static int i=0;
fprintf(stderr,"\r%d",i++);
if(WaitForMessage(client,500)<0)
break;
if(!HandleRFBServerMessage(client))
break;
}
rfbClientCleanup(client);
return 0;
}
...@@ -422,3 +422,24 @@ PrintInHex(char *buf, int len) ...@@ -422,3 +422,24 @@ PrintInHex(char *buf, int len)
fflush(stderr); fflush(stderr);
} }
int WaitForMessage(rfbClient* client,unsigned int usecs)
{
fd_set fds;
struct timeval timeout;
int num;
timeout.tv_sec=(usecs/1000000);
timeout.tv_usec=(usecs%1000000);
FD_ZERO(&fds);
FD_SET(client->sock,&fds);
num=select(client->sock+1, &fds, NULL, NULL, &timeout);
if(num<0)
rfbClientLog("Waiting for message failed: %d (%s)\n",errno,strerror(errno));
return num;
}
...@@ -43,15 +43,35 @@ static rfbBool MallocFrameBuffer(rfbClient* client) { ...@@ -43,15 +43,35 @@ static rfbBool MallocFrameBuffer(rfbClient* client) {
return client->frameBuffer?TRUE:FALSE; return client->frameBuffer?TRUE:FALSE;
} }
rfbClient* rfbGetClient(int* argc,char** argv, static void initAppData(AppData* data) {
int bitsPerSample,int samplesPerPixel, data->shareDesktop=TRUE;
data->viewOnly=FALSE;
data->encodingsString="tight hextile zlib corre rre raw";
data->useBGR233=FALSE;
data->nColours=0;
data->forceOwnCmap=FALSE;
data->forceTrueColour=FALSE;
data->requestedDepth=0;
data->compressLevel=3;
data->qualityLevel=5;
#ifdef LIBVNCSERVER_HAVE_LIBJPEG
data->enableJPEG=TRUE;
#else
data->enableJPEG=FALSE;
#endif
data->useRemoteCursor=FALSE;
}
rfbClient* rfbGetClient(int bitsPerSample,int samplesPerPixel,
int bytesPerPixel) { int bytesPerPixel) {
rfbClient* client=(rfbClient*)calloc(sizeof(rfbClient),1); rfbClient* client=(rfbClient*)calloc(sizeof(rfbClient),1);
client->programName = argv[0]; initAppData(&client->appData);
client->programName = 0;
client->endianTest = 1; client->endianTest = 1;
client->format.bitsPerPixel = bytesPerPixel*8; client->format.bitsPerPixel = bytesPerPixel*8;
client->format.depth = bitsPerSample*samplesPerPixel; client->format.depth = bitsPerSample*samplesPerPixel;
client->appData.requestedDepth=client->format.depth;
client->format.bigEndian = *(char *)&client->endianTest?FALSE:TRUE; client->format.bigEndian = *(char *)&client->endianTest?FALSE:TRUE;
client->format.trueColour = TRUE; client->format.trueColour = TRUE;
...@@ -94,13 +114,13 @@ rfbClient* rfbGetClient(int* argc,char** argv, ...@@ -94,13 +114,13 @@ rfbClient* rfbGetClient(int* argc,char** argv,
return client; return client;
} }
rfbBool rfbInitClient(rfbClient* client,const char* vncServerHost,int vncServerPort) static rfbBool rfbInitConnection(rfbClient* client)
{ {
/* Unless we accepted an incoming connection, make a TCP connection to the /* Unless we accepted an incoming connection, make a TCP connection to the
given VNC server */ given VNC server */
if (!client->listenSpecified) { if (!client->listenSpecified) {
if (!ConnectToRFBServer(client,vncServerHost, vncServerPort)) if (!client->serverHost || !ConnectToRFBServer(client,client->serverHost,client->serverPort))
return FALSE; return FALSE;
} }
...@@ -122,6 +142,37 @@ rfbBool rfbInitClient(rfbClient* client,const char* vncServerHost,int vncServerP ...@@ -122,6 +142,37 @@ rfbBool rfbInitClient(rfbClient* client,const char* vncServerHost,int vncServerP
return TRUE; return TRUE;
} }
rfbBool rfbInitClient(rfbClient* client,int* argc,char** argv) {
int i;
if(client->programName==0)
client->programName=argv[0];
for (i = 1; i < *argc; i++) {
if (strcmp(argv[i], "-listen") == 0) {
listenForIncomingConnections(client);
break;
} else {
char* colon=strchr(argv[i],':');
client->serverHost=argv[i];
if(colon) {
*colon=0;
client->serverPort=atoi(colon+1);
} else
client->serverPort=0;
client->serverPort+=5900;
}
}
if(!rfbInitConnection(client)) {
rfbClientCleanup(client);
return FALSE;
}
return TRUE;
}
void rfbClientCleanup(rfbClient* client) { void rfbClientCleanup(rfbClient* client) {
free(client); free(client);
} }
CFLAGS=-g -Wall DEFINES=-g -Wall
includedir=$(prefix)/include/rfb includedir=$(prefix)/include/rfb
#include_HEADERS=rfb.h rfbconfig.h rfbint.h rfbproto.h keysym.h rfbregion.h #include_HEADERS=rfb.h rfbconfig.h rfbint.h rfbproto.h keysym.h rfbregion.h
......
...@@ -8,7 +8,7 @@ mv configure.ac configure.ac.LibVNCServer ...@@ -8,7 +8,7 @@ mv configure.ac configure.ac.LibVNCServer
cat configure.ac.LibVNCServer | \ cat configure.ac.LibVNCServer | \
sed -e "s/LibVNCServer, [^,)]*\([(,]\)*/x11vnc, $VERSION\1/g" \ sed -e "s/LibVNCServer, [^,)]*\([(,]\)*/x11vnc, $VERSION\1/g" \
-e "s/\(contrib\|examples\|vncterm\|libvncclient\|test\)\/Makefile//g" \ -e "s/\(contrib\|examples\|vncterm\|libvncclient\|test\|client_examples\)\/Makefile//g" \
-e "s/libvncserver.spec/x11vnc.spec/g" \ -e "s/libvncserver.spec/x11vnc.spec/g" \
-e "s/^.*libvncserver-config//g" \ -e "s/^.*libvncserver-config//g" \
> configure.ac > configure.ac
......
#ifndef RFBCLIENT_H
#define RFBCLIENT_H
/* /*
* Copyright (C) 2000, 2001 Const Kaplinsky. All Rights Reserved. * Copyright (C) 2000, 2001 Const Kaplinsky. All Rights Reserved.
* Copyright (C) 2000 Tridia Corporation. All Rights Reserved. * Copyright (C) 2000 Tridia Corporation. All Rights Reserved.
...@@ -55,31 +58,15 @@ ...@@ -55,31 +58,15 @@
typedef struct { typedef struct {
rfbBool shareDesktop; rfbBool shareDesktop;
rfbBool viewOnly; rfbBool viewOnly;
rfbBool fullScreen;
rfbBool grabKeyboard;
rfbBool raiseOnBeep;
const char* encodingsString; const char* encodingsString;
rfbBool useBGR233; rfbBool useBGR233;
int nColours; int nColours;
rfbBool useSharedColours;
rfbBool forceOwnCmap; rfbBool forceOwnCmap;
rfbBool forceTrueColour; rfbBool forceTrueColour;
int requestedDepth; int requestedDepth;
rfbBool useShm;
int wmDecorationWidth;
int wmDecorationHeight;
rfbBool debug;
int popupButtonCount;
int bumpScrollTime;
int bumpScrollPixels;
int compressLevel; int compressLevel;
int qualityLevel; int qualityLevel;
rfbBool enableJPEG; rfbBool enableJPEG;
...@@ -133,6 +120,9 @@ typedef struct _rfbClient { ...@@ -133,6 +120,9 @@ typedef struct _rfbClient {
/* cursor.c */ /* cursor.c */
uint8_t *rcSource, *rcMask; uint8_t *rcSource, *rcMask;
/* private data pointer */
void* clientData;
/* hooks */ /* hooks */
HandleCursorPosProc HandleCursorPos; HandleCursorPosProc HandleCursorPos;
SoftCursorLockAreaProc SoftCursorLockArea; SoftCursorLockAreaProc SoftCursorLockArea;
...@@ -183,8 +173,12 @@ extern rfbBool SetNonBlocking(int sock); ...@@ -183,8 +173,12 @@ extern rfbBool SetNonBlocking(int sock);
extern rfbBool StringToIPAddr(const char *str, unsigned int *addr); extern rfbBool StringToIPAddr(const char *str, unsigned int *addr);
extern rfbBool SameMachine(int sock); extern rfbBool SameMachine(int sock);
extern int WaitForMessage(rfbClient* client,unsigned int usecs);
/* vncviewer.c */ /* vncviewer.c */
rfbClient* rfbGetClient(int* argc,char** argv,int bitsPerSample,int samplesPerPixel,int bytesPerPixel); rfbClient* rfbGetClient(int bitsPerSample,int samplesPerPixel,int bytesPerPixel);
rfbBool rfbInitClient(rfbClient* client,const char* vncServerHost,int vncServerPort); rfbBool rfbInitClient(rfbClient* client,int* argc,char** argv);
void rfbClientCleanup(rfbClient* client); void rfbClientCleanup(rfbClient* client);
#endif
CFLAGS=-I.. -g -Wall DEFINES=-I.. -g -Wall
if HAVE_LIBPTHREAD
BACKGROUND_TEST=blooptest
endif
copyrecttest_LDADD=$(LDADD) -lm
noinst_PROGRAMS=tight-1 cargstest copyrecttest $(BACKGROUND_TEST)
noinst_PROGRAMS=tight-1 cargstest
LDADD = ../libvncserver/libvncserver.a ../libvncclient/libvncclient.a LDADD = ../libvncserver/libvncserver.a ../libvncclient/libvncclient.a
#define BACKGROUND_LOOP_TEST #define BACKGROUND_LOOP_TEST
#include "example.c" #include "../examples/example.c"
...@@ -8,7 +8,7 @@ int main(int argc,char** argv) ...@@ -8,7 +8,7 @@ int main(int argc,char** argv)
time_t t=time(0); time_t t=time(0);
rfbScreenInfoPtr server=rfbGetScreen(&argc,argv,400,300,8,3,4); rfbScreenInfoPtr server=rfbGetScreen(&argc,argv,400,300,8,3,4);
rfbClient* client=rfbGetClient(&argc,argv,8,3,4); rfbClient* client=rfbGetClient(8,3,4);
server->frameBuffer=malloc(400*300*4); server->frameBuffer=malloc(400*300*4);
for(j=0;j<400*300*4;j++) for(j=0;j<400*300*4;j++)
......
CFLAGS = -I .. DEFINES = -I ..
LDADD = ../libvncserver/libvncserver.a LDADD = ../libvncserver/libvncserver.a
EXTRA_DIST=ChangeLog EXTRA_DIST=ChangeLog
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment