summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorChristian Beier <dontmind@freeshell.org>2011-03-10 14:55:09 +0100
committerChristian Beier <dontmind@freeshell.org>2011-03-10 14:55:09 +0100
commitc8fc0ad5a772c55a88900d521684cfcf35afe7cb (patch)
tree4bb02ca8de846f1fe48a8f16c4f8abdcc9cea0b9 /examples
parentcf72a0f7c35ee791d5b4a81ef799d006e1b16bda (diff)
downloadlibtdevnc-c8fc0ad5a772c55a88900d521684cfcf35afe7cb.tar.gz
libtdevnc-c8fc0ad5a772c55a88900d521684cfcf35afe7cb.zip
Move zippy.c to examples.
Diffstat (limited to 'examples')
-rw-r--r--examples/Makefile.am3
-rw-r--r--examples/zippy.c179
2 files changed, 181 insertions, 1 deletions
diff --git a/examples/Makefile.am b/examples/Makefile.am
index d08f7c9..92909bf 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -18,5 +18,6 @@ noinst_HEADERS=radon.h rotatetemplate.c
noinst_PROGRAMS=example pnmshow regiontest pnmshow24 fontsel \
vncev storepasswd colourmaptest simple simple15 $(MAC) \
- $(FILETRANSFER) backchannel $(BLOOPTEST) camera rotate
+ $(FILETRANSFER) backchannel $(BLOOPTEST) camera rotate \
+ zippy
diff --git a/examples/zippy.c b/examples/zippy.c
new file mode 100644
index 0000000..d8a90d7
--- /dev/null
+++ b/examples/zippy.c
@@ -0,0 +1,179 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <rfb/rfb.h>
+#include <rfb/keysym.h>
+#include <rfb/default8x16.h>
+
+static int maxx=400, maxy=400, bpp=4;
+/* odd maxx doesn't work (vncviewer bug) */
+
+/* Here we create a structure so that every client has it's own pointer */
+
+/* turns the framebuffer black */
+void blank_framebuffer(char* frame_buffer, int x1, int y1, int x2, int y2);
+/* displays a red bar, a green bar, and a blue bar */
+void draw_primary_colors (char* frame_buffer, int x1, int y1, int x2, int y2);
+void linecount (char* frame_buffer);
+/* handles mouse events */
+void on_mouse_event (int buttonMask,int x,int y,rfbClientPtr cl);
+/* handles keyboard events */
+void on_key_press (rfbBool down,rfbKeySym key,rfbClientPtr cl);
+
+int main (int argc, char **argv)
+{
+ rfbScreenInfoPtr server;
+
+ if(!rfbProcessSizeArguments(&maxx,&maxy,&bpp,&argc,argv))
+ return 1;
+
+ server = rfbGetScreen (&argc, argv, maxx, maxy, 8, 3, bpp);
+ server->desktopName = "Zippy das wundersquirrel\'s VNC server";
+ server->frameBuffer = (char*)malloc(maxx*maxy*bpp);
+ server->alwaysShared = TRUE;
+ server->kbdAddEvent = on_key_press;
+ server->ptrAddEvent = on_mouse_event;
+
+ rfbInitServer (server);
+
+ blank_framebuffer(server->frameBuffer, 0, 0, maxx, maxy);
+ rfbRunEventLoop (server, -1, FALSE);
+ free(server->frameBuffer);
+ rfbScreenCleanup (server);
+ return 0;
+}
+
+void blank_framebuffer(char* frame_buffer, int x1, int y1, int x2, int y2)
+{
+ int i;
+ for (i=0; i < maxx * maxy * bpp; i++) frame_buffer[i]=(char) 0;
+}
+
+void draw_primary_colors (char* frame_buffer, int x1, int y1, int x2, int y2)
+{
+ int i, j, current_pixel;
+ for (i=y1; i < y2; i++){
+ for (j=x1; j < x2; j++) {
+ current_pixel = (i*x2 + j) * bpp;
+ if (i < y2 ) {
+ frame_buffer[current_pixel+0] = (char) 128;
+ frame_buffer[current_pixel+1] = (char) 0;
+ frame_buffer[current_pixel+2] = (char) 0;
+ }
+ if (i < y2/3*2) {
+ frame_buffer[current_pixel+0] = (char) 0;
+ frame_buffer[current_pixel+1] = (char) 128;
+ frame_buffer[current_pixel+2] = (char) 0;
+ }
+ if (i < y2/3) {
+ frame_buffer[current_pixel+0] = (char) 0;
+ frame_buffer[current_pixel+1] = (char) 0;
+ frame_buffer[current_pixel+2] = (char) 128;
+ }
+ }
+ }
+ }
+
+/* Dscho's versions (slower, but works for bpp != 3 or 4) */
+static void draw_primary_colours_generic(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2)
+{
+ rfbPixelFormat f=s->serverFormat;
+ int i,j;
+ for(j=y1;j<y2;j++)
+ for(i=x1;i<x2;i++)
+ if(j<y1*2/3+y2/3)
+ rfbDrawPixel(s,i,j,f.redMax<<f.redShift);
+ else if(j<y1/3+y2*2/3)
+ rfbDrawPixel(s,i,j,f.greenMax<<f.greenShift);
+ else
+ rfbDrawPixel(s,i,j,f.blueMax<<f.blueShift);
+}
+
+static void draw_primary_colours_generic_fast(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2)
+{
+ rfbPixelFormat f=s->serverFormat;
+ int i,j,y3=(y1*2+y2)/3,y4=(y1+y2*2)/3;
+ /* draw first pixel */
+ rfbDrawPixel(s,x1,y1,f.redMax<<f.redShift);
+ rfbDrawPixel(s,x1,y3,f.greenMax<<f.greenShift);
+ rfbDrawPixel(s,x1,y4,f.blueMax<<f.blueShift);
+ /* then copy stripes */
+ for(j=0;j<y2-y4;j++)
+ for(i=x1;i<x2;i++) {
+#define ADDR(x,y) s->frameBuffer+(x)*bpp+(y)*s->paddedWidthInBytes
+ memcpy(ADDR(i,j+y1),ADDR(x1,y1),bpp);
+ memcpy(ADDR(i,j+y3),ADDR(x1,y3),bpp);
+ memcpy(ADDR(i,j+y4),ADDR(x1,y4),bpp);
+ }
+}
+
+static void draw_primary_colours_generic_ultrafast(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2)
+{
+ rfbPixelFormat f=s->serverFormat;
+ int y3=(y1*2+y2)/3,y4=(y1+y2*2)/3;
+ /* fill rectangles */
+ rfbFillRect(s,x1,y1,x2,y3,f.redMax<<f.redShift);
+ rfbFillRect(s,x1,y3,x2,y4,f.greenMax<<f.greenShift);
+ rfbFillRect(s,x1,y4,x2,y2,f.blueMax<<f.blueShift);
+}
+
+void linecount (char* frame_buffer)
+{
+ int i,j,k, current_pixel;
+ for (i=maxy-4; i>maxy-20; i-=4)
+ for (j=0; j<4; j++) for (k=0; k < maxx; k++) {
+ current_pixel = (i*j*maxx + k) * bpp;
+ if (i%2 == 0) {
+ frame_buffer[current_pixel+0] = (char) 0;
+ frame_buffer[current_pixel+1] = (char) 0;
+ frame_buffer[current_pixel+2] = (char) 128;
+ }
+
+ if (i%2 == 1) {
+ frame_buffer[current_pixel+0] = (char) 128;
+ frame_buffer[current_pixel+1] = (char) 0;
+ frame_buffer[current_pixel+2] = (char) 0;
+ }
+ }
+
+}
+
+
+void on_key_press (rfbBool down,rfbKeySym key,rfbClientPtr cl)
+{
+ if (down) /* or else the action occurs on both the press and depress */
+ switch (key) {
+
+ case XK_b:
+ case XK_B:
+ blank_framebuffer(cl->screen->frameBuffer, 0, 0, maxx, maxy);
+ rfbDrawString(cl->screen,&default8x16Font,20,maxy-20,"Hello, World!",0xffffff);
+ rfbMarkRectAsModified(cl->screen,0, 0,maxx,maxy);
+ rfbLog("Framebuffer blanked\n");
+ break;
+ case XK_p:
+ case XK_P:
+ /* draw_primary_colors (cl->screen->frameBuffer, 0, 0, maxx, maxy); */
+ draw_primary_colours_generic_ultrafast (cl->screen, 0, 0, maxx, maxy);
+ rfbMarkRectAsModified(cl->screen,0, 0,maxx,maxy);
+ rfbLog("Primary colors displayed\n");
+ break;
+ case XK_Q:
+ case XK_q:
+ rfbLog("Exiting now\n");
+ exit(0);
+ case XK_C:
+ case XK_c:
+ rfbDrawString(cl->screen,&default8x16Font,20,100,"Hello, World!",0xffffff);
+ rfbMarkRectAsModified(cl->screen,0, 0,maxx,maxy);
+ break;
+ default:
+ rfbLog("The %c key was pressed\n", (char) key);
+ }
+}
+
+
+void on_mouse_event (int buttonMask,int x,int y,rfbClientPtr cl)
+{
+ printf("buttonMask: %i\n"
+ "x: %i\n" "y: %i\n", buttonMask, x, y);
+}