1a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <stdio.h>
2a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <stdlib.h>
3a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <rfb/rfb.h>
4a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <rfb/keysym.h>
5a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <rfb/default8x16.h>
6a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
7a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic int maxx=400, maxy=400, bpp=4;
8a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* odd maxx doesn't work (vncviewer bug) */
9a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
10a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* Here we create a structure so that every client has it's own pointer */
11a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
12a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* turns the framebuffer black */
13a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid blank_framebuffer(char* frame_buffer, int x1, int y1, int x2, int y2);
14a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* displays a red bar, a green bar, and a blue bar */
15a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid draw_primary_colors (char* frame_buffer, int x1, int y1, int x2, int y2);
16a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid draw_primary_colours_generic(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2);
17a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid draw_primary_colours_generic_fast(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2);
18a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid linecount (char* frame_buffer);
19a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* handles mouse events */
20a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid on_mouse_event (int buttonMask,int x,int y,rfbClientPtr cl);
21a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* handles keyboard events */
22a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid on_key_press (rfbBool down,rfbKeySym key,rfbClientPtr cl);
23a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
24a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint main (int argc, char **argv)
25a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{
26a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	rfbScreenInfoPtr server;
27a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
28a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	if(!rfbProcessSizeArguments(&maxx,&maxy,&bpp,&argc,argv))
29a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	  return 1;
30a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
31a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        server = rfbGetScreen (&argc, argv, maxx, maxy, 8, 3, bpp);
32a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        if(!server)
33a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat          return 0;
34a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	server->desktopName = "Zippy das wundersquirrel\'s VNC server";
35a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	server->frameBuffer = (char*)malloc(maxx*maxy*bpp);
36a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	server->alwaysShared = TRUE;
37a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        server->kbdAddEvent = on_key_press;
38a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	server->ptrAddEvent = on_mouse_event;
39a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
40a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	rfbInitServer (server);
41a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
42a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	blank_framebuffer(server->frameBuffer, 0, 0, maxx, maxy);
43a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	rfbRunEventLoop (server, -1, FALSE);
44a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	free(server->frameBuffer);
45a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	rfbScreenCleanup (server);
46a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	return 0;
47a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
48a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
49a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid blank_framebuffer(char* frame_buffer, int x1, int y1, int x2, int y2)
50a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{
51a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	int i;
52a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        for (i=0; i < maxx * maxy * bpp; i++) frame_buffer[i]=(char) 0;
53a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
54a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
55a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid draw_primary_colors (char* frame_buffer, int x1, int y1, int x2, int y2)
56a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{
57a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        int i, j, current_pixel;
58a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        for (i=y1; i < y2; i++){
59a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                for (j=x1; j < x2; j++) {
60a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                        current_pixel = (i*x2 + j) * bpp;
61a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                        if (i < y2 ) {
62a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+0] = (char) 128;
63a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+1] = (char) 0;
64a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+2] = (char) 0;
65a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                        }
66a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                        if (i < y2/3*2) {
67a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+0] = (char) 0;
68a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+1] = (char) 128;
69a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+2] = (char) 0;
70a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                        }
71a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                        if (i < y2/3) {
72a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+0] = (char) 0;
73a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+1] = (char) 0;
74a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+2] = (char) 128;
75a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                        }
76a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                }
77a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        }
78a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat }
79a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
80a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* Dscho's versions (slower, but works for bpp != 3 or 4) */
81a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid draw_primary_colours_generic(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2)
82a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{
83a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  rfbPixelFormat f=s->serverFormat;
84a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  int i,j;
85a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  for(j=y1;j<y2;j++)
86a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    for(i=x1;i<x2;i++)
87a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat      if(j<y1*2/3+y2/3)
88a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	rfbDrawPixel(s,i,j,f.redMax<<f.redShift);
89a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat      else if(j<y1/3+y2*2/3)
90a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	rfbDrawPixel(s,i,j,f.greenMax<<f.greenShift);
91a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat      else
92a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	rfbDrawPixel(s,i,j,f.blueMax<<f.blueShift);
93a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
94a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
95a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid draw_primary_colours_generic_fast(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2)
96a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{
97a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  rfbPixelFormat f=s->serverFormat;
98a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  int i,j,y3=(y1*2+y2)/3,y4=(y1+y2*2)/3;
99a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  /* draw first pixel */
100a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  rfbDrawPixel(s,x1,y1,f.redMax<<f.redShift);
101a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  rfbDrawPixel(s,x1,y3,f.greenMax<<f.greenShift);
102a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  rfbDrawPixel(s,x1,y4,f.blueMax<<f.blueShift);
103a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  /* then copy stripes */
104a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  for(j=0;j<y2-y4;j++)
105a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    for(i=x1;i<x2;i++) {
106a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define ADDR(x,y) s->frameBuffer+(x)*bpp+(y)*s->paddedWidthInBytes
107a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat      memcpy(ADDR(i,j+y1),ADDR(x1,y1),bpp);
108a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat      memcpy(ADDR(i,j+y3),ADDR(x1,y3),bpp);
109a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat      memcpy(ADDR(i,j+y4),ADDR(x1,y4),bpp);
110a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat    }
111a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
112a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
113a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatstatic void draw_primary_colours_generic_ultrafast(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2)
114a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{
115a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  rfbPixelFormat f=s->serverFormat;
116a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  int y3=(y1*2+y2)/3,y4=(y1+y2*2)/3;
117a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  /* fill rectangles */
118a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  rfbFillRect(s,x1,y1,x2,y3,f.redMax<<f.redShift);
119a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  rfbFillRect(s,x1,y3,x2,y4,f.greenMax<<f.greenShift);
120a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat  rfbFillRect(s,x1,y4,x2,y2,f.blueMax<<f.blueShift);
121a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
122a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
123a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid linecount (char* frame_buffer)
124a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{
125a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        int i,j,k, current_pixel;
126a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        for (i=maxy-4; i>maxy-20; i-=4)
127a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                for (j=0; j<4; j++) for (k=0; k < maxx; k++) {
128a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                        current_pixel = (i*j*maxx + k) * bpp;
129a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                        if (i%2 == 0) {
130a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+0] = (char) 0;
131a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+1] = (char) 0;
132a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+2] = (char) 128;
133a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                        }
134a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
135a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                        if (i%2 == 1) {
136a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+0] = (char) 128;
137a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+1] = (char) 0;
138a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                                frame_buffer[current_pixel+2] = (char) 0;
139a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                        }
140a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                }
141a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
142a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
143a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
144a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
145a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid on_key_press (rfbBool down,rfbKeySym key,rfbClientPtr cl)
146a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{
147a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        if (down)		/* or else the action occurs on both the press and depress */
148a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	switch (key) {
149a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
150a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case XK_b:
151a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case XK_B:
152a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                blank_framebuffer(cl->screen->frameBuffer, 0, 0, maxx, maxy);
153a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                rfbDrawString(cl->screen,&default8x16Font,20,maxy-20,"Hello, World!",0xffffff);
154a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                rfbMarkRectAsModified(cl->screen,0, 0,maxx,maxy);
155a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                rfbLog("Framebuffer blanked\n");
156a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                break;
157a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case XK_p:
158a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case XK_P:
159a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                /* draw_primary_colors (cl->screen->frameBuffer, 0, 0, maxx, maxy); */
160a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		draw_primary_colours_generic_ultrafast (cl->screen, 0, 0, maxx, maxy);
161a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                rfbMarkRectAsModified(cl->screen,0, 0,maxx,maxy);
162a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                rfbLog("Primary colors displayed\n");
163a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                break;
164a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case XK_Q:
165a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case XK_q:
166a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                rfbLog("Exiting now\n");
167a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                exit(0);
168a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case XK_C:
169a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        case XK_c:
170a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		rfbDrawString(cl->screen,&default8x16Font,20,100,"Hello, World!",0xffffff);
171a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                rfbMarkRectAsModified(cl->screen,0, 0,maxx,maxy);
172a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                break;
173a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        default:
174a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat                rfbLog("The %c key was pressed\n", (char) key);
175a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat        }
176a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
177a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
178a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat
179a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid on_mouse_event (int buttonMask,int x,int y,rfbClientPtr cl)
180a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{
181a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat	printf("buttonMask: %i\n"
182a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat		"x: %i\n" "y: %i\n", buttonMask, x, y);
183a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat}
184