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