From 9cc78e546033fe8cbc576a9fe1084338ceb47928 Mon Sep 17 00:00:00 2001 From: dscho Date: Tue, 18 Jan 2005 22:53:13 +0000 Subject: [PATCH] add a cursor test (interactive for now) --- test/Makefile.am | 3 +- test/cursortest.c | 342 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 344 insertions(+), 1 deletion(-) create mode 100755 test/cursortest.c diff --git a/test/Makefile.am b/test/Makefile.am index aa010f0..e3fcdd3 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -8,7 +8,8 @@ endif copyrecttest_LDADD=$(LDADD) -lm -noinst_PROGRAMS=$(ENCODINGS_TEST) cargstest copyrecttest $(BACKGROUND_TEST) +noinst_PROGRAMS=$(ENCODINGS_TEST) cargstest copyrecttest $(BACKGROUND_TEST) \ + cursortest test: encodingstest$(EXEEXT) cargstest$(EXEEXT) copyrecttest$(EXEEXT) ./encodingstest && ./cargstest diff --git a/test/cursortest.c b/test/cursortest.c new file mode 100755 index 0000000..79ab6e9 --- /dev/null +++ b/test/cursortest.c @@ -0,0 +1,342 @@ +/* + * + * This is an example of how to use libvncserver. + * + * libvncserver example + * Copyright (C) 2005 Johannes E. Schindelin , + * Karl Runge + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + * USA. + */ + +#include + +const int bpp=4; +int maxx=800, maxy=600; + +/* This initializes a nice (?) background */ + +void initBuffer(unsigned char* buffer) +{ + int i,j; + for(j=0;jxhot=width/2;c->yhot=height/2; + + rfbSetCursor(rfbScreen, c); +} + +void SetXCursor2(rfbScreenInfoPtr rfbScreen) +{ + int width=13,height=22; + char cursor[]= + " xx " + " x x " + " x x " + " x x " + " x x " + " x x " + " x x " + " x x " + " x xx x " + " x x x xxx " + " x xx x x " + " xx x x " + " xx x x " + " x x x " + " x x x " + " x x " + " x x " + " x x " + " xx " + " " + " ", + mask[]= + "xxx " + "xxxx " + "xxxxx " + "xxxxxx " + "xxxxxxx " + "xxxxxxxx " + "xxxxxxxxx " + "xxxxxxxxxx " + "xxxxxxxxxxx " + "xxxxxxxxxxxx " + "xxxxxxxxxxxxx" + "xxxxxxxxxxxxx" + "xxxxxxxxxx x" + "xxxxxxxxxx " + "xxx xxxxxx " + "xxx xxxxxx " + "xx xxxxxx " + " xxxxx " + " xxxxxx" + " xxxxx" + " xxx " + " "; + rfbCursorPtr c; + + c=rfbMakeXCursor(width,height,strdup(cursor),strdup(mask)); + c->xhot=0;c->yhot=0; + + rfbSetCursor(rfbScreen, c); +} + +/* Example for a rich cursor (full-colour) */ + +void SetRichCursor(rfbScreenInfoPtr rfbScreen) +{ + int i,j,w=32,h=32; + /* runge */ + /* rfbCursorPtr c = rfbScreen->cursor; */ + rfbCursorPtr c; + char bitmap[]= + " " + " xxxxxx " + " xxxxxxxxxxxxxxxxx " + " xxxxxxxxxxxxxxxxxxxxxx " + " xxxxx xxxxxxxx xxxxxxxx " + " xxxxxxxxxxxxxxxxxxxxxxxxxxx " + " xxxxxxxxxxxxxxxxxxxxxxxxxxxxx " + " xxxxx xxxxxxxxxxx xxxxxxx " + " xxxx xxxxxxxxx xxxxxx " + " xxxxx xxxxxxxxxxx xxxxxxx " + " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx " + " xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx " + " xxxxxxxxxxxx xxxxxxxxxxxxxxx " + " xxxxxxxxxxxxxxxxxxxxxxxxxxxx " + " xxxxxxxxxxxxxxxxxxxxxxxxxxxx " + " xxxxxxxxxxx xxxxxxxxxxxxxx " + " xxxxxxxxxx xxxxxxxxxxxx " + " xxxxxxxxx xxxxxxxxx " + " xxxxxxxxxx xxxxxxxxx " + " xxxxxxxxxxxxxxxxxxx " + " xxxxxxxxxxxxxxxxxxx " + " xxxxxxxxxxxxxxxxxxx " + " xxxxxxxxxxxxxxxxx " + " xxxxxxxxxxxxxxx " + " xxxx xxxxxxxxxxxxx " + " xx x xxxxxxxxxxx " + " xxx xxxxxxxxxxx " + " xxxx xxxxxxxxxxx " + " xxxxxx xxxxxxxxxxxx " + " xxxxxxxxxxxxxxxxxxxxxx " + " xxxxxxxxxxxxxxxx " + " "; + + c=rfbMakeXCursor(w,h,strdup(bitmap),strdup(bitmap)); + c->xhot = 16; c->yhot = 24; + + c->richSource = (char*)malloc(w*h*bpp); + for(j=0;jrichSource[j*w*bpp+i*bpp+0]=i*0xff/w; + c->richSource[j*w*bpp+i*bpp+1]=(i+j)*0xff/(w+h); + c->richSource[j*w*bpp+i*bpp+2]=j*0xff/h; + c->richSource[j*w*bpp+i*bpp+3]=0; + } + } + rfbSetCursor(rfbScreen, c); +} + +/* runge */ +void SetRichCursor2(rfbScreenInfoPtr rfbScreen) +{ + int i,j,w=17,h=16; + /* rfbCursorPtr c = rfbScreen->cursor; */ + rfbCursorPtr c; + char bitmap[]= + " " + "xxxx " + "xxxxxxxx " + "xxxxxxxxxxxx x" + "xxx xxxxxxxx x" + "xxxxxxxxxxxxxx x" + "xxxxxxxxxxxxxxx x" + "xxxxx xxxxxxx x" + "xxxx xxxxxx x" + "xxxxx xxxxxxx x" + "xxxxxxxxxxxxxxx x" + "xxxxxxxxxxxxxxx x" + "xxxxxxxxxxxxxx x" + "xxxxxxxxxxxxx x" + "xxxxxxxxxxxxx x" + "xxxxxxxxxxxxx x"; + /* c=rfbScreen->cursor = rfbMakeXCursor(w,h,bitmap,bitmap); */ + c=rfbMakeXCursor(w,h,strdup(bitmap),strdup(bitmap)); + c->xhot = 5; c->yhot = 7; + + c->richSource = (char*)malloc(w*h*bpp); + for(j=0;jrichSource[j*w*bpp+i*bpp+0]=0xff; + c->richSource[j*w*bpp+i*bpp+1]=0x00; + c->richSource[j*w*bpp+i*bpp+2]=0x7f; + c->richSource[j*w*bpp+i*bpp+3]=0; + } + } + rfbSetCursor(rfbScreen, c); +} + +/* alpha channel */ + +void SetAlphaCursor(rfbScreenInfoPtr screen,int mode) +{ + int i,j; + rfbCursorPtr c = screen->cursor; + + if(!c) + return; + + if(c->alphaSource) { + free(c->alphaSource); + c->alphaSource=0; + } + + if(mode==0) + return; + + c->alphaSource = (unsigned char*)malloc(c->width*c->height); + + for(j=0;jheight;j++) + for(i=0;iwidth;i++) { + unsigned char value=0x100*j/c->height; + rfbBool masked=(c->mask[(i/8)+(c->width+7)/8*j]<<(i&7))&0x80; + c->alphaSource[i+c->width*j]=(masked?(mode==1?value:0xff-value):0); + } +} + +/* Here the pointer events are handled */ + +void doptr(int buttonMask,int x,int y,rfbClientPtr cl) +{ + static int oldButtonMask=0; + static int counter=0; + + if((oldButtonMask&1)==0 && (buttonMask&1)==1) { + switch(++counter) { + case 7: + SetRichCursor(cl->screen); + SetAlphaCursor(cl->screen,2); + break; + case 6: + SetRichCursor(cl->screen); + SetAlphaCursor(cl->screen,1); + break; + case 5: + SetRichCursor2(cl->screen); + SetAlphaCursor(cl->screen,0); + break; + case 4: + SetXCursor(cl->screen); + break; + case 3: + SetRichCursor2(cl->screen); + SetAlphaCursor(cl->screen,2); + break; + case 2: + SetXCursor(cl->screen); + SetAlphaCursor(cl->screen,2); + break; + case 1: + SetXCursor2(cl->screen); + SetAlphaCursor(cl->screen,0); + break; + default: + SetRichCursor(cl->screen); + counter=0; + } + } + if(buttonMask&4) + rfbCloseClient(cl); + + + oldButtonMask=buttonMask; + + rfbDefaultPtrAddEvent(buttonMask,x,y,cl); +} + +/* Initialization */ + +int main(int argc,char** argv) +{ + rfbScreenInfoPtr rfbScreen = + rfbGetScreen(&argc,argv,maxx,maxy,8,3,bpp); + rfbScreen->desktopName = "Cursor Test"; + rfbScreen->frameBuffer = (char*)malloc(maxx*maxy*bpp); + rfbScreen->ptrAddEvent = doptr; + + initBuffer((unsigned char*)rfbScreen->frameBuffer); + + + SetRichCursor(rfbScreen); + + /* initialize the server */ + rfbInitServer(rfbScreen); + + rfbLog("Change cursor shape with left mouse button,\n\t" + "quit with right one.\n"); + + /* this is the blocking event loop, i.e. it never returns */ + /* 40000 are the microseconds to wait on select(), i.e. 0.04 seconds */ + rfbRunEventLoop(rfbScreen,40000,FALSE); + + rfbFreeCursor(rfbScreen->cursor); + free(rfbScreen->frameBuffer); + rfbScreenCleanup(rfbScreen); + + return(0); +} +