Blame test/cursortest.c

Packit Service b05338
/*
Packit Service b05338
 * 
Packit Service b05338
 * This is an example of how to use libvncserver.
Packit Service b05338
 * 
Packit Service b05338
 * libvncserver example
Packit Service b05338
 * Copyright (C) 2005 Johannes E. Schindelin <Johannes.Schindelin@gmx.de>,
Packit Service b05338
 * 		Karl Runge <runge@karlrunge.com>
Packit Service b05338
 * 
Packit Service b05338
 *  This is free software; you can redistribute it and/or modify
Packit Service b05338
 *  it under the terms of the GNU General Public License as published by
Packit Service b05338
 *  the Free Software Foundation; either version 2 of the License, or
Packit Service b05338
 *  (at your option) any later version.
Packit Service b05338
 *
Packit Service b05338
 *  This software is distributed in the hope that it will be useful,
Packit Service b05338
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service b05338
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service b05338
 *  GNU General Public License for more details.
Packit Service b05338
 *
Packit Service b05338
 *  You should have received a copy of the GNU General Public License
Packit Service b05338
 *  along with this software; if not, write to the Free Software
Packit Service b05338
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
Packit Service b05338
 *  USA.
Packit Service b05338
 */
Packit Service b05338
Packit Service b05338
#include <rfb/rfb.h>
Packit Service b05338
Packit Service b05338
static const int bpp=4;
Packit Service b05338
static int maxx=800, maxy=600;
Packit Service b05338
Packit Service b05338
/* This initializes a nice (?) background */
Packit Service b05338
Packit Service b05338
static void initBuffer(unsigned char* buffer)
Packit Service b05338
{
Packit Service b05338
	int i,j;
Packit Service b05338
	for(j=0;j
Packit Service b05338
		for(i=0;i
Packit Service b05338
			buffer[(j*maxx+i)*bpp+0]=(i+j)*128/(maxx+maxy); /* red */
Packit Service b05338
			buffer[(j*maxx+i)*bpp+1]=i*128/maxx; /* green */
Packit Service b05338
			buffer[(j*maxx+i)*bpp+2]=j*256/maxy; /* blue */
Packit Service b05338
		}
Packit Service b05338
	}
Packit Service b05338
}
Packit Service b05338
Packit Service b05338
/* Example for an XCursor (foreground/background only) */
Packit Service b05338
Packit Service b05338
static void SetXCursor(rfbScreenInfoPtr rfbScreen)
Packit Service b05338
{
Packit Service b05338
	int width=13,height=11;
Packit Service b05338
	char cursor[]=
Packit Service b05338
		"             "
Packit Service b05338
		" xx       xx "
Packit Service b05338
		"  xx     xx  "
Packit Service b05338
		"   xx   xx   "
Packit Service b05338
		"    xx xx    "
Packit Service b05338
		"     xxx     "
Packit Service b05338
		"    xx xx    "
Packit Service b05338
		"   xx   xx   "
Packit Service b05338
		"  xx     xx  "
Packit Service b05338
		" xx       xx "
Packit Service b05338
		"             ",
Packit Service b05338
	     mask[]=
Packit Service b05338
		"xxxx     xxxx"
Packit Service b05338
		"xxxx     xxxx"
Packit Service b05338
		" xxxx   xxxx "
Packit Service b05338
		"  xxxx xxxx  "
Packit Service b05338
		"   xxxxxxx   "
Packit Service b05338
		"    xxxxx    "
Packit Service b05338
		"   xxxxxxx   "
Packit Service b05338
		"  xxxx xxxx  "
Packit Service b05338
		" xxxx   xxxx "
Packit Service b05338
		"xxxx     xxxx"
Packit Service b05338
		"xxxx     xxxx";
Packit Service b05338
	rfbCursorPtr c;
Packit Service b05338
	
Packit Service b05338
	c=rfbMakeXCursor(width,height,cursor,mask);
Packit Service b05338
	c->xhot=width/2;c->yhot=height/2;
Packit Service b05338
Packit Service b05338
	rfbSetCursor(rfbScreen, c);
Packit Service b05338
}
Packit Service b05338
Packit Service b05338
static void SetXCursor2(rfbScreenInfoPtr rfbScreen)
Packit Service b05338
{
Packit Service b05338
	int width=13,height=22;
Packit Service b05338
	char cursor[]=
Packit Service b05338
		" xx          "
Packit Service b05338
		" x x         "
Packit Service b05338
		" x  x        "
Packit Service b05338
		" x   x       "
Packit Service b05338
		" x    x      "
Packit Service b05338
		" x     x     "
Packit Service b05338
		" x      x    "
Packit Service b05338
		" x       x   "
Packit Service b05338
		" x     xx x  "
Packit Service b05338
		" x x   x xxx "
Packit Service b05338
		" x xx  x   x "
Packit Service b05338
		" xx x   x    "
Packit Service b05338
		" xx  x  x    "
Packit Service b05338
		" x    x  x   "
Packit Service b05338
		" x    x  x   "
Packit Service b05338
		"       x  x  "
Packit Service b05338
		"        x  x "
Packit Service b05338
		"        x  x "
Packit Service b05338
		"         xx  "
Packit Service b05338
		"             "
Packit Service b05338
		"             ",
Packit Service b05338
	     mask[]=
Packit Service b05338
		"xxx          "
Packit Service b05338
		"xxxx         "
Packit Service b05338
		"xxxxx        "
Packit Service b05338
		"xxxxxx       "
Packit Service b05338
		"xxxxxxx      "
Packit Service b05338
		"xxxxxxxx     "
Packit Service b05338
		"xxxxxxxxx    "
Packit Service b05338
		"xxxxxxxxxx   "
Packit Service b05338
		"xxxxxxxxxxx  "
Packit Service b05338
		"xxxxxxxxxxxx "
Packit Service b05338
		"xxxxxxxxxxxxx"
Packit Service b05338
		"xxxxxxxxxxxxx"
Packit Service b05338
		"xxxxxxxxxx  x"
Packit Service b05338
		"xxxxxxxxxx   "
Packit Service b05338
		"xxx  xxxxxx  "
Packit Service b05338
		"xxx  xxxxxx  "
Packit Service b05338
		"xx    xxxxxx "
Packit Service b05338
		"       xxxxx "
Packit Service b05338
		"       xxxxxx"
Packit Service b05338
		"        xxxxx"
Packit Service b05338
		"         xxx "
Packit Service b05338
		"             ";
Packit Service b05338
	rfbCursorPtr c;
Packit Service b05338
	
Packit Service b05338
	c=rfbMakeXCursor(width,height,cursor,mask);
Packit Service b05338
	c->xhot=0;c->yhot=0;
Packit Service b05338
Packit Service b05338
	rfbSetCursor(rfbScreen, c);
Packit Service b05338
}
Packit Service b05338
Packit Service b05338
/* Example for a rich cursor (full-colour) */
Packit Service b05338
Packit Service b05338
static void SetRichCursor(rfbScreenInfoPtr rfbScreen)
Packit Service b05338
{
Packit Service b05338
	int i,j,w=32,h=32;
Packit Service b05338
	/* runge */
Packit Service b05338
	/*  rfbCursorPtr c = rfbScreen->cursor; */
Packit Service b05338
	rfbCursorPtr c;
Packit Service b05338
	char bitmap[]=
Packit Service b05338
		"                                "
Packit Service b05338
		"              xxxxxx            "
Packit Service b05338
		"       xxxxxxxxxxxxxxxxx        "
Packit Service b05338
		"      xxxxxxxxxxxxxxxxxxxxxx    "
Packit Service b05338
		"    xxxxx  xxxxxxxx  xxxxxxxx   "
Packit Service b05338
		"   xxxxxxxxxxxxxxxxxxxxxxxxxxx  "
Packit Service b05338
		"  xxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
Packit Service b05338
		"  xxxxx   xxxxxxxxxxx   xxxxxxx "
Packit Service b05338
		"  xxxx     xxxxxxxxx     xxxxxx "
Packit Service b05338
		"  xxxxx   xxxxxxxxxxx   xxxxxxx "
Packit Service b05338
		" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
Packit Service b05338
		" xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx "
Packit Service b05338
		" xxxxxxxxxxxx  xxxxxxxxxxxxxxx  "
Packit Service b05338
		" xxxxxxxxxxxxxxxxxxxxxxxxxxxx   "
Packit Service b05338
		" xxxxxxxxxxxxxxxxxxxxxxxxxxxx   "
Packit Service b05338
		" xxxxxxxxxxx   xxxxxxxxxxxxxx   "
Packit Service b05338
		" xxxxxxxxxx     xxxxxxxxxxxx    "
Packit Service b05338
		"  xxxxxxxxx      xxxxxxxxx      "
Packit Service b05338
		"   xxxxxxxxxx   xxxxxxxxx       "
Packit Service b05338
		"      xxxxxxxxxxxxxxxxxxx       "
Packit Service b05338
		"       xxxxxxxxxxxxxxxxxxx      "
Packit Service b05338
		"         xxxxxxxxxxxxxxxxxxx    "
Packit Service b05338
		"             xxxxxxxxxxxxxxxxx  "
Packit Service b05338
		"                xxxxxxxxxxxxxxx "
Packit Service b05338
		"   xxxx           xxxxxxxxxxxxx "
Packit Service b05338
		"  xx   x            xxxxxxxxxxx "
Packit Service b05338
		"  xxx               xxxxxxxxxxx "
Packit Service b05338
		"  xxxx             xxxxxxxxxxx  "
Packit Service b05338
		"   xxxxxx       xxxxxxxxxxxx    "
Packit Service b05338
		"    xxxxxxxxxxxxxxxxxxxxxx      "
Packit Service b05338
		"      xxxxxxxxxxxxxxxx          "
Packit Service b05338
		"                                ";
Packit Service b05338
Packit Service b05338
	c=rfbMakeXCursor(w,h,bitmap,bitmap);
Packit Service b05338
	c->xhot = 16; c->yhot = 24;
Packit Service b05338
Packit Service b05338
	c->richSource = (char*)malloc(w*h*bpp);
Packit Service b05338
	for(j=0;j
Packit Service b05338
		for(i=0;i
Packit Service b05338
			c->richSource[j*w*bpp+i*bpp+0]=i*0xff/w;
Packit Service b05338
			c->richSource[j*w*bpp+i*bpp+1]=(i+j)*0xff/(w+h);
Packit Service b05338
			c->richSource[j*w*bpp+i*bpp+2]=j*0xff/h;
Packit Service b05338
			c->richSource[j*w*bpp+i*bpp+3]=0;
Packit Service b05338
		}
Packit Service b05338
	}
Packit Service b05338
	rfbSetCursor(rfbScreen, c);
Packit Service b05338
}
Packit Service b05338
Packit Service b05338
/* runge */
Packit Service b05338
static void SetRichCursor2(rfbScreenInfoPtr rfbScreen)
Packit Service b05338
{
Packit Service b05338
	int i,j,w=17,h=16;
Packit Service b05338
	/*  rfbCursorPtr c = rfbScreen->cursor; */
Packit Service b05338
	rfbCursorPtr c;
Packit Service b05338
	char bitmap[]=
Packit Service b05338
		"                 "
Packit Service b05338
		"xxxx             "
Packit Service b05338
		"xxxxxxxx         "
Packit Service b05338
		"xxxxxxxxxxxx    x"
Packit Service b05338
		"xxx  xxxxxxxx   x"
Packit Service b05338
		"xxxxxxxxxxxxxx  x"
Packit Service b05338
		"xxxxxxxxxxxxxxx x"
Packit Service b05338
		"xxxxx   xxxxxxx x"
Packit Service b05338
		"xxxx     xxxxxx x"
Packit Service b05338
		"xxxxx   xxxxxxx x"
Packit Service b05338
		"xxxxxxxxxxxxxxx x"
Packit Service b05338
		"xxxxxxxxxxxxxxx x"
Packit Service b05338
		"xxxxxxxxxxxxxx  x"
Packit Service b05338
		"xxxxxxxxxxxxx   x"
Packit Service b05338
		"xxxxxxxxxxxxx   x"
Packit Service b05338
		"xxxxxxxxxxxxx   x";
Packit Service b05338
	/*  c=rfbScreen->cursor = rfbMakeXCursor(w,h,bitmap,bitmap); */
Packit Service b05338
	c=rfbMakeXCursor(w,h,bitmap,bitmap);
Packit Service b05338
	c->xhot = 5; c->yhot = 7;
Packit Service b05338
Packit Service b05338
	c->richSource = (char*)malloc(w*h*bpp);
Packit Service b05338
	for(j=0;j
Packit Service b05338
		for(i=0;i
Packit Service b05338
			c->richSource[j*w*bpp+i*bpp+0]=0xff;
Packit Service b05338
			c->richSource[j*w*bpp+i*bpp+1]=0x00;
Packit Service b05338
			c->richSource[j*w*bpp+i*bpp+2]=0x7f;
Packit Service b05338
			c->richSource[j*w*bpp+i*bpp+3]=0;
Packit Service b05338
		}
Packit Service b05338
	}
Packit Service b05338
	rfbSetCursor(rfbScreen, c);
Packit Service b05338
}
Packit Service b05338
Packit Service b05338
/* alpha channel */
Packit Service b05338
Packit Service b05338
static void SetAlphaCursor(rfbScreenInfoPtr screen,int mode)
Packit Service b05338
{
Packit Service b05338
	int i,j;
Packit Service b05338
	rfbCursorPtr c = screen->cursor;
Packit Service b05338
	int maskStride=(c->width+7)/8;
Packit Service b05338
Packit Service b05338
	if(!c)
Packit Service b05338
		return;
Packit Service b05338
Packit Service b05338
	if(c->alphaSource) {
Packit Service b05338
		free(c->alphaSource);
Packit Service b05338
		c->alphaSource=NULL;
Packit Service b05338
	}
Packit Service b05338
Packit Service b05338
	if(mode==0)
Packit Service b05338
		return;
Packit Service b05338
Packit Service b05338
	c->alphaSource = (unsigned char*)malloc(c->width*c->height);
Packit Service b05338
Packit Service b05338
	for(j=0;j<c->height;j++)
Packit Service b05338
		for(i=0;i<c->width;i++) {
Packit Service b05338
			unsigned char value=0x100*i/c->width;
Packit Service b05338
			rfbBool masked=(c->mask[(i/8)+maskStride*j]<<(i&7))&0x80;
Packit Service b05338
			c->alphaSource[i+c->width*j]=(masked?(mode==1?value:0xff-value):0);
Packit Service b05338
		}
Packit Service b05338
	if(c->cleanupMask)
Packit Service b05338
		free(c->mask);
Packit Service b05338
	c->mask=rfbMakeMaskFromAlphaSource(c->width,c->height,c->alphaSource);
Packit Service b05338
	c->cleanupMask=TRUE;
Packit Service b05338
}
Packit Service b05338
Packit Service b05338
/* Here the pointer events are handled */
Packit Service b05338
Packit Service b05338
static void doptr(int buttonMask,int x,int y,rfbClientPtr cl)
Packit Service b05338
{
Packit Service b05338
	static int oldButtonMask=0;
Packit Service b05338
	static int counter=0;
Packit Service b05338
Packit Service b05338
	if((oldButtonMask&1)==0 && (buttonMask&1)==1) {
Packit Service b05338
		switch(++counter) {
Packit Service b05338
		case 7:
Packit Service b05338
			SetRichCursor(cl->screen);
Packit Service b05338
			SetAlphaCursor(cl->screen,2);
Packit Service b05338
			break;
Packit Service b05338
		case 6:
Packit Service b05338
			SetRichCursor(cl->screen);
Packit Service b05338
			SetAlphaCursor(cl->screen,1);
Packit Service b05338
			break;
Packit Service b05338
		case 5:
Packit Service b05338
			SetRichCursor2(cl->screen);
Packit Service b05338
			SetAlphaCursor(cl->screen,0);
Packit Service b05338
			break;
Packit Service b05338
		case 4:
Packit Service b05338
			SetXCursor(cl->screen);
Packit Service b05338
			break;
Packit Service b05338
		case 3:
Packit Service b05338
			SetRichCursor2(cl->screen);
Packit Service b05338
			SetAlphaCursor(cl->screen,2);
Packit Service b05338
			break;
Packit Service b05338
		case 2:
Packit Service b05338
			SetXCursor(cl->screen);
Packit Service b05338
			SetAlphaCursor(cl->screen,2);
Packit Service b05338
			break;
Packit Service b05338
		case 1:
Packit Service b05338
			SetXCursor2(cl->screen);
Packit Service b05338
			SetAlphaCursor(cl->screen,0);
Packit Service b05338
			break;
Packit Service b05338
		default:
Packit Service b05338
			SetRichCursor(cl->screen);
Packit Service b05338
			counter=0;
Packit Service b05338
		}
Packit Service b05338
	}
Packit Service b05338
	if(buttonMask&2) {
Packit Service b05338
		rfbScreenCleanup(cl->screen);
Packit Service b05338
		exit(0);
Packit Service b05338
	}
Packit Service b05338
Packit Service b05338
	if(buttonMask&4)
Packit Service b05338
		rfbCloseClient(cl);
Packit Service b05338
Packit Service b05338
Packit Service b05338
	oldButtonMask=buttonMask;
Packit Service b05338
Packit Service b05338
	rfbDefaultPtrAddEvent(buttonMask,x,y,cl);
Packit Service b05338
}
Packit Service b05338
Packit Service b05338
/* Initialization */
Packit Service b05338
Packit Service b05338
int main(int argc,char** argv)
Packit Service b05338
{
Packit Service b05338
	rfbScreenInfoPtr rfbScreen = rfbGetScreen(&argc,argv,maxx,maxy,8,3,bpp);
Packit Service b05338
        if(!rfbScreen)
Packit Service b05338
          return 0;
Packit Service b05338
Packit Service b05338
	rfbScreen->desktopName = "Cursor Test";
Packit Service b05338
	rfbScreen->frameBuffer = (char*)malloc(maxx*maxy*bpp);
Packit Service b05338
	rfbScreen->ptrAddEvent = doptr;
Packit Service b05338
Packit Service b05338
	initBuffer((unsigned char*)rfbScreen->frameBuffer);
Packit Service b05338
Packit Service b05338
Packit Service b05338
	SetRichCursor(rfbScreen);
Packit Service b05338
Packit Service b05338
	/* initialize the server */
Packit Service b05338
	rfbInitServer(rfbScreen);
Packit Service b05338
Packit Service b05338
	rfbLog("Change cursor shape with left mouse button,\n\t"
Packit Service b05338
			"quit with right one (middle button quits server).\n");
Packit Service b05338
Packit Service b05338
	/* this is the blocking event loop, i.e. it never returns */
Packit Service b05338
	/* 40000 are the microseconds to wait on select(), i.e. 0.04 seconds */
Packit Service b05338
	rfbRunEventLoop(rfbScreen,40000,FALSE);
Packit Service b05338
Packit Service b05338
	free(rfbScreen->frameBuffer);
Packit Service b05338
	rfbScreenCleanup(rfbScreen);
Packit Service b05338
Packit Service b05338
	return(0);
Packit Service b05338
}
Packit Service b05338