From 1967913e9530139eb355b7b3108bb12314ba47da Mon Sep 17 00:00:00 2001
From: runge <runge>
Date: Sun, 22 Jan 2006 03:56:23 +0000
Subject:  x11vnc: -8to24 opts, use XGetSubImage. fix -threads deadlocks and
 -rawfb crash

---
 x11vnc/8to24.c       | 120 ++++++++++++++++++++++++++++++++++++++++++++-------
 x11vnc/ChangeLog     |   4 ++
 x11vnc/README        | 103 ++++++++++++++++++++++---------------------
 x11vnc/help.c        |  97 +++++++++++++++++++++--------------------
 x11vnc/options.c     |   1 +
 x11vnc/options.h     |   1 +
 x11vnc/pointer.c     |   2 +
 x11vnc/rates.c       |   4 +-
 x11vnc/remote.c      |  21 +++++++++
 x11vnc/screen.c      |   2 +
 x11vnc/tkx11vnc      |   1 +
 x11vnc/tkx11vnc.h    |   1 +
 x11vnc/win_utils.c   |   2 +
 x11vnc/x11vnc.1      | 102 ++++++++++++++++++++++---------------------
 x11vnc/x11vnc.c      |   6 +++
 x11vnc/x11vnc_defs.c |   2 +-
 16 files changed, 310 insertions(+), 159 deletions(-)

diff --git a/x11vnc/8to24.c b/x11vnc/8to24.c
index f0d1786..873ba25 100644
--- a/x11vnc/8to24.c
+++ b/x11vnc/8to24.c
@@ -14,6 +14,7 @@ void mark_8bpp(void);
 
 static void set_root_cmap(void);
 static void check_pointer_in_depth24(void);
+static void parse_cmap8to24(void);
 static int check_depth(Window win, Window top, int doall);
 static int check_depth_win(Window win, Window top, XWindowAttributes attr);
 static int get_8pp_region(sraRegionPtr region8bpp, sraRegionPtr rect,
@@ -44,10 +45,12 @@ static void set_root_cmap(void) {
 		root_cmap = 0;
 	}
 	if (! root_cmap) {
+		X_LOCK;
 		if (valid_window(window, &attr, 1)) {
 			last_set = now;
 			root_cmap = attr.colormap;
 		}
+		X_UNLOCK;
 	}
 }
 
@@ -58,6 +61,7 @@ static window8bpp_t windows_8bpp[MAX_8BPP_WINDOWS];
 static int db24 = 0;
 static int xgetimage_8to24 = 0;
 static int do_hibits = 0;
+static double poll_8to24_delay = 0.0;
 
 static void check_pointer_in_depth24(void) {
 	int tries = 0, in_24 = 0;
@@ -98,13 +102,50 @@ if (db24 > 1) fprintf(stderr, "check_pointer_in_depth24 %d %d %d %d\n", x1, y1,
 	}
 }
 
+static void parse_cmap8to24(void) {
+	if (cmap8to24_str) {
+		char *p, *str = strdup(cmap8to24_str);
+		p = strtok(str, ",");
+		db24 = 0;
+		xgetimage_8to24 = 0;
+		do_hibits = 0;
+		while (p) {
+			if (strstr(p, "dbg=") == p) {
+				db24 = atoi(p + strlen("dbg="));
+			} else if (!strcmp(p, "highbits")) {
+				do_hibits = 1;
+			} else if (!strcmp(p, "getimage")) {
+				xgetimage_8to24 = 1;
+			}
+			p = strtok(NULL, ",");
+		}
+		free(str);
+	} else {
+		if (getenv("DEBUG_8TO24") != NULL) {
+			db24 = atoi(getenv("DEBUG_8TO24"));
+		}
+		if (getenv("XGETIMAGE_8TO24") != NULL) {
+			xgetimage_8to24 = 1;
+		}
+		if (getenv("HIGHBITS_8TO24") != NULL) {
+			do_hibits = 1;
+		}
+	}
+}
+
+void poll_8bpp(void) {
+	
+}
+
 void check_for_multivis(void) {
 	XWindowAttributes attr;
 	int doall = 0;
 	int k, i, cnt, diff;
 	static int first = 1;
+	static double last_parse = 0.0;
 	static double last_update = 0.0;
 	static double last_clear = 0.0;
+	static double last_poll = 0.0;
 	double now = dnow();
 	static Window *stack_old = NULL;
 	static int stack_old_len = 0;
@@ -119,18 +160,15 @@ void check_for_multivis(void) {
 			windows_8bpp[i].cmap = (Colormap) 0;
 			windows_8bpp[i].fetched = 0;
 		}
-		if (getenv("DEBUG_8TO24") != NULL) {
-			db24 = atoi(getenv("DEBUG_8TO24"));
-		}
-		if (getenv("XGETIMAGE_8TO24") != NULL) {
-			xgetimage_8to24 = 1;
-		}
-		if (getenv("HIGHBITS_8TO24") != NULL) {
-			do_hibits = 1;
-		}
 		first = 0;
 		doall = 1;	/* fetch everything first time */
 	}
