| /** |
| * @example vncev.c |
| * This program is a simple server to show events coming from the client |
| */ |
| #ifdef __STRICT_ANSI__ |
| #define _BSD_SOURCE |
| #endif |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <sys/types.h> |
| #ifndef __MINGW32__ |
| #include <sys/socket.h> |
| #endif |
| #include <rfb/rfb.h> |
| #include <rfb/default8x16.h> |
| |
| #define width 100 |
| #define height 100 |
| static char f[width*height]; |
| static char* keys[0x400]; |
| |
| static int hex2number(unsigned char c) |
| { |
| if(c>'f') return(-1); |
| else if(c>'F') |
| return(10+c-'a'); |
| else if(c>'9') |
| return(10+c-'A'); |
| else |
| return(c-'0'); |
| } |
| |
| static void read_keys(void) |
| { |
| int i,j,k; |
| char buffer[1024]; |
| FILE* keysyms=fopen("keysym.h","r"); |
| |
| memset(keys,0,0x400*sizeof(char*)); |
| |
| if(!keysyms) |
| return; |
| |
| while(!feof(keysyms)) { |
| fgets(buffer,1024,keysyms); |
| if(!strncmp(buffer,"#define XK_",strlen("#define XK_"))) { |
| for(i=strlen("#define XK_");buffer[i] && buffer[i]!=' ' |
| && buffer[i]!='\t';i++); |
| if(buffer[i]==0) /* don't support wrapped lines */ |
| continue; |
| buffer[i]=0; |
| for(i++;buffer[i] && buffer[i]!='0';i++); |
| if(buffer[i]==0 || buffer[i+1]!='x') continue; |
| for(j=0,i+=2;(k=hex2number(buffer[i]))>=0;i++) |
| j=j*16+k; |
| if(keys[j&0x3ff]) { |
| char* x=(char*)malloc(1+strlen(keys[j&0x3ff])+1+strlen(buffer+strlen("#define "))); |
| strcpy(x,keys[j&0x3ff]); |
| strcat(x,","); |
| strcat(x,buffer+strlen("#define ")); |
| free(keys[j&0x3ff]); |
| keys[j&0x3ff]=x; |
| } else |
| keys[j&0x3ff] = strdup(buffer+strlen("#define ")); |
| } |
| |
| } |
| fclose(keysyms); |
| } |
| |
| static int lineHeight=16,lineY=height-16; |
| static void output(rfbScreenInfoPtr s,char* line) |
| { |
| rfbDoCopyRect(s,0,0,width,height-lineHeight,0,-lineHeight); |
| rfbDrawString(s,&default8x16Font,10,lineY,line,0x01); |
| rfbLog("%s\n",line); |
| } |
| |
| static void dokey(rfbBool down,rfbKeySym k,rfbClientPtr cl) |
| { |
| char buffer[1024+32]; |
| |
| sprintf(buffer,"%s: %s (0x%x)", |
| down?"down":"up",keys[k&0x3ff]?keys[k&0x3ff]:"",(unsigned int)k); |
| output(cl->screen,buffer); |
| } |
| |
| static void doptr(int buttonMask,int x,int y,rfbClientPtr cl) |
| { |
| char buffer[1024]; |
| if(buttonMask) { |
| sprintf(buffer,"Ptr: mouse button mask 0x%x at %d,%d",buttonMask,x,y); |
| output(cl->screen,buffer); |
| } |
| |
| } |
| |
| static enum rfbNewClientAction newclient(rfbClientPtr cl) |
| { |
| char buffer[1024]; |
| struct sockaddr_in addr; |
| socklen_t len=sizeof(addr); |
| unsigned int ip; |
| |
| getpeername(cl->sock,(struct sockaddr*)&addr,&len); |
| ip=ntohl(addr.sin_addr.s_addr); |
| sprintf(buffer,"Client connected from ip %d.%d.%d.%d", |
| (ip>>24)&0xff,(ip>>16)&0xff,(ip>>8)&0xff,ip&0xff); |
| output(cl->screen,buffer); |
| return RFB_CLIENT_ACCEPT; |
| } |
| |
| int main(int argc,char** argv) |
| { |
| rfbScreenInfoPtr s=rfbGetScreen(&argc,argv,width,height,8,1,1); |
| if(!s) |
| return 0; |
| s->colourMap.is16=FALSE; |
| s->colourMap.count=2; |
| s->colourMap.data.bytes=(unsigned char*)"\xd0\xd0\xd0\x30\x01\xe0"; |
| s->serverFormat.trueColour=FALSE; |
| s->frameBuffer=f; |
| s->kbdAddEvent=dokey; |
| s->ptrAddEvent=doptr; |
| s->newClientHook=newclient; |
| |
| memset(f,0,width*height); |
| read_keys(); |
| rfbInitServer(s); |
| |
| while(1) { |
| rfbProcessEvents(s,999999); |
| } |
| } |