diff --git a/contrib/x11vnc.c b/contrib/x11vnc.c index 85366b7..c937a22 100644 --- a/contrib/x11vnc.c +++ b/contrib/x11vnc.c @@ -21,7 +21,7 @@ * * This program is based heavily on the following programs: * - * x11vnc.c of the libvncserver project (Johannes E. Schindelin) + * original x11vnc.c of the libvncserver project (Johannes E. Schindelin) * krfb, the KDE desktopsharing project (Tim Jansen) * x0rfbserver, the original native X vnc server (Jens Wagner) * @@ -62,9 +62,6 @@ * -lsocket -lnsl -L/usr/X/lib -R/usr/X/lib -lX11 -lXext -lXtst */ -#define KeySym RFBKeySym -#include "rfb.h" - #include #include #include @@ -74,7 +71,15 @@ #include #include +#ifdef Bool +#undef Bool +#endif +#define Bool RFBBool +#define KeySym RFBKeySym +#include "rfb.h" + Display *dpy = 0; +int scr; int dpy_x, dpy_y; int bpp; int window; @@ -222,10 +227,12 @@ static void keyboard(Bool down, KeySym keysym, rfbClientPtr client) { X_LOCK - k = XKeysymToKeycode(dpy, keysym); + /* KeySym is XID in */ + k = XKeysymToKeycode(dpy, (XID) keysym); if ( k != NoSymbol ) { - XTestFakeKeyEvent(dpy, k, down, CurrentTime); + /* Bool is int in */ + XTestFakeKeyEvent(dpy, k, (int) down, CurrentTime); XFlush(dpy); got_user_input++; @@ -314,12 +321,31 @@ void initialize_screen(int *argc, char **argv, XImage *fb) { if ( screen->rfbServerFormat.bitsPerPixel == 8 ) { /* 8 bpp */ - screen->rfbServerFormat.redShift = 0; - screen->rfbServerFormat.greenShift = 2; - screen->rfbServerFormat.blueShift = 5; - screen->rfbServerFormat.redMax = 3; - screen->rfbServerFormat.greenMax = 7; - screen->rfbServerFormat.blueMax = 3; + if(CellsOfScreen(ScreenOfDisplay(dpy,scr))) { + /* indexed colour */ + XColor color[256]; + int i; + screen->colourMap.count = 256; + screen->rfbServerFormat.trueColour = FALSE; + screen->colourMap.is16 = TRUE; + for(i=0;i<256;i++) + color[i].pixel=i; + XQueryColors(dpy,DefaultColormap(dpy,scr),color,256); + screen->colourMap.data.shorts = (unsigned short*)malloc(3*sizeof(short)*screen->colourMap.count); + for(i=0;icolourMap.count;i++) { + screen->colourMap.data.shorts[i*3+0] = color[i].red; + screen->colourMap.data.shorts[i*3+1] = color[i].green; + screen->colourMap.data.shorts[i*3+2] = color[i].blue; + } + } else { + /* true colour */ + 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 { /* general case ... */ screen->rfbServerFormat.redShift = 0; @@ -676,7 +702,7 @@ void copy_tile(int tx, int ty) { } X_UNLOCK - src = (unsigned char*) tile->data; + src = tile->data; dst = screen->frameBuffer + y * bytes_per_line + x * pixelsize; s_src = src; @@ -1034,7 +1060,7 @@ int scan_display(int ystart, int rescan) { } /* set ptrs to correspond to the x offset: */ - src = (unsigned char*) scanline->data + x * pixelsize; + src = scanline->data + x * pixelsize; dst = screen->frameBuffer + y * bytes_per_line + x * pixelsize; @@ -1185,35 +1211,35 @@ void watch_loop(void) { } void print_help() { - char help[] = " -x0vnc options: - --defer time time in ms to wait for updates before sending to - client [rfbDeferUpdateTime] (default %d) --wait time time in ms to pause between screen polls. used - to cut down on load (default %d) - --gaps n heuristic to fill in gaps in rows or cols of n or less - tiles. used to improve text paging (default %d). --grow n heuristic to grow islands of changed tiles n or wider - by checking the tile near the boundary (default %d). --fs f if the fraction of changed tiles in a poll is greater - than f, the whole screen is updated (default %.2f) --fuzz n tolerance in pixels to mark a tiles edges as changed. - (default %d). --hints use krfb/x0rfbserver hints (glue changed adjacent - horizontal tiles into one big rectangle) (default %s). --nohints do not use hints; send each tile separately. - --threads use threaded algorithm [rfbRunEventLoop] if compiled - with threads (default %s). --nothreads do not use [rfbRunEventLoop]. --viewonly clients can only watch (default %s). --shared VNC display is shared (default %s) - -These options are passed to libvncserver: - -"; + char help[] = +"x0vnc options:\n" +"\n" +"-defer time time in ms to wait for updates before sending to\n" +" client [rfbDeferUpdateTime] (default %d)\n" +"-wait time time in ms to pause between screen polls. used\n" +" to cut down on load (default %d)\n" +"\n" +"-gaps n heuristic to fill in gaps in rows or cols of n or less\n" +" tiles. used to improve text paging (default %d).\n" +"-grow n heuristic to grow islands of changed tiles n or wider\n" +" by checking the tile near the boundary (default %d).\n" +"-fs f if the fraction of changed tiles in a poll is greater\n" +" than f, the whole screen is updated (default %.2f)\n" +"-fuzz n tolerance in pixels to mark a tiles edges as changed.\n" +" (default %d).\n" +"-hints use krfb/x0rfbserver hints (glue changed adjacent\n" +" horizontal tiles into one big rectangle) (default %s).\n" +"-nohints do not use hints; send each tile separately.\n" +"\n" +"-threads use threaded algorithm [rfbRunEventLoop] if compiled\n" +" with threads (default %s).\n" +"-nothreads do not use [rfbRunEventLoop].\n" +"-viewonly clients can only watch (default %s).\n" +"-shared VNC display is shared (default %s)\n" +"\n" +"These options are passed to libvncserver:\n" +"\n" +; fprintf(stderr, help, defer_update, waitms, gaps_fill, grow_fill, fs_frac, tile_fuzz, use_hints ? "on":"off", use_threads ? "on":"off", @@ -1225,7 +1251,7 @@ These options are passed to libvncserver: int main(int argc, char** argv) { XImage *fb; - int i, scr, ev, er, maj, min; + int i, ev, er, maj, min; char *use_dpy = NULL;