diff options
author | dscho <dscho> | 2005-01-18 22:53:13 +0000 |
---|---|---|
committer | dscho <dscho> | 2005-01-18 22:53:13 +0000 |
commit | 9cc78e546033fe8cbc576a9fe1084338ceb47928 (patch) | |
tree | 5e2d3e9823863991f3b79d9493846b9144c91f9a /test | |
parent | b5bbdae630968e18852c653be8fc18ad11c26f7b (diff) | |
download | libtdevnc-9cc78e546033fe8cbc576a9fe1084338ceb47928.tar.gz libtdevnc-9cc78e546033fe8cbc576a9fe1084338ceb47928.zip |
add a cursor test (interactive for now)
Diffstat (limited to 'test')
-rw-r--r-- | test/Makefile.am | 3 | ||||
-rwxr-xr-x | test/cursortest.c | 342 |
2 files changed, 344 insertions, 1 deletions
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 <Johannes.Schindelin@gmx.de>, + * Karl Runge <runge@karlrunge.com> + * + * 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 <rfb/rfb.h> + +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;j<maxy;++j) { + for(i=0;i<maxx;++i) { + buffer[(j*maxx+i)*bpp+0]=(i+j)*128/(maxx+maxy); /* red */ + buffer[(j*maxx+i)*bpp+1]=i*128/maxx; /* green */ + buffer[(j*maxx+i)*bpp+2]=j*256/maxy; /* blue */ + } + } +} + +/* Example for an XCursor (foreground/background only) */ + +void SetXCursor(rfbScreenInfoPtr rfbScreen) +{ + int width=13,height=11; + char cursor[]= + " " + " xx xx " + " xx xx " + " xx xx " + " xx xx " + " xxx " + " xx xx " + " xx xx " + " xx xx " + " xx xx " + " ", + mask[]= + "xxxx xxxx" + "xxxx xxxx" + " xxxx xxxx " + " xxxx xxxx " + " xxxxxxx " + " xxxxx " + " xxxxxxx " + " xxxx xxxx " + " xxxx xxxx " + "xxxx xxxx" + "xxxx xxxx"; + rfbCursorPtr c; + + c=rfbMakeXCursor(width,height,strdup(cursor),strdup(mask)); + c->xhot=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;j<h;j++) { + for(i=0;i<w;i++) { + c->richSource[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;j<h;j++) { + for(i=0;i<w;i++) { + c->richSource[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;j<c->height;j++) + for(i=0;i<c->width;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); +} + |