diff options
author | dscho <dscho> | 2001-11-18 21:58:58 +0000 |
---|---|---|
committer | dscho <dscho> | 2001-11-18 21:58:58 +0000 |
commit | e0168dbd9ae5e598f6564aa811cdb252330524c1 (patch) | |
tree | 31e899f132a91910c7a0090803a225bc6e9cfbfb /x11vnc.c | |
parent | 4415df9540afd86671f9169c1542536c71000180 (diff) | |
download | libtdevnc-e0168dbd9ae5e598f6564aa811cdb252330524c1.tar.gz libtdevnc-e0168dbd9ae5e598f6564aa811cdb252330524c1.zip |
start x11vnc, an x0rfbserver clone
Diffstat (limited to 'x11vnc.c')
-rw-r--r-- | x11vnc.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/x11vnc.c b/x11vnc.c new file mode 100644 index 0000000..205d505 --- /dev/null +++ b/x11vnc.c @@ -0,0 +1,135 @@ +#include <X11/Xlib.h> +#include <X11/keysym.h> +#define KEYSYM_H +#include "rfb.h" + +int c=0,blockLength = 32; + +void getImage(Display *dpy,int xscreen,XImage **i) +{ + *i = XGetImage( dpy, + RootWindow(dpy,xscreen), + 0,0, + DisplayWidth(dpy,xscreen), + DisplayHeight(dpy,xscreen), + AllPlanes, + ZPixmap ); +} + +void checkForImageUpdates(rfbScreenInfoPtr s,char *b) +{ + Bool changed; + int i,j,k,l,x1,y1; + for(j=0;j<s->height;j+=blockLength) + for(i=0;i<s->width;i+=blockLength) { + y1=j+blockLength; if(y1>s->height) y1=s->height; + x1=i+blockLength; if(x1>s->width) x1=s->width; + y1*=s->paddedWidthInBytes; + x1*=s->bitsPerPixel/8; + changed=FALSE; + for(l=j*s->paddedWidthInBytes;!changed&&l<y1;l+=s->paddedWidthInBytes) + for(k=i*s->bitsPerPixel/8;k<x1;k++) + if(s->frameBuffer[l+k]!=b[l+k]) { +// fprintf(stderr,"changed: %d, %d\n",k,l); + changed=TRUE; + goto changed_p; + } + if(changed) { + changed_p: + for(;l<0*y1;l++) + memcpy(/*b+l,*/s->frameBuffer+l,b+l,x1-l); + rfbMarkRectAsModified(s,i,j,i+blockLength,j+blockLength); + } + } +} + +int main(int argc,char** argv) +{ + XImage *framebufferImage; + char *backupImage; + Display *dpy; + int xscreen; + rfbScreenInfoPtr screen; + + dpy = XOpenDisplay(""); + xscreen = DefaultScreen(dpy); + + getImage(dpy,xscreen,&framebufferImage); + + screen = rfbGetScreen(&argc,argv,framebufferImage->width, + framebufferImage->height, + framebufferImage->bits_per_pixel, + 8, + framebufferImage->bits_per_pixel/8); + + screen->paddedWidthInBytes = framebufferImage->bytes_per_line; + + screen->rfbServerFormat.bitsPerPixel = framebufferImage->bits_per_pixel; + screen->rfbServerFormat.depth = framebufferImage->depth; + rfbEndianTest = framebufferImage->bitmap_bit_order != MSBFirst; + screen->rfbServerFormat.trueColour = TRUE; + + if ( screen->rfbServerFormat.bitsPerPixel == 8 ) { + screen->rfbServerFormat.redShift = 0; + screen->rfbServerFormat.greenShift = 2; + screen->rfbServerFormat.blueShift = 5; + screen->rfbServerFormat.redMax = 3; + screen->rfbServerFormat.greenMax = 7; + screen->rfbServerFormat.blueMax = 3; + } else { + screen->rfbServerFormat.redShift = 0; + if ( framebufferImage->red_mask ) + while ( ! ( framebufferImage->red_mask & (1 << screen->rfbServerFormat.redShift) ) ) + screen->rfbServerFormat.redShift++; + screen->rfbServerFormat.greenShift = 0; + if ( framebufferImage->green_mask ) + while ( ! ( framebufferImage->green_mask & (1 << screen->rfbServerFormat.greenShift) ) ) + screen->rfbServerFormat.greenShift++; + screen->rfbServerFormat.blueShift = 0; + if ( framebufferImage->blue_mask ) + while ( ! ( framebufferImage->blue_mask & (1 << screen->rfbServerFormat.blueShift) ) ) + screen->rfbServerFormat.blueShift++; + screen->rfbServerFormat.redMax = framebufferImage->red_mask >> screen->rfbServerFormat.redShift; + screen->rfbServerFormat.greenMax = framebufferImage->green_mask >> screen->rfbServerFormat.greenShift; + screen->rfbServerFormat.blueMax = framebufferImage->blue_mask >> screen->rfbServerFormat.blueShift; + } + + backupImage = malloc(screen->height*screen->paddedWidthInBytes); + //memcpy(backupImage,framebufferImage->data,screen->height*screen->paddedWidthInBytes); + screen->frameBuffer = backupImage; + screen->rfbDeferUpdateTime = 500; + screen->cursor = 0; + + rfbInitServer(screen); + + while(1) { + rfbProcessEvents(screen,-1); + if(1 || /*c++>7 &&*/ (!screen->rfbClientHead || !FB_UPDATE_PENDING(screen->rfbClientHead))) { + c=0; + framebufferImage->f.destroy_image(framebufferImage); + getImage(dpy,xscreen,&framebufferImage); + //checkForImageUpdates(screen,framebufferImage->data); + } + fprintf(stderr,"%x\n%x\n---\n",screen->frameBuffer,framebufferImage->data); + memcpy(screen->frameBuffer,framebufferImage->data,screen->height/10*screen->paddedWidthInBytes); + rfbMarkRectAsModified(screen,0,0,screen->width,screen->height); +#if 0 + { + int i,j,r,g,b; + FILE* f=fopen("test.pnm","wb"); + fprintf(f,"P6\n%d %d\n255\n",screen->width,screen->height); + for(j=0;j<screen->height;j++) + for(i=0;i<screen->width;i++) { + //r=screen->frameBuffer[j*screen->paddedWidthInBytes+i*2]; + r=framebufferImage->data[j*screen->paddedWidthInBytes+i*2]; + fputc(((r>>screen->rfbServerFormat.redShift)&screen->rfbServerFormat.redMax)*255/screen->rfbServerFormat.redMax,f); + fputc(((r>>screen->rfbServerFormat.greenShift)&screen->rfbServerFormat.greenMax)*255/screen->rfbServerFormat.greenMax,f); + fputc(((r>>screen->rfbServerFormat.blueShift)&screen->rfbServerFormat.blueMax)*255/screen->rfbServerFormat.blueMax,f); + } + fclose(f); + } +#endif + } + + return(0); +} |