1 /* This program is a simple server to show events coming from the client */
9 #include <sys/socket.h>
12 #include <rfb/default8x16.h>
16 static char f[width*height];
17 static char* keys[0x400];
19 static int hex2number(unsigned char c)
30 static void read_keys(void)
34 FILE* keysyms=fopen("keysym.h","r");
36 memset(keys,0,0x400*sizeof(char*));
41 while(!feof(keysyms)) {
42 fgets(buffer,1024,keysyms);
43 if(!strncmp(buffer,"#define XK_",strlen("#define XK_"))) {
44 for(i=strlen("#define XK_");buffer[i] && buffer[i]!=' '
45 && buffer[i]!='\t';i++);
46 if(buffer[i]==0) /* don't support wrapped lines */
49 for(i++;buffer[i] && buffer[i]!='0';i++);
50 if(buffer[i]==0 || buffer[i+1]!='x') continue;
51 for(j=0,i+=2;(k=hex2number(buffer[i]))>=0;i++)
54 char* x=(char*)malloc(1+strlen(keys[j&0x3ff])+1+strlen(buffer+strlen("#define ")));
55 strcpy(x,keys[j&0x3ff]);
57 strcat(x,buffer+strlen("#define "));
61 keys[j&0x3ff] = strdup(buffer+strlen("#define "));
68 static int lineHeight=16,lineY=height-16;
69 static void output(rfbScreenInfoPtr s,char* line)
71 rfbDoCopyRect(s,0,0,width,height-lineHeight,0,-lineHeight);
72 rfbDrawString(s,&default8x16Font,10,lineY,line,0x01);
76 static void dokey(rfbBool down,rfbKeySym k,rfbClientPtr cl)
80 sprintf(buffer,"%s: %s (0x%x)",
81 down?"down":"up",keys[k&0x3ff]?keys[k&0x3ff]:"",(unsigned int)k);
82 output(cl->screen,buffer);
85 static void doptr(int buttonMask,int x,int y,rfbClientPtr cl)
89 sprintf(buffer,"Ptr: mouse button mask 0x%x at %d,%d",buttonMask,x,y);
90 output(cl->screen,buffer);
95 static enum rfbNewClientAction newclient(rfbClientPtr cl)
98 struct sockaddr_in addr;
99 unsigned int len=sizeof(addr),ip;
101 getpeername(cl->sock,(struct sockaddr*)&addr,&len);
102 ip=ntohl(addr.sin_addr.s_addr);
103 sprintf(buffer,"Client connected from ip %d.%d.%d.%d",
104 (ip>>24)&0xff,(ip>>16)&0xff,(ip>>8)&0xff,ip&0xff);
105 output(cl->screen,buffer);
106 return RFB_CLIENT_ACCEPT;
109 int main(int argc,char** argv)
111 rfbScreenInfoPtr s=rfbGetScreen(&argc,argv,width,height,8,1,1);
112 s->colourMap.is16=FALSE;
113 s->colourMap.count=2;
114 s->colourMap.data.bytes=(unsigned char*)"\xd0\xd0\xd0\x30\x01\xe0";
115 s->serverFormat.trueColour=FALSE;
117 s->kbdAddEvent=dokey;
118 s->ptrAddEvent=doptr;
119 s->newClientHook=newclient;
121 memset(f,0,width*height);
126 rfbProcessEvents(s,999999);