blob: b18574692a9ac126a5b4e826eee8663267a3b03b [file] [log] [blame]
San Mehata430b2b2014-09-23 08:30:51 -07001/**
2 * @example vncev.c
3 * This program is a simple server to show events coming from the client
4*/
5#ifdef __STRICT_ANSI__
6#define _BSD_SOURCE
7#endif
8#include <stdio.h>
9#include <stdlib.h>
10#include <sys/types.h>
11#ifndef __MINGW32__
12#include <sys/socket.h>
13#endif
14#include <rfb/rfb.h>
15#include <rfb/default8x16.h>
16
17#define width 100
18#define height 100
19static char f[width*height];
20static char* keys[0x400];
21
22static int hex2number(unsigned char c)
23{
24 if(c>'f') return(-1);
25 else if(c>'F')
26 return(10+c-'a');
27 else if(c>'9')
28 return(10+c-'A');
29 else
30 return(c-'0');
31}
32
33static void read_keys(void)
34{
35 int i,j,k;
36 char buffer[1024];
37 FILE* keysyms=fopen("keysym.h","r");
38
39 memset(keys,0,0x400*sizeof(char*));
40
41 if(!keysyms)
42 return;
43
44 while(!feof(keysyms)) {
45 fgets(buffer,1024,keysyms);
46 if(!strncmp(buffer,"#define XK_",strlen("#define XK_"))) {
47 for(i=strlen("#define XK_");buffer[i] && buffer[i]!=' '
48 && buffer[i]!='\t';i++);
49 if(buffer[i]==0) /* don't support wrapped lines */
50 continue;
51 buffer[i]=0;
52 for(i++;buffer[i] && buffer[i]!='0';i++);
53 if(buffer[i]==0 || buffer[i+1]!='x') continue;
54 for(j=0,i+=2;(k=hex2number(buffer[i]))>=0;i++)
55 j=j*16+k;
56 if(keys[j&0x3ff]) {
57 char* x=(char*)malloc(1+strlen(keys[j&0x3ff])+1+strlen(buffer+strlen("#define ")));
58 strcpy(x,keys[j&0x3ff]);
59 strcat(x,",");
60 strcat(x,buffer+strlen("#define "));
61 free(keys[j&0x3ff]);
62 keys[j&0x3ff]=x;
63 } else
64 keys[j&0x3ff] = strdup(buffer+strlen("#define "));
65 }
66
67 }
68 fclose(keysyms);
69}
70
71static int lineHeight=16,lineY=height-16;
72static void output(rfbScreenInfoPtr s,char* line)
73{
74 rfbDoCopyRect(s,0,0,width,height-lineHeight,0,-lineHeight);
75 rfbDrawString(s,&default8x16Font,10,lineY,line,0x01);
76 rfbLog("%s\n",line);
77}
78
79static void dokey(rfbBool down,rfbKeySym k,rfbClientPtr cl)
80{
81 char buffer[1024+32];
82
83 sprintf(buffer,"%s: %s (0x%x)",
84 down?"down":"up",keys[k&0x3ff]?keys[k&0x3ff]:"",(unsigned int)k);
85 output(cl->screen,buffer);
86}
87
88static void doptr(int buttonMask,int x,int y,rfbClientPtr cl)
89{
90 char buffer[1024];
91 if(buttonMask) {
92 sprintf(buffer,"Ptr: mouse button mask 0x%x at %d,%d",buttonMask,x,y);
93 output(cl->screen,buffer);
94 }
95
96}
97
98static enum rfbNewClientAction newclient(rfbClientPtr cl)
99{
100 char buffer[1024];
101 struct sockaddr_in addr;
102 socklen_t len=sizeof(addr);
103 unsigned int ip;
104
105 getpeername(cl->sock,(struct sockaddr*)&addr,&len);
106 ip=ntohl(addr.sin_addr.s_addr);
107 sprintf(buffer,"Client connected from ip %d.%d.%d.%d",
108 (ip>>24)&0xff,(ip>>16)&0xff,(ip>>8)&0xff,ip&0xff);
109 output(cl->screen,buffer);
110 return RFB_CLIENT_ACCEPT;
111}
112
113int main(int argc,char** argv)
114{
115 rfbScreenInfoPtr s=rfbGetScreen(&argc,argv,width,height,8,1,1);
116 if(!s)
117 return 0;
118 s->colourMap.is16=FALSE;
119 s->colourMap.count=2;
120 s->colourMap.data.bytes=(unsigned char*)"\xd0\xd0\xd0\x30\x01\xe0";
121 s->serverFormat.trueColour=FALSE;
122 s->frameBuffer=f;
123 s->kbdAddEvent=dokey;
124 s->ptrAddEvent=doptr;
125 s->newClientHook=newclient;
126
127 memset(f,0,width*height);
128 read_keys();
129 rfbInitServer(s);
130
131 while(1) {
132 rfbProcessEvents(s,999999);
133 }
134}