+
+	if (now > last_parse + 0.75) {
+		last_parse = now;
+		parse_cmap8to24();
+	}
+
 	set_root_cmap();
 
 	/*
@@ -178,6 +216,10 @@ void check_for_multivis(void) {
 		}
 	}
 
+	if (poll_8to24_delay > 0.0 && now > last_poll + poll_8to24_delay) {
+		last_poll = now;
+	}
+
 	/*
 	 * if there are 8bpp visible and a stacking order change
 	 * refresh vnc with coverage of the 8bpp regions:
@@ -410,7 +452,9 @@ if (db24 > 1) fprintf(stderr, "multivis: STORE 0x%lx j: %3d ms: %d dep=%d\n", wi
 			windows_8bpp[j].h = attr.height;
 
 			/* translate x y to be WRT the root window (not parent) */
+			X_LOCK;
 			xtranslate(win, window, 0, 0, &x, &y, &w, 1);
+			X_UNLOCK;
 			windows_8bpp[j].x = x;
 			windows_8bpp[j].y = y;
 
@@ -670,7 +714,7 @@ static void do_8bpp_region(sraRect rect) {
 	int ps, pixelsize = bpp/8;
 
 	int do_getimage = xgetimage_8to24;
-	int line, n_off, j, h, w;
+	int line, n_off, j, h, w, vw;
 	unsigned int hi, idx;
 	XWindowAttributes attr;
 	XErrorHandler old_handler = NULL;
@@ -770,9 +814,18 @@ if (db24 > 1) fprintf(stderr, "transform %d %d %d %d\n", rect.x1, rect.y1, rect.
 		}
 	}
 
