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