-	if (do_getimage && valid_window(best_win, &attr, 1)) {
-		XImage *xi;
+	if (do_getimage) {
+		X_LOCK;
+		vw = valid_window(best_win, &attr, 1);
+		X_UNLOCK;
+	}
+
+	if (do_getimage && vw) {
+		static XImage *xi_8  = NULL;
+		static XImage *xi_24 = NULL;
+		XImage *xi = NULL;
 		Window c;
+		char *d;
 		unsigned int wu, hu;
 		int xo, yo;
 
@@ -792,11 +845,44 @@ if (db24 > 1) fprintf(stderr, "skipping due to potential bad match...\n");
 			return;
 		}
 
+#define GETSUBIMAGE
+#ifdef GETSUBIMAGE
+		if (best_depth == 8) {
+		    if (xi_8 == NULL || xi_8->width != dpy_x || xi_8->height != dpy_y) {
+			if (xi_8) {
+				XDestroyImage(xi_8);
+			}
+			d = (char *) malloc(dpy_x * dpy_y * attr.depth/8);
+			xi_8 = XCreateImage(dpy, attr.visual, attr.depth,
+			    ZPixmap, 0, d, dpy_x, dpy_y, 8, 0);
+if (db24) fprintf(stderr, "xi_8:  %p\n", (void *) xi_8);
+		    }
+		    xi = xi_8;
+		} else if (best_depth == 24) {
+		    if (xi_24 == NULL || xi_24->width != dpy_x || xi_24->height != dpy_y) {
+			if (xi_24) {
+				XDestroyImage(xi_24);
+			}
+			d = (char *) malloc(dpy_x * dpy_y * attr.depth/8);
+			xi_24 = XCreateImage(dpy, attr.visual, attr.depth,
+			    ZPixmap, 0, d, dpy_x, dpy_y, 8, 0);
+if (db24) fprintf(stderr, "xi_24: %p\n", (void *) xi_24);
+		    }
+		    xi = xi_24;
+		}
+#endif
+
+
 		trapped_xerror = 0;
 		old_handler = XSetErrorHandler(trap_xerror);
 		/* FIXME: XGetSubImage? */
+#ifndef GETSUBIMAGE
 		xi = XGetImage(dpy, best_win, xo, yo, wu, hu,
 		    AllPlanes, ZPixmap);
+#else
+		XGetSubImage(dpy, best_win, xo, yo, wu, hu, AllPlanes,
+		    ZPixmap, xi, 0, 0);
+#endif
 		XSetErrorHandler(old_handler);
 		X_UNLOCK;
 
@@ -810,9 +896,11 @@ if (db24 > 1) fprintf(stderr, "xi: 0x%p  %d %d %d %d -- %d %d\n", (void *)xi, xo
 		trapped_xerror = 0;
 
 		if (xi->depth != 8 && xi->depth != 24) {
+#ifndef GETSUBIMAGE
 			X_LOCK;
 			XDestroyImage(xi);
 			X_UNLOCK;
+#endif
 if (db24) fprintf(stderr, "xi: wrong depth: %d\n", xi->depth);
 			return;
 		}
@@ -835,9 +923,9 @@ if (db24) fprintf(stderr, "xi: wrong depth: %d\n", xi->depth);
 
 
 			/* line by line ... */
-			for (line = 0; line < xi->height; line++) {
+			for (line = 0; line < h; line++) {
 				/* pixel by pixel... */
-				for (j = 0; j < xi->width; j++) {
+				for (j = 0; j < w; j++) {
 
 					uc = (unsigned char *) (src + ps1 * j);
 					ui = (unsigned int *)  (dst + ps2 * j);
@@ -861,16 +949,18 @@ if (db24) fprintf(stderr, "xi: wrong depth: %d\n", xi->depth);
 			src = xi->data;
 			dst = cmap8to24_fb + fac * n_off;
 
-			for (line = 0; line < xi->height; line++) {
+			for (line = 0; line < h; line++) {
 				memcpy(dst, src, w * ps1);
 				src += xi->bytes_per_line;
 				dst += main_bytes_per_line * fac;
 			}
 		}
 
+#ifndef GETSUBIMAGE
 		X_LOCK;
 		XDestroyImage(xi);
 		X_UNLOCK;
+#endif
 
 	} else if (! do_getimage) {
 		/* normal mode. */
diff --git a/x11vnc/ChangeLog b/x11vnc/ChangeLog
index 082eeb1..e3d171a 100644
--- a/x11vnc/ChangeLog
+++ b/x11vnc/ChangeLog
@@ -1,3 +1,7 @@
+2006-01-21  Karl Runge <runge@karlrunge.com>
+	* x11vnc: -8to24 opts, use XGetSubImage. fix -threads deadlocks and
+	  -rawfb crash.
+
 2006-01-18  Karl Runge <runge@karlrunge.com>
 	* x11vnc: -8to24 now works on default depth 8 screens.
 
diff --git a/x11vnc/README b/x11vnc/README
index d01b255..1e97c14 100644
--- a/x11vnc/README
+++ b/x11vnc/README
@@ -1,5 +1,5 @@
 
-x11vnc README file                         Date: Wed Jan 18 22:06:12 EST 2006
+x11vnc README file                         Date: Sat Jan 21 20:25:28 EST 2006
 
 The following information is taken from these URLs:
 
@@ -4898,7 +4898,7 @@ x11vnc: a VNC server for real X displays
    Here are all of x11vnc command line options:
 % x11vnc -opts      (see below for -help long descriptions)
 
-x11vnc: allow VNC connections to real X11 displays. 0.8 lastmod: 2006-01-18
+x11vnc: allow VNC connections to real X11 displays. 0.8 lastmod: 2006-01-21
 
 x11vnc options:
   -display disp            -auth file             
@@ -4906,7 +4906,7 @@ x11vnc options:
   -clip WxH+X+Y            -flashcmap             
   -shiftcmap n             -notruecolor           
   -visual n                -overlay               
-  -overlay_nocursor        -8to24                 
+  -overlay_nocursor        -8to24 [opts]          
   -scale fraction          -scale_cursor frac     
   -viewonly                -shared                
   -once                    -forever               
@@ -5009,7 +5009,7 @@ libvncserver-tight-extension options:
 
 % x11vnc -help
 
-x11vnc: allow VNC connections to real X11 displays. 0.8 lastmod: 2006-01-18
+x11vnc: allow VNC connections to real X11 displays. 0.8 lastmod: 2006-01-21
 
 Typical usage is:
 
@@ -5140,25 +5140,24 @@ Options:
 -overlay_nocursor      Sets -overlay, but does not try to draw the exact mouse
                        cursor shape using the overlay mechanism.
 
--8to24                 If -overlay is not supported on your OS, and you have a
-                       legacy 8bpp app that you want to view on a multi-depth
-                       display with default depth 24 (and is 32 bpp), try
-                       this option.  It will also work for a default depth 8
-                       display with depth 24 overlay windows.  This option
+-8to24 [opts]          Try this option if -overlay is not supported on your
+                       OS, and you have a legacy 8bpp app that you want to
+                       view on a multi-depth display with default depth 24
+                       (and is 32 bpp) or have default depth 8 display with
+                       depth 24 overlay windows for some apps.  This option
                        may not work on all X servers and hardware (tested on
-                       XFree86/Xorg mga driver).
-
-                       It enables a hack where x11vnc monitors windows within 3
-                       levels from the root window.  If it finds any that are
-                       8bpp it will apply a transformation for pixel data in
-                       these regions where it extracts the 8bpp index color
-                       value from bits 25-32 and maps them on to TrueColor
-                       values and inserts them into bits 1-24 (i.e. overwrites
-                       bits 1-24).
-
-                       For default depth 8 displays, everything is tranformed
-                       to 32bpp (and is potentially a improvement over
-                       -flashcmap).
+                       XFree86/Xorg mga driver).  The "opts" string is not
+                       required and is described below.
+
+                       This mode enables a hack where x11vnc monitors windows
+                       within 3 levels from the root window.  If it finds
+                       any that are 8bpp it will apply a transformation for
+                       pixel data in these regions where it extracts the 8bpp
+                       index color value from bits 25-32 and maps them on
+                       to TrueColor values and inserts them into bits 1-24
+                       (i.e. overwrites bits 1-24).  Whereas for default
+                       depth 8 displays, everything is tranformed to 32bpp
+                       (and is potentially a improvement over -flashcmap).
 
                        These schemes appear to work, but may still have
                        bugs and note that they do hog resources.  If there
@@ -5175,17 +5174,24 @@ Options:
                        to periodically refresh the screen (at the cost of
                        bandwidth).
 
-                       Debugging for this mode can be enabled by setting the
-                       environment variable DEBUG_8TO24 to 1, 2, or 3.
+                       The [opts] string can contain the following settings.
+                       Multiple settings are separated by commas.
+
+                       For when there are still color problems, enable an even
+                       more experimental mode via the option "getimage".
+                       This enables a scheme were XGetImage() is used to
+                       retrieve the 8bpp data instead of assuming that data
+                       is in bits 25-32.  This mode is significantly slower
+                       than the above mode.  For the default depth 8 case,
+                       XGetImage() is always used to access depth 24 pixel
+                       data.
+
+                       For default depth 8 displays, setting option
+                       "highbits" may give a speedup for transforming 8bpp
+                       pixel data.
 
-                       If there are problems, to enable an even more
-                       experimental mode, set the environment variable
-                       XGETIMAGE_8TO24=1 before starting x11vnc.  This enables
-                       a scheme were XGetImage() is used to retrieve the 8bpp
-                       data instead of assuming that data is in bits 25-32.
-                       This mode is significantly slower than the above mode.
-                       For the default depth 8 case, XGetImage() is always
-                       used to access depth 24 pixel data.
+                       Debugging for this mode can be enabled by setting
+                       "dbg=1", "dbg=2", or "dbg=3"
 
 -scale fraction        Scale the framebuffer by factor "fraction".  Values
                        less than 1 shrink the fb, larger ones expand it.  Note:
@@ -6623,6 +6629,7 @@ n
                                         nooverlay_cursor.
                        8to24           enable  -8to24 mode (if applicable).
                        no8to24         disable -8to24 mode.
+                       8to24_opts:str  set the -8to24 opts to "str".
                        visual:vis      set -visual to "vis"
                        scale:frac      set -scale to "frac"
                        scale_cursor:f  set -scale_cursor to "f"
@@ -6877,22 +6884,22 @@ n
                        truecolor notruecolor overlay nooverlay overlay_cursor
                        overlay_yescursor nooverlay_nocursor nooverlay_cursor
                        nooverlay_yescursor overlay_nocursor 8to24 no8to24
-                       visual scale scale_cursor viewonly noviewonly shared
-                       noshared forever noforever once timeout filexfer deny
-                       lock nodeny unlock connect allowonce allow localhost
-                       nolocalhost listen lookup nolookup accept afteraccept
-                       gone shm noshm flipbyteorder noflipbyteorder onetile
-                       noonetile solid_color solid nosolid blackout xinerama
-                       noxinerama xtrap noxtrap xrandr noxrandr xrandr_mode
-                       padgeom quiet q noquiet modtweak nomodtweak xkb
-                       noxkb skip_keycodes sloppy_keys nosloppy_keys
-                       skip_dups noskip_dups add_keysyms noadd_keysyms
-                       clear_mods noclear_mods clear_keys noclear_keys
-                       remap repeat norepeat fb nofb bell nobell sel nosel
-                       primary noprimary seldir cursorshape nocursorshape
-                       cursorpos nocursorpos cursor show_cursor noshow_cursor
-                       nocursor arrow xfixes noxfixes xdamage noxdamage
-                       xd_area xd_mem alphacut alphafrac alpharemove
+                       8to24_opts visual scale scale_cursor viewonly
+                       noviewonly shared noshared forever noforever once
+                       timeout filexfer deny lock nodeny unlock connect
+                       allowonce allow localhost nolocalhost listen lookup
+                       nolookup accept afteraccept gone shm noshm flipbyteorder
+                       noflipbyteorder onetile noonetile solid_color solid
+                       nosolid blackout xinerama noxinerama xtrap noxtrap
+                       xrandr noxrandr xrandr_mode padgeom quiet q noquiet
+                       modtweak nomodtweak xkb noxkb skip_keycodes sloppy_keys
+                       nosloppy_keys skip_dups noskip_dups add_keysyms
+                       noadd_keysyms clear_mods noclear_mods clear_keys
+                       noclear_keys remap repeat norepeat fb nofb bell
+                       nobell sel nosel primary noprimary seldir cursorshape
+                       nocursorshape cursorpos nocursorpos cursor show_cursor
+                       noshow_cursor nocursor arrow xfixes noxfixes xdamage
+                       noxdamage xd_area xd_mem alphacut alphafrac alpharemove
                        noalpharemove alphablend noalphablend xwarppointer
                        xwarp noxwarppointer noxwarp buttonmap dragging
                        nodragging wireframe_mode wireframe wf nowireframe
diff --git a/x11vnc/help.c b/x11vnc/help.c
index a482de5..3e1d019 100644
--- a/x11vnc/help.c
+++ b/x11vnc/help.c
@@ -148,27 +148,24 @@ void print_help(int mode) {
 "-overlay_nocursor      Sets -overlay, but does not try to draw the exact mouse\n"
 "                       cursor shape using the overlay mechanism.\n"
 "\n"
-"-8to24                 If -overlay is not supported on your OS, and you have a\n"
-"                       legacy 8bpp app that you want to view on a multi-depth\n"
-"                       display with default depth 24 (and is 32 bpp), try\n"
-"                       this option.  It will also work for a default depth 8\n"
-"                       display with depth 24 overlay windows.  This option\n"
+"-8to24 [opts]          Try this option if -overlay is not supported on your\n"
+"                       OS, and you have a legacy 8bpp app that you want to\n"
+"                       view on a multi-depth display with default depth 24\n"
+"                       (and is 32 bpp) or have default depth 8 display with\n"
+"                       depth 24 overlay windows for some apps.  This option\n"
 "                       may not work on all X servers and hardware (tested on\n"
-"                       XFree86/Xorg mga driver).\n"
-"\n"
-"                       It enables a hack where x11vnc monitors windows within 3\n"
-"                       levels from the root window.  If it finds any that are\n"
-"                       8bpp it will apply a transformation for pixel data in\n"
-"                       these regions where it extracts the 8bpp index color\n"
-"                       value from bits 25-32 and maps them on to TrueColor\n"
-"                       values and inserts them into bits 1-24 (i.e. overwrites\n"
-"                       bits 1-24).\n"
-"\n"
-"                       For default depth 8 displays, everything is tranformed\n"
-"                       to 32bpp (and is potentially a improvement over\n"
-"                       -flashcmap).  Also for default depth 8 displays, setting\n"
-"                       the env. var. HIGHBITS_8TO24 may give a speedup for\n"
-"                       transforming 8bpp pixel data.\n"
+"                       XFree86/Xorg mga driver).  The \"opts\" string is not\n"
+"                       required and is described below.\n"
+"\n"
+"                       This mode enables a hack where x11vnc monitors windows\n"
+"                       within 3 levels from the root window.  If it finds\n"
+"                       any that are 8bpp it will apply a transformation for\n"
+"                       pixel data in these regions where it extracts the 8bpp\n"
+"                       index color value from bits 25-32 and maps them on\n"
+"                       to TrueColor values and inserts them into bits 1-24\n"
+"                       (i.e. overwrites bits 1-24).  Whereas for default\n"
+"                       depth 8 displays, everything is tranformed to 32bpp\n"
+"                       (and is potentially a improvement over -flashcmap).\n"
 "\n"
 "                       These schemes appear to work, but may still have\n"
 "                       bugs and note that they do hog resources.  If there\n"
@@ -185,17 +182,24 @@ void print_help(int mode) {
 "                       to periodically refresh the screen (at the cost of\n"
 "                       bandwidth).\n"
 "\n"
-"                       Debugging for this mode can be enabled by setting the\n"
-"                       environment variable DEBUG_8TO24 to 1, 2, or 3.\n"
+"                       The [opts] string can contain the following settings.\n"
+"                       Multiple settings are separated by commas.\n"
 "\n"
-"                       If there are problems, to enable an even more\n"
-"                       experimental mode, set the environment variable\n"
-"                       XGETIMAGE_8TO24=1 before starting x11vnc.  This enables\n"
-"                       a scheme were XGetImage() is used to retrieve the 8bpp\n"
-"                       data instead of assuming that data is in bits 25-32.\n"
-"                       This mode is significantly slower than the above mode.\n"
-"                       For the default depth 8 case, XGetImage() is always\n"
-"                       used to access depth 24 pixel data.\n"
+"                       For when there are still color problems, enable an even\n"
+"                       more experimental mode via the option \"getimage\".\n"
+"                       This enables a scheme were XGetImage() is used to\n"
+"                       retrieve the 8bpp data instead of assuming that data\n"
+"                       is in bits 25-32.  This mode is significantly slower\n"
+"                       than the above mode.  For the default depth 8 case,\n"
+"                       XGetImage() is always used to access depth 24 pixel\n"
+"                       data.\n"
+"\n"
+"                       For default depth 8 displays, setting option\n"
+"                       \"highbits\" may give a speedup for transforming 8bpp\n"
+"                       pixel data.\n"
+"\n"
+"                       Debugging for this mode can be enabled by setting \n"
+"                       \"dbg=1\", \"dbg=2\", or \"dbg=3\"\n"
 "\n"
 "-scale fraction        Scale the framebuffer by factor \"fraction\".  Values\n"
 "                       less than 1 shrink the fb, larger ones expand it.  Note:\n"
@@ -1642,6 +1646,7 @@ void print_help(int mode) {
 "                                        nooverlay_cursor.\n"
 "                       8to24           enable  -8to24 mode (if applicable).\n"
 "                       no8to24         disable -8to24 mode.\n"
+"                       8to24_opts:str  set the -8to24 opts to \"str\".\n"
 "                       visual:vis      set -visual to \"vis\"\n"
 "                       scale:frac      set -scale to \"frac\"\n"
 "                       scale_cursor:f  set -scale_cursor to \"f\"\n"
@@ -1902,22 +1907,22 @@ void print_help(int mode) {
 "                       truecolor notruecolor overlay nooverlay overlay_cursor\n"
 "                       overlay_yescursor nooverlay_nocursor nooverlay_cursor\n"
 "                       nooverlay_yescursor overlay_nocursor 8to24 no8to24\n"
-"                       visual scale scale_cursor viewonly noviewonly shared\n"
-"                       noshared forever noforever once timeout filexfer deny\n"
-"                       lock nodeny unlock connect allowonce allow localhost\n"
-"                       nolocalhost listen lookup nolookup accept afteraccept\n"
-"                       gone shm noshm flipbyteorder noflipbyteorder onetile\n"
-"                       noonetile solid_color solid nosolid blackout xinerama\n"
-"                       noxinerama xtrap noxtrap xrandr noxrandr xrandr_mode\n"
-"                       padgeom quiet q noquiet modtweak nomodtweak xkb\n"
-"                       noxkb skip_keycodes sloppy_keys nosloppy_keys\n"
-"                       skip_dups noskip_dups add_keysyms noadd_keysyms\n"
-"                       clear_mods noclear_mods clear_keys noclear_keys\n"
-"                       remap repeat norepeat fb nofb bell nobell sel nosel\n"
-"                       primary noprimary seldir cursorshape nocursorshape\n"
-"                       cursorpos nocursorpos cursor show_cursor noshow_cursor\n"
-"                       nocursor arrow xfixes noxfixes xdamage noxdamage\n"
-"                       xd_area xd_mem alphacut alphafrac alpharemove\n"
+"                       8to24_opts visual scale scale_cursor viewonly\n"
+"                       noviewonly shared noshared forever noforever once\n"
+"                       timeout filexfer deny lock nodeny unlock connect\n"
+"                       allowonce allow localhost nolocalhost listen lookup\n"
+"                       nolookup accept afteraccept gone shm noshm flipbyteorder\n"
+"                       noflipbyteorder onetile noonetile solid_color solid\n"
+"                       nosolid blackout xinerama noxinerama xtrap noxtrap\n"
+"                       xrandr noxrandr xrandr_mode padgeom quiet q noquiet\n"
+"                       modtweak nomodtweak xkb noxkb skip_keycodes sloppy_keys\n"
+"                       nosloppy_keys skip_dups noskip_dups add_keysyms\n"
+"                       noadd_keysyms clear_mods noclear_mods clear_keys\n"
+"                       noclear_keys remap repeat norepeat fb nofb bell\n"
+"                       nobell sel nosel primary noprimary seldir cursorshape\n"
+"                       nocursorshape cursorpos nocursorpos cursor show_cursor\n"
+"                       noshow_cursor nocursor arrow xfixes noxfixes xdamage\n"
+"                       noxdamage xd_area xd_mem alphacut alphafrac alpharemove\n"
 "                       noalpharemove alphablend noalphablend xwarppointer\n"
 "                       xwarp noxwarppointer noxwarp buttonmap dragging\n"
 "                       nodragging wireframe_mode wireframe wf nowireframe\n"
diff --git a/x11vnc/options.c b/x11vnc/options.c
index 3d548e0..7514452 100644
--- a/x11vnc/options.c
+++ b/x11vnc/options.c
@@ -89,6 +89,7 @@ int flash_cmap = 0;		/* follow installed colormaps */
 int shift_cmap = 0;		/* ncells < 256 and needs shift of pixel values */
 int force_indexed_color = 0;	/* whether to force indexed color for 8bpp */
 int cmap8to24 = 0;		/* -8to24 */
+char *cmap8to24_str = NULL;
 int launch_gui = 0;		/* -gui */
 
 int use_modifier_tweak = 1;	/* use the shift/altgr modifier tweak */
diff --git a/x11vnc/options.h b/x11vnc/options.h
index b734f59..19e1db1 100644
--- a/x11vnc/options.h
+++ b/x11vnc/options.h
@@ -64,6 +64,7 @@ extern int flash_cmap;
 extern int shift_cmap;
 extern int force_indexed_color;
 extern int cmap8to24;
+extern char *cmap8to24_str;
 extern int launch_gui;
 
 extern int use_modifier_tweak;
diff --git a/x11vnc/pointer.c b/x11vnc/pointer.c
index 9622a7d..b7f73fb 100644
--- a/x11vnc/pointer.c
+++ b/x11vnc/pointer.c
@@ -411,6 +411,7 @@ static void update_x11_pointer_mask(int mask) {
 		int skip = 0;
 
 		if (!button_mask) {
+			X_LOCK;
 			if (get_wm_frame_pos(&px, &py, &x, &y, &w, &h,
 			    &frame, &mwin)) {
 				got_wm_frame = 1;
@@ -423,6 +424,7 @@ if (debug_scroll > 1) fprintf(stderr, "wm_win: 0x%lx\n", mwin);
 			} else {
 				got_wm_frame = 0;
 			}
+			X_UNLOCK;
 		}
 		if (got_wm_frame) {
 			if (wireframe && near_wm_edge(x, y, w, h, px, py)) {
diff --git a/x11vnc/rates.c b/x11vnc/rates.c
index b6516b2..24a145b 100644
--- a/x11vnc/rates.c
+++ b/x11vnc/rates.c
@@ -200,7 +200,9 @@ void initialize_speeds(void) {
 		int n = 0;
 		double dt, timer;
 		dtime0(&timer);
-		if (fullscreen) {
+		if (raw_fb && ! dpy) {		/* raw_fb hack */
+			n = 0;
+		} else if (fullscreen) {
 			copy_image(fullscreen, 0, 0, 0, 0);
 			n = fullscreen->bytes_per_line * fullscreen->height;
 		} else if (scanline) {
diff --git a/x11vnc/remote.c b/x11vnc/remote.c
index 8fb7e51..cb1fa7b 100644
--- a/x11vnc/remote.c
+++ b/x11vnc/remote.c
@@ -563,6 +563,7 @@ int remote_control_access_ok(void) {
 			rfbLog("XAUTHORITY is not required on display.\n");
 			rfbLog("   %s\n", DisplayString(dpy));
 			XCloseDisplay(dpy2);
+			dpy2 = NULL;
 			return 0;
 		}
 
@@ -1005,6 +1006,26 @@ char *process_remote_cmd(char *cmd, int stringonly) {
 		cmap8to24 = 0;
 		do_new_fb(0);
 
+	} else if (strstr(p, "8to24_opts") == p) {
+		COLON_CHECK("8to24_opts:")
+		if (query) {
+			snprintf(buf, bufn, "ans=%s%s%s", p, co,
+			    NONUL(cmap8to24_str));
+			goto qry;
+		}
+		p += strlen("8to24_opts:");
+		if (cmap8to24_str) {
+			free(cmap8to24_str);
+		}
+		cmap8to24_str = strdup(p);
+		if (*p == '\0') {
+			cmap8to24 = 0;
+		} else {
+			cmap8to24 = 1;
+		}
+		rfbLog("remote_cmd: set cmap8to24_str to: %s\n", cmap8to24_str);
+		do_new_fb(0);
+
 	} else if (strstr(p, "visual") == p) {
 		COLON_CHECK("visual:")
 		if (query) {
diff --git a/x11vnc/screen.c b/x11vnc/screen.c
index ed2553c..e45b00c 100644
--- a/x11vnc/screen.c
+++ b/x11vnc/screen.c
@@ -980,6 +980,8 @@ static XImage *initialize_raw_fb(void) {
 		raw_fb_image->depth = (b == 32) ? 24 : b;
 	}
 
+	depth = raw_fb_image->depth;
+
 	if (clipshift) {
 		memset(raw_fb, 0xff, dpy_x * dpy_y * b/8);
 	} else if (raw_fb_addr) {
diff --git a/x11vnc/tkx11vnc b/x11vnc/tkx11vnc
index 5429144..439a9f8 100755
--- a/x11vnc/tkx11vnc
+++ b/x11vnc/tkx11vnc
@@ -122,6 +122,7 @@ Screen
 	overlay
 	overlay_nocursor
 	8to24
+	8to24_opts:
 	=GAL LOFF
 	=GAL 8-Bit-Color::
 	flashcmap
diff --git a/x11vnc/tkx11vnc.h b/x11vnc/tkx11vnc.h
index 37d4c6b..bd829d3 100644
--- a/x11vnc/tkx11vnc.h
+++ b/x11vnc/tkx11vnc.h
@@ -133,6 +133,7 @@ char gui_code[] = "";
 "	overlay\n"
 "	overlay_nocursor\n"
 "	8to24\n"
+"	8to24_opts:\n"
 "	=GAL LOFF\n"
 "	=GAL 8-Bit-Color::\n"
 "	flashcmap\n"
diff --git a/x11vnc/win_utils.c b/x11vnc/win_utils.c
index 798d14a..327daae 100644
--- a/x11vnc/win_utils.c
+++ b/x11vnc/win_utils.c
@@ -217,6 +217,7 @@ void update_stack_list(void) {
 
 	dtime0(&now);
 	
+	X_LOCK;
 	for (k=0; k < stack_list_num; k++) {
 		Window win = stack_list[k].win;
 		if (win != None && win < 10) {
@@ -241,6 +242,7 @@ void update_stack_list(void) {
 		stack_list[k].fetched = 1;
 		stack_list[k].time = now;
 	}
+	X_UNLOCK;
 if (0) fprintf(stderr, "update_stack_list[%d]: %.4f  %.4f\n", stack_list_num, now - x11vnc_start, dtime(&now));
 }
 
diff --git a/x11vnc/x11vnc.1 b/x11vnc/x11vnc.1
index 83ea2a5..78cc379 100644
--- a/x11vnc/x11vnc.1
+++ b/x11vnc/x11vnc.1
@@ -2,7 +2,7 @@
 .TH X11VNC "1" "January 2006" "x11vnc " "User Commands"
 .SH NAME
 x11vnc - allow VNC connections to real X11 displays
-         version: 0.8, lastmod: 2006-01-18
+         version: 0.8, lastmod: 2006-01-21
 .SH SYNOPSIS
 .B x11vnc
 [OPTION]...
@@ -178,29 +178,26 @@ visual (e.g. some apps have \fB-use24\fR or \fB-visual\fR options).
 Sets \fB-overlay,\fR but does not try to draw the exact mouse
 cursor shape using the overlay mechanism.
 .PP
-\fB-8to24\fR
+\fB-8to24\fR \fI[opts]\fR
 .IP
-If \fB-overlay\fR is not supported on your OS, and you have a
-legacy 8bpp app that you want to view on a multi-depth
-display with default depth 24 (and is 32 bpp), try
-this option.  It will also work for a default depth 8
-display with depth 24 overlay windows.  This option
+Try this option if \fB-overlay\fR is not supported on your
+OS, and you have a legacy 8bpp app that you want to
+view on a multi-depth display with default depth 24
+(and is 32 bpp) or have default depth 8 display with
+depth 24 overlay windows for some apps.  This option
 may not work on all X servers and hardware (tested on
-XFree86/Xorg mga driver).
-.IP
-It enables a hack where x11vnc monitors windows within 3
-levels from the root window.  If it finds any that are
-8bpp it will apply a transformation for pixel data in
-these regions where it extracts the 8bpp index color
-value from bits 25-32 and maps them on to TrueColor
-values and inserts them into bits 1-24 (i.e. overwrites
-bits 1-24).
-.IP
-For default depth 8 displays, everything is tranformed
-to 32bpp (and is potentially a improvement over
-\fB-flashcmap).\fR  Also for default depth 8 displays, setting
-the env. var. HIGHBITS_8TO24 may give a speedup for
-transforming 8bpp pixel data.
+XFree86/Xorg mga driver).  The "opts" string is not
+required and is described below.
+.IP
+This mode enables a hack where x11vnc monitors windows
+within 3 levels from the root window.  If it finds
+any that are 8bpp it will apply a transformation for
+pixel data in these regions where it extracts the 8bpp
+index color value from bits 25-32 and maps them on
+to TrueColor values and inserts them into bits 1-24
+(i.e. overwrites bits 1-24).  Whereas for default
+depth 8 displays, everything is tranformed to 32bpp
+(and is potentially a improvement over \fB-flashcmap).\fR
 .IP
 These schemes appear to work, but may still have
 bugs and note that they do hog resources.  If there
@@ -217,17 +214,24 @@ Also the option, say, \fB-fixscreen\fR V=3.0 may be use
 to periodically refresh the screen (at the cost of
 bandwidth).
 .IP
-Debugging for this mode can be enabled by setting the
-environment variable DEBUG_8TO24 to 1, 2, or 3.
+The [opts] string can contain the following settings.
+Multiple settings are separated by commas.
 .IP
-If there are problems, to enable an even more
-experimental mode, set the environment variable
-XGETIMAGE_8TO24=1 before starting x11vnc.  This enables
-a scheme were XGetImage() is used to retrieve the 8bpp
-data instead of assuming that data is in bits 25-32.
-This mode is significantly slower than the above mode.
-For the default depth 8 case, XGetImage() is always
-used to access depth 24 pixel data.
+For when there are still color problems, enable an even
+more experimental mode via the option "getimage".
+This enables a scheme were XGetImage() is used to
+retrieve the 8bpp data instead of assuming that data
+is in bits 25-32.  This mode is significantly slower
+than the above mode.  For the default depth 8 case,
+XGetImage() is always used to access depth 24 pixel
+data.
+.IP
+For default depth 8 displays, setting option
+"highbits" may give a speedup for transforming 8bpp
+pixel data.
+.IP
+Debugging for this mode can be enabled by setting
+"dbg=1", "dbg=2", or "dbg=3"
 .PP
 \fB-scale\fR \fIfraction\fR
 .IP
@@ -2035,6 +2039,8 @@ nooverlay_cursor.
 .IP
 no8to24         disable \fB-8to24\fR mode.
 .IP
+8to24_opts:str  set the \fB-8to24\fR opts to "str".
+.IP
 visual:vis      set \fB-visual\fR to "vis"
 .IP
 scale:frac      set \fB-scale\fR to "frac"
@@ -2474,22 +2480,22 @@ nowaitmapped clip flashcmap noflashcmap shiftcmap
 truecolor notruecolor overlay nooverlay overlay_cursor
 overlay_yescursor nooverlay_nocursor nooverlay_cursor
 nooverlay_yescursor overlay_nocursor 8to24 no8to24
-visual scale scale_cursor viewonly noviewonly shared
-noshared forever noforever once timeout filexfer deny
-lock nodeny unlock connect allowonce allow localhost
-nolocalhost listen lookup nolookup accept afteraccept
-gone shm noshm flipbyteorder noflipbyteorder onetile
-noonetile solid_color solid nosolid blackout xinerama
-noxinerama xtrap noxtrap xrandr noxrandr xrandr_mode
-padgeom quiet q noquiet modtweak nomodtweak xkb
-noxkb skip_keycodes sloppy_keys nosloppy_keys
-skip_dups noskip_dups add_keysyms noadd_keysyms
-clear_mods noclear_mods clear_keys noclear_keys
-remap repeat norepeat fb nofb bell nobell sel nosel
-primary noprimary seldir cursorshape nocursorshape
-cursorpos nocursorpos cursor show_cursor noshow_cursor
-nocursor arrow xfixes noxfixes xdamage noxdamage
-xd_area xd_mem alphacut alphafrac alpharemove
+8to24_opts visual scale scale_cursor viewonly
+noviewonly shared noshared forever noforever once
+timeout filexfer deny lock nodeny unlock connect
+allowonce allow localhost nolocalhost listen lookup
+nolookup accept afteraccept gone shm noshm flipbyteorder
+noflipbyteorder onetile noonetile solid_color solid
+nosolid blackout xinerama noxinerama xtrap noxtrap
+xrandr noxrandr xrandr_mode padgeom quiet q noquiet
+modtweak nomodtweak xkb noxkb skip_keycodes sloppy_keys
+nosloppy_keys skip_dups noskip_dups add_keysyms
+noadd_keysyms clear_mods noclear_mods clear_keys
+noclear_keys remap repeat norepeat fb nofb bell
+nobell sel nosel primary noprimary seldir cursorshape
+nocursorshape cursorpos nocursorpos cursor show_cursor
+noshow_cursor nocursor arrow xfixes noxfixes xdamage
+noxdamage xd_area xd_mem alphacut alphafrac alpharemove
 noalpharemove alphablend noalphablend xwarppointer
 xwarp noxwarppointer noxwarp buttonmap dragging
 nodragging wireframe_mode wireframe wf nowireframe
diff --git a/x11vnc/x11vnc.c b/x11vnc/x11vnc.c
index f3811c7..020df6e 100644
--- a/x11vnc/x11vnc.c
+++ b/x11vnc/x11vnc.c
@@ -1273,6 +1273,12 @@ int main(int argc, char* argv[]) {
 			overlay_cursor = 2;
 		} else if (!strcmp(arg, "-8to24")) {
 			cmap8to24 = 1;
+			if (i < argc-1) {
+				char *s = argv[i+1];
+				if (s[0] != '-') {
+					cmap8to24_str = strdup(s);
+				}
+			}
 		} else if (!strcmp(arg, "-visual")) {
 			CHECK_ARGC
 			visual_str = strdup(argv[++i]);
diff --git a/x11vnc/x11vnc_defs.c b/x11vnc/x11vnc_defs.c
index c992008..a4ec2ec 100644
--- a/x11vnc/x11vnc_defs.c
+++ b/x11vnc/x11vnc_defs.c
@@ -15,7 +15,7 @@ int xtrap_base_event_type = 0;
 int xdamage_base_event_type = 0;
 
 /*               date +'lastmod: %Y-%m-%d' */
-char lastmod[] = "0.8 lastmod: 2006-01-18";
+char lastmod[] = "0.8 lastmod: 2006-01-21";
 
 /* X display info */
 
-- 
cgit v1.2.3

