diff --git a/prepare_x11vnc_dist.sh b/prepare_x11vnc_dist.sh
index e28ea6d4a8066ae7b4a616b0948657bbed49998f..2f6fec170756a2e6300282a67d574e0a378a8d83 100644
--- a/prepare_x11vnc_dist.sh
+++ b/prepare_x11vnc_dist.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-VERSION="0.9.11"
+VERSION="0.9.13"
 
 cd "$(dirname "$0")"
 
@@ -33,9 +33,10 @@ echo "" >> Makefile.am
 cat Makefile.am.LibVNCServer | \
 sed -e "s/^SUBDIRS.*$/#SUBDIRS=libvncserver libvncclient x11vnc classes/" \
     -e "s/^DIST_SUBDIRS.*$/#DIST_SUBDIRS=libvncserver libvncclient x11vnc classes/" \
-    -e "/all: make_config_executable/,\$d" \
     -e "/^.*bin_SCRIPTS.*$/d" \
-    -e "s/include_/noinst_/" \
+    -e "s/^include_HEADERS/if HAVE_SYSTEM_LIBVNCSERVER^else^include_HEADERS/" \
+    -e "s/rfbclient\.h/rfbclient.h^endif/" \
+    | tr '^' '\n' \
 >> Makefile.am
 
 mv README README.LibVNCServer
diff --git a/x11vnc/8to24.c b/x11vnc/8to24.c
index 4c55e02c6d58c53fc7ebb0b65fc5405f553c5ee1..75ab68a6e416c27e0806c4bd12e09d30670b696b 100644
--- a/x11vnc/8to24.c
+++ b/x11vnc/8to24.c
@@ -412,7 +412,7 @@ if (db24 > 2) fprintf(stderr, " check_for_multivis: %.4f\n", now - last_call);
 
 	/*
 	 * every 10 seconds we try to clean out and also refresh the window
-	 * info in the the 8bpp window table:
+	 * info in the 8bpp window table:
 	 */
 	if (now > last_clear + 10) {
 		last_clear = now;
diff --git a/x11vnc/ChangeLog b/x11vnc/ChangeLog
index 5e9a59cda3d01aaeb0d03e7dc263a363d9ea67e3..8eb44c7e52c3ca7a42881492fd6864b3feca6e77 100644
--- a/x11vnc/ChangeLog
+++ b/x11vnc/ChangeLog
@@ -1,3 +1,20 @@
+2010-09-10  Karl Runge <runge@karlrunge.com>
+	* x11vnc: update classes/ssl jars, patches, and script. 
+	  update prepare_x11vnc_dist.sh to 0.9.13. Makefile.am no top_srcdir
+	  Allow user to set avahi name and port via env. vars.  Add
+	  avahi_timeout() sigalarm.  Rename pointer() to pointer_event()
+	  because Xdefs.h is included for some unknown reason. Add
+	  -always_inject option.  Add vnc_reflect_cursor_pos() for -reflect
+	  mode.  Attempt at libvncclient VeNCrypt (disabled.)  Fix bug
+	  with --with-system-libvncserver missing FinishedFrameBufferUpdate.
+	  More info in VncViewer.class http warning.  Look for gdm* in
+	  find display heuristics (e.g. gdm3).  More heuristics with
+	  XAUTHLOCALHOSTNAME attempts.  X11VNC_CREATE_MAX_DISPLAYS: let user
+	  specify max number of -create displays.  FD_USERPREFS modes for
+	  -unixpw (user conf file.) Document all exiting behavior.  Let
+	  user set X11VNC_NO_LIMIT_SHM to avoid autoreduction.  Look for
+	  kdm when avoiding being killed by dm, change timings too.
+
 2010-05-08  Karl Runge <runge@karlrunge.com>
 	* x11vnc: set cd->unixname in apply_opts.  Print message in
 	  vnc_reflect_resize.  Some tweaks to prepare_x11vnc_dist.sh
diff --git a/x11vnc/Makefile.am b/x11vnc/Makefile.am
index c18f49d59c600d47b8c24c422bfde69ec6b47772..163f930b568b9fe474ffe4f53deaf4158f403673 100644
--- a/x11vnc/Makefile.am
+++ b/x11vnc/Makefile.am
@@ -30,7 +30,6 @@ INCLUDES_LIBVNCSERVER = @SYSTEM_LIBVNCSERVER_CFLAGS@
 else
 INCLUDES_LIBVNCSERVER =
 endif
-INCLUDES = -I$(top_srcdir)
-INCLUDES += $(INCLUDES_LIBVNCSERVER) @X_CFLAGS@ @AVAHI_CFLAGS@
+INCLUDES = $(INCLUDES_LIBVNCSERVER) @X_CFLAGS@ @AVAHI_CFLAGS@
 
 x11vnc_LDADD=$(LDADD) @SSL_LIBS@ @CRYPT_LIBS@ @X_LIBS@ @AVAHI_LIBS@ $(LD_CYGIPC)
diff --git a/x11vnc/README b/x11vnc/README
index d440a8201b072b912fb0788f22c7bcd344088087..8666aad04f666a44f8a9bcae44c74074a1214f61 100644
--- a/x11vnc/README
+++ b/x11vnc/README
@@ -2,7 +2,7 @@
 Copyright (C) 2002-2010 Karl J. Runge <runge@karlrunge.com>
 All rights reserved.
 
-x11vnc README file                         Date: Sat May  8 19:32:50 EDT 2010
+x11vnc README file                         Date: Fri Sep 10 12:29:36 EDT 2010
 
 The following information is taken from these URLs:
 
@@ -586,12 +586,12 @@ vncviewer -via $host localhost:0      # must be TightVNC vncviewer.
    SourceForge.net. I use libvncserver for all of the VNC aspects; I
    couldn't have done without it. The full source code may be found and
    downloaded (either file-release tarball or GIT tree) from the above
-   link. As of May 2010, the x11vnc-0.9.10.tar.gz source package is
-   released (recommended download). The x11vnc 0.9.10 release notes.
+   link. As of Sep 2010, the x11vnc-0.9.12.tar.gz source package is
+   released (recommended download). The x11vnc 0.9.12 release notes.
 
    The x11vnc package is the subset of the libvncserver package needed to
    build the x11vnc program. Also, you can get a copy of my latest,
-   bleeding edge x11vnc-0.9.11-dev.tar.gz tarball to build the most up to
+   bleeding edge x11vnc-0.9.13-dev.tar.gz tarball to build the most up to
    date one.
 
    Precompiled Binaries/Packages:  See the FAQ below for information
@@ -629,13 +629,13 @@ vncviewer -via $host localhost:0      # must be TightVNC vncviewer.
    default.) See this build FAQ for more details.
 
    If your OS has libjpeg.so and libz.so in standard locations you can
-   build as follows (example given for the 0.9.10 release of x11vnc:
+   build as follows (example given for the 0.9.12 release of x11vnc:
    replace with the version you downloaded):
 (un-tar the x11vnc+libvncserver tarball)
-# gzip -dc x11vnc-0.9.10.tar.gz | tar -xvf -
+# gzip -dc x11vnc-0.9.12.tar.gz | tar -xvf -
 
 (cd to the source directory)
-# cd x11vnc-0.9.10
+# cd x11vnc-0.9.12
 
 (run configure and then run make)
 # ./configure
@@ -885,13 +885,13 @@ make
    I'd appreciate any additional testing very much.
 
    Thanks to those who suggested features and helped beta test x11vnc
-   0.9.10 released in May 2010!
+   0.9.12 released in Sep 2010!
 
-   Please help test and debug the 0.9.11 version for release sometime in
-   Summer 2010.
+   Please help test and debug the 0.9.13 version for release sometime in
+   Winter 2010.
 
-   The version 0.9.11 beta tarball is kept here:
-   x11vnc-0.9.11-dev.tar.gz
+   The version 0.9.13 beta tarball is kept here:
+   x11vnc-0.9.13-dev.tar.gz
 
    There are also some Linux, Solaris, Mac OS X, and other OS test
    binaries here. Please kick the tires and report bugs, performance
@@ -908,11 +908,40 @@ make
    settings panel.)
 
 
-   Here are some features that will appear in the 0.9.11 release:
-     * Coming Soon.
-
-
-   Here are some features that appeared in the 0.9.10 release:
+   Here are some features that will appear in the 0.9.13 release:
+     * Coming Soon!
+
+
+   Here are some features that appeared in the 0.9.12 release:
+     * One can now specify the maximum number of displays that can be
+       created in -create mode via the env. var.
+       X11VNC_CREATE_MAX_DISPLAYS
+     * The X11VNC_NO_LIMIT_SHM env. var. is added to skip any automatic
+       shared memory reduction.
+     * The kdm display manager is now detected when trying not to get
+       killed by the display manager.
+     * A compile time bug is fixed so that configuring using
+       --with-system-libvncserver pointing to LibVNCServer 0.9.7 works
+       again. A bug from forced used of Xdefs.h is worked around.
+
+
+   Here are some features that appeared in the 0.9.11 release (Aug/2010):
+     * The source tree is synchronized with the most recent libvncclient
+       (this only affects -reflect mode.) Build is fixed for
+       incompatibilities when using an external LibVNCServer (e.g.
+       ./configure --with-system-libvncserver...) Please help test these
+       build and runtime aspects and report back what you find, thanks.
+     * The SSL enabled Java VNC Viewer Makefile has been modified so that
+       the jar files that are built are compatible back to Java 1.4.
+     * In -create/-unixpw mode, the env. var. FD_USERPREFS may be set to
+       a filename in the user's home directory that includes default
+       username:options values (so the options do not need to be typed
+       every time at the login prompt.)
+     * In -reflect mode cursor position updates are now handled
+       correctly.
+
+
+   Here are some features that appeared in the 0.9.10 release (May/2010):
      * The included SSL enabled Java applet viewer now supports Chained
        SSL Certificates. The debugCerts=yes applet parameter aids
        troubleshooting certificate validation. The x11vnc -ssl mode has
@@ -1982,7 +2011,7 @@ http://www.karlrunge.com/x11vnc/faq.html:
    Q-109: Help! x11vnc and my KDE screensaver keep switching each other
    on and off every few seconds. 
 
-   Q-110: I am running the beryl 3D window manager (or compiz, MythTv,
+   Q-110: I am running the compiz 3D window manager (or beryl, MythTv,
    Google Earth, or some other OpenGL app) and I do not get screen
    updates in x11vnc. 
 
@@ -5702,12 +5731,12 @@ ied)
      * On Firefox/Mozilla (and anything else) turn off "Smooth Scroll"
        animations. In Firefox put in the URL "about:config" and set
        general.smoothScroll to false.
-     * On XFree86 turn on the Shadow Framebuffer to speed up reading.
-       (Option "ShadowFB" "true" in the Device section of
+     * On Xorg/XFree86 turn on the Shadow Framebuffer to speed up
+       reading. (Option "ShadowFB" "true" in the Device section of
        /etc/X11/XF86Config) This disables 2D acceleration on the physical
-       display and so may not be worth it, but could be of use in some
-       situations. If the link is very slow, this speedup may not be
-       noticed.
+       display and so may not be worth it (if you play games, etc), but
+       could be of use in some situations. Note: If the network link is
+       very slow, this speedup may not be noticed.
 
      VNC viewer parameters:
      * Use a TightVNC enabled viewer! (Actually, RealVNC 4.x viewer with
@@ -5726,7 +5755,7 @@ ied)
      * Try other VNC encodings via -encodings (tight may be the fastest,
        but you should compare it to zrle and maybe some of the others)
      * On the machine where vncviewer is run, make sure Backing Store is
-       enabled (XFree86/Xorg disables it by default causing re-exposures
+       enabled (Xorg/XFree86 disables it by default causing re-exposures
        of vncviewer to be very slow) Option "backingstore" in config
        file.
 
@@ -6192,8 +6221,9 @@ EndSection
    shared) client-side caching is that one needs to extend the VNC
    protocol, modify a viewer and then also convince users to adopt your
    modified VNC Viewer (or get the new features to be folded into the
-   main VNC viewers, patches accepted, etc... likely takes years before
-   they might be deployed in the field)
+   main VNC viewers, patches accepted, etc... likely takes many years
+   before they might be deployed in the field.) So it is convenient that
+   the "-ncache n" works with any unaltered VNC viewer.
 
    A drawback of the "-ncache n" method is that in the VNC Viewer you can
    scroll down and actually see the cached pixel data. So it looks like
@@ -6292,13 +6322,14 @@ Section "Device"
 EndSection
 
    No problems like this have been observed with Windows VNC Viewers:
-   they all seem to keep their entire framebuffer in local memory. Gotcha
-   for KDE krdc VNC Viewer: One user found that KDE's krdc viewer has
-   some sort of hardwired limit on the maximum size of the framebuffer
-   (64MB?). It fails quickly saying "The connection to the host has been
-   interrupted." The workaround for his 1280x1024 x11vnc-side display was
-   to run with "-ncache 10", i.e. a smaller value to be under the krdc
-   threshold.
+   they all seem to keep their entire framebuffer in local memory.
+
+   Gotcha for KDE krdc VNC Viewer: One user found that KDE's krdc viewer
+   has some sort of hardwired limit on the maximum size of the
+   framebuffer (64MB?). It fails quickly saying "The connection to the
+   host has been interrupted." The workaround for his 1280x1024
+   x11vnc-side display was to run with "-ncache 10", i.e. a smaller value
+   to be under the krdc threshold.
 
    Although this scheme is not as quick (nor as compressed) as
    nx/nomachine, say, it does provide a good step in the direction of
@@ -7337,18 +7368,18 @@ EndSection
    the screensaver.) Feel free to file a bug against kdesktop_lock with
    KDE.
 
-   Q-110: I am running the beryl 3D window manager (or compiz, MythTv,
+   Q-110: I am running the compiz 3D window manager (or beryl, MythTv,
    Google Earth, or some other OpenGL app) and I do not get screen
    updates in x11vnc.
 
    This appears to be because the 3D OpenGL/GLX hardware screen updates
    do not get reported via the XDAMAGE mechanism. So this is a bug in
-   beryl/compiz or XDAMAGE/Xorg or the (possibly 3rd party) video card
+   compiz/beryl or XDAMAGE/Xorg or the (possibly 3rd party) video card
    driver.
 
    As a workaround apply the -noxdamage option. As of Feb/2007 x11vnc
    will try to autodetect the problem and disable XDAMAGE if is appears
-   to be missing a lot of updates. But if you know you are using beryl
+   to be missing a lot of updates. But if you know you are using compiz
    you might as well always supply -noxdamage. Thanks to this user who
    reported the problem and discovered the workaround.
 
@@ -7361,6 +7392,10 @@ EndSection
    responsiveness (especially for typing) and also leads to unnecessary
    CPU and memory I/O load due to the extra polling.
 
+   Update: as of May/2010 NVIDIA may have fixed this problem in their
+   proprietary drivers. See the NVIDIA Release Notes. (look for
+   'x11vnc'.)
+
    Q-111: Can I use x11vnc to view my VMWare session remotely?
 
    Yes, since VMWare usually runs as an X application you can view it via
@@ -8035,6 +8070,22 @@ rm -f $tmp
    command for you.) Then once you are connected via VNC, iconify the
    Terminal windows (you can't delete them since that will kill x11vnc.)
 
+   Update Aug/2010: A user reports the following useful information:
+This is not a problem on Mac OS X 10.6.x when connecting via ssh to
+start x11vnc.  And, on Mac OS X 10.5.x, the problem can be permanently
+eliminated by doing this:
+
+
+sudo /usr/libexec/PlistBuddy -c 'delete :LimitLoadToSessionType' \
+   -c 'add :LimitLoadToSessionType string Background' \
+   /System/Library/LaunchAgents/com.apple.pboard.plist
+# ignore any 'Delete: Entry, ":LimitLoadToSessionType", Does Not Exist' message
+
+and then restarting (yes, you must restart not just log off).  But
+ONLY do that for Mac OS X 10.5.x and NOT for 10.6.x (which doesn't
+need it anyway).
+
+
    Q-118: Can x11vnc be used as a VNC reflector/repeater to improve
    performance for the case of a large number of simultaneous VNC viewers
    (e.g. classroom broadcasting or a large demo)?
@@ -8367,7 +8418,6 @@ rm -f $tmp
      * SingleWindow: "Select Single Window..."
      * TextChat: "Open Chat..."
      * 1/n Server Scaling
-     * rfbEncodingUltra compression encoding
 
    The SSVNC Unix VNC viewer supports these UltraVNC extensions.
 
@@ -9106,6 +9156,31 @@ x11vnc-remote.o := CFLAGS += -O0
    the command line option to disable optimization, or otherwise have the
    lines set CFLAGS to the empty string.
      _________________________________________________________________
+
+   Broken Thread Local Storage on SuSE 9.2: Starting with x11vnc 0.9.8
+   the bundled libvncserver uses the __thread keyword to make some of the
+   encodings (i.e. tight) thread safe (multiple VNC clients can be using
+   tight at the same time in x11vnc -threads mode.) Evidently on the old
+   SuSE 9.2 system the compiler does not support the thread local storage
+   properly. Here is an example build failure:
+tight.c:1126: error: unrecognizable insn:
+(insn:HI 11 10 13 0 (nil) (set (reg/f:SI 59)
+        (const:SI (plus:SI (symbol_ref:SI ("%lpalette"))
+                (const_int 2048 [0x800])))) -1 (nil)
+    (expr_list:REG_EQUAL (const:SI (plus:SI (symbol_ref:SI ("%lpalette"))
+                (const_int 2048 [0x800])))
+        (nil)))
+tight.c:1126: internal compiler error: in extract_insn, at recog.c:2175
+Please submit a full bug report,
+with preprocessed source if appropriate.
+See URL:http://www.suse.de/feedback for instructions.
+
+   The workaround is to disable thread local storage at configure time
+   like this:
+env CPPFLAGS="-DTLS=''" ./configure
+
+   and then build it.
+     _________________________________________________________________
 	
 =======================================================================
 http://www.karlrunge.com/x11vnc/sunray.html:
@@ -11029,10 +11104,6 @@ Enhanced TightVNC Viewer   (SSVNC:   SSL/SSH VNC viewer)
    simplified Terminal-Services mode (tsvnc) for use with x11vnc on the
    remote side.
 
-   It is also possible (although not recommended) to disable encryption:
-   -noenc cmdline option; Ctrl-E toggle; or Vnc:// host prefix; see the
-   online Help for details.
-
    The tool has many additional features; see the descriptions below.
 
    It is a self-contained bundle, you could carry it around on, say, a
@@ -11217,7 +11288,7 @@ Unix and Mac OS X:
 
     Unpack the archive:
 
-        % gzip -dc ssvnc-1.0.28.tar.gz | tar xvf -
+        % gzip -dc ssvnc-1.0.29.tar.gz | tar xvf -
 
     Run the GUI:
 
@@ -11225,7 +11296,7 @@ Unix and Mac OS X:
 
         % ./ssvnc/MacOSX/ssvnc             (for Mac OS X)
 
-    The smaller file "ssvnc_no_windows-1.0.28.tar.gz"
+    The smaller file "ssvnc_no_windows-1.0.29.tar.gz"
     could have been used as well.
 
     On MacOSX you could also click on the SSVNC app icon in the Finder.
@@ -11271,8 +11342,8 @@ Unix/MacOSX Install:
 
     For the conventional source tarball it will compile and install, e.g.:
 
-       gzip -dc ssvnc-1.0.28.src.tar.gz | tar xvf -
-       cd ssvnc-1.0.28
+       gzip -dc ssvnc-1.0.29.src.tar.gz | tar xvf -
+       cd ssvnc-1.0.29
        make config
        make all
        make PREFIX=/my/install/dir install
@@ -11285,7 +11356,7 @@ Windows:
 
     Unzip, using WinZip or a similar utility, the zip file:
 
-        ssvnc-1.0.28.zip
+        ssvnc-1.0.29.zip
 
     Run the GUI, e.g.:
 
@@ -11297,7 +11368,7 @@ Windows:
 
     select Open, and then OK to launch it.
 
-    The smaller file "ssvnc_windows_only-1.0.28.zip"
+    The smaller file "ssvnc_windows_only-1.0.29.zip"
     could have been used as well.
 
     You can make a Windows shortcut to this program if you want to.
@@ -11964,25 +12035,25 @@ r
    "ssvnc_unix_only" (or "ssvnc_no_windows" to recompile).
       On Mac OS X? Use "ssvnc_no_windows".
       On Windows? Use "ssvnc_windows_only".
-  ssvnc_windows_only-1.0.27.zip      Windows Binaries Only.  No source included
+  ssvnc_windows_only-1.0.28.zip      Windows Binaries Only.  No source included
  (6.2MB)
-  ssvnc_no_windows-1.0.27.tar.gz     Unix and Mac OS X Only. No Windows binarie
+  ssvnc_no_windows-1.0.28.tar.gz     Unix and Mac OS X Only. No Windows binarie
 s.  Source included. (10.1MB)
-  ssvnc_unix_only-1.0.27.tar.gz      Unix Binaries Only.     No source included
+  ssvnc_unix_only-1.0.28.tar.gz      Unix Binaries Only.     No source included
 . (7.2MB)
-  ssvnc_unix_minimal-1.0.27.tar.gz   Unix Minimal.  You must supply your own vn
+  ssvnc_unix_minimal-1.0.28.tar.gz   Unix Minimal.  You must supply your own vn
 cviewer and stunnel. (0.2MB)
 
-  ssvnc-1.0.27.tar.gz                All Unix, Mac OS X, and Windows binaries a
+  ssvnc-1.0.28.tar.gz                All Unix, Mac OS X, and Windows binaries a
 nd source TGZ. (16.1MB)
-  ssvnc-1.0.27.zip                   All Unix, Mac OS X, and Windows binaries a
+  ssvnc-1.0.28.zip                   All Unix, Mac OS X, and Windows binaries a
 nd source ZIP. (16.4MB)
-  ssvnc_all-1.0.27.zip               All Unix, Mac OS X, and Windows binaries a
+  ssvnc_all-1.0.28.zip               All Unix, Mac OS X, and Windows binaries a
 nd source AND full archives in the zip dir. (19.2MB)
 
 
    Here is a conventional source tarball:
-  ssvnc-1.0.27.src.tar.gz            Conventional Source for SSVNC GUI and Unix
+  ssvnc-1.0.28.src.tar.gz            Conventional Source for SSVNC GUI and Unix
  VNCviewer  (0.5MB)
 
    it will be of use to those who do not want the SSVNC
@@ -12000,19 +12071,19 @@ nd source AND full archives in the zip dir. (19.2MB)
    "ssvnc_all", you may need to run the "./build.unix" script in the top
    directory to recompile for your operating system.
 
-   Here are the corresponding 1.0.28 development bundles (Please help
+   Here are the corresponding 1.0.29 development bundles (Please help
    test them):
 
-  ssvnc_windows_only-1.0.28.zip
-  ssvnc_no_windows-1.0.28.tar.gz
-  ssvnc_unix_only-1.0.28.tar.gz
-  ssvnc_unix_minimal-1.0.28.tar.gz
+  ssvnc_windows_only-1.0.29.zip
+  ssvnc_no_windows-1.0.29.tar.gz
+  ssvnc_unix_only-1.0.29.tar.gz
+  ssvnc_unix_minimal-1.0.29.tar.gz
 
-  ssvnc-1.0.28.tar.gz
-  ssvnc-1.0.28.zip
-  ssvnc_all-1.0.28.zip
+  ssvnc-1.0.29.tar.gz
+  ssvnc-1.0.29.zip
+  ssvnc_all-1.0.29.zip
 
-  ssvnc-1.0.28.src.tar.gz            Conventional Source for SSVNC GUI and Unix
+  ssvnc-1.0.29.src.tar.gz            Conventional Source for SSVNC GUI and Unix
  VNCviewer  (0.5MB)
 
 
@@ -12036,6 +12107,7 @@ nd source AND full archives in the zip dir. (19.2MB)
       Release 1.0.25 at Sourceforge.net
       Release 1.0.26 at Sourceforge.net
       Release 1.0.27 at Sourceforge.net
+      Release 1.0.28 at Sourceforge.net
 
 
    Please help test the UltraVNC File Transfer support in the native Unix
@@ -12100,7 +12172,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.9.11 lastmod: 2010-05-08
+x11vnc: allow VNC connections to real X11 displays. 0.9.13 lastmod: 2010-09-10
 
 x11vnc options:
   -display disp            -auth file               -N                     
@@ -12162,41 +12234,42 @@ x11vnc options:
   -noxfixes                -alphacut n              -alphafrac fraction    
   -alpharemove             -noalphablend            -nocursorshape         
   -cursorpos               -nocursorpos             -xwarppointer          
-  -noxwarppointer          -buttonmap string        -nodragging            
-  -ncache n                -ncache_cr               -ncache_no_moveraise   
-  -ncache_no_dtchange      -ncache_no_rootpixmap    -ncache_keep_anims     
-  -ncache_old_wm           -ncache_pad n            -debug_ncache          
-  -wireframe [str]         -nowireframe             -nowireframelocal      
-  -wirecopyrect mode       -nowirecopyrect          -debug_wireframe       
-  -scrollcopyrect mode     -noscrollcopyrect        -scr_area n            
-  -scr_skip list           -scr_inc list            -scr_keys list         
-  -scr_term list           -scr_keyrepeat lo-hi     -scr_parms string      
-  -fixscreen string        -debug_scroll            -noxrecord             
-  -grab_buster             -nograb_buster           -debug_grabs           
-  -debug_sel               -pointer_mode n          -input_skip n          
-  -allinput                -input_eagerly           -speeds rd,bw,lat      
-  -wmdt string             -debug_pointer           -debug_keyboard        
-  -defer time              -wait time               -extra_fbur n          
-  -wait_ui factor          -setdefer n              -nowait_bog            
-  -slow_fb time            -xrefresh time           -nap                   
-  -nonap                   -sb time                 -readtimeout n         
-  -ping n                  -nofbpm                  -fbpm                  
-  -nodpms                  -dpms                    -forcedpms             
-  -clientdpms              -noserverdpms            -noultraext            
-  -chatwindow              -noxdamage               -xd_area A             
-  -xd_mem f                -sigpipe string          -threads               
-  -nothreads               -fs f                    -gaps n                
-  -grow n                  -fuzz n                  -debug_tiles           
-  -snapfb                  -rawfb string            -freqtab file          
-  -pipeinput cmd           -macnodim                -macnosleep            
-  -macnosaver              -macnowait               -macwheel n            
-  -macnoswap               -macnoresize             -maciconanim n         
-  -macmenu                 -macuskbd                -gui [gui-opts]        
-  -remote command          -query variable          -QD variable           
-  -sync                    -query_retries str       -remote_prefix str     
-  -noremote                -yesremote               -unsafe                
-  -safer                   -privremote              -nocmds                
-  -allowedcmds list        -deny_all              
+  -noxwarppointer          -always_inject           -buttonmap string      
+  -nodragging              -ncache n                -ncache_cr             
+  -ncache_no_moveraise     -ncache_no_dtchange      -ncache_no_rootpixmap  
+  -ncache_keep_anims       -ncache_old_wm           -ncache_pad n          
+  -debug_ncache            -wireframe [str]         -nowireframe           
+  -nowireframelocal        -wirecopyrect mode       -nowirecopyrect        
+  -debug_wireframe         -scrollcopyrect mode     -noscrollcopyrect      
+  -scr_area n              -scr_skip list           -scr_inc list          
+  -scr_keys list           -scr_term list           -scr_keyrepeat lo-hi   
+  -scr_parms string        -fixscreen string        -debug_scroll          
+  -noxrecord               -grab_buster             -nograb_buster         
+  -debug_grabs             -debug_sel               -pointer_mode n        
+  -input_skip n            -allinput                -input_eagerly         
+  -speeds rd,bw,lat        -wmdt string             -debug_pointer         
+  -debug_keyboard          -defer time              -wait time             
+  -extra_fbur n            -wait_ui factor          -setdefer n            
+  -nowait_bog              -slow_fb time            -xrefresh time         
+  -nap                     -nonap                   -sb time               
+  -readtimeout n           -ping n                  -nofbpm                
+  -fbpm                    -nodpms                  -dpms                  
+  -forcedpms               -clientdpms              -noserverdpms          
+  -noultraext              -chatwindow              -noxdamage             
+  -xd_area A               -xd_mem f                -sigpipe string        
+  -threads                 -nothreads               -fs f                  
+  -gaps n                  -grow n                  -fuzz n                
+  -debug_tiles             -snapfb                  -rawfb string          
+  -freqtab file            -pipeinput cmd           -macnodim              
+  -macnosleep              -macnosaver              -macnowait             
+  -macwheel n              -macnoswap               -macnoresize           
+  -maciconanim n           -macmenu                 -macuskbd              
+  -gui [gui-opts]          -remote command          -query variable        
+  -QD variable             -sync                    -query_retries str     
+  -remote_prefix str       -noremote                -yesremote             
+  -unsafe                  -safer                   -privremote            
+  -nocmds                  -allowedcmds list        -deny_all              
+
 
 LibVNCServer options:
 -rfbport port          TCP port for RFB protocol
@@ -12230,7 +12303,7 @@ libvncserver-tight-extension options:
 
 % x11vnc -help
 
-x11vnc: allow VNC connections to real X11 displays. 0.9.11 lastmod: 2010-05-08
+x11vnc: allow VNC connections to real X11 displays. 0.9.13 lastmod: 2010-09-10
 
 (type "x11vnc -opts" to just list the options.)
 
@@ -12633,6 +12706,12 @@ Options:
 -forever               Keep listening for more connections rather than exiting
                        as soon as the first client(s) disconnect. Same as -many
 
+                       To get the standard non-shared VNC behavior where when
+                       a new VNC client connects the existing VNC client is
+                       dropped use:  -nevershared -forever   This method can
+                       also be used to guard against hung TCP connections that
+                       do not go away.
+
 -loop                  Create an outer loop restarting the x11vnc process
                        whenever it terminates.  -bg and -inetd are ignored
                        in this mode (however see -loopbg below).
@@ -12740,6 +12819,11 @@ Options:
                        may need to start avahi-daemon and open udp port 5353
                        in your firewall.
 
+                       You can set X11VNC_AVAHI_NAME, X11VNC_AVAHI_HOST,
+                       and/or X11VNC_AVAHI_PORT environment variables
+                       to override the default values.  For example:
+                       -env X11VNC_AVAHI_NAME=wally
+
                        If the avahi API cannot be found at build time, a helper
                        program like avahi-publish(1) or dns-sd(1) will be tried
 
@@ -13366,13 +13450,13 @@ Options:
                        virtual terminal of the X server.
 -listdpy               Have the FINDDISPLAY program list all of your displays
                        (i.e. all the X displays on the local machine that you
-                       have access rights to).
+                       have access rights to).  x11vnc then exits.
 
 -findauth [disp]       Apply the -find/-finddpy heuristics to try to guess
                        the XAUTHORITY file for DISPLAY 'disp'.  If 'disp'
                        is not supplied, then the value in the -display on
                        the cmdline is used; failing that $DISPLAY is used;
-                       and failing that ":0" is used.
+                       and failing that ":0" is used.  x11vnc then exits.
 
                        If nothing is printed out, that means no XAUTHORITY was
                        found for 'disp'; i.e. failure.  If "XAUTHORITY="
@@ -13608,8 +13692,19 @@ Options:
                        if the viewer-side supplied value is not completely
                        composed of alphanumeric or '_' or '-' characters.
 
+                       User preferences file: Instead of having the user type
+                       in geom=WxH,... etc. every time he logs in to find
+                       or create his X session, if you set FD_USERPREFS to
+                       a string that does not contain the "/" character,
+                       then the user's home directory is prepended to that
+                       string and if the file exists its first line is read
+                       and appended to any options he supplied at the login:
+                       prompt.  For example -env FD_USERPREFS=.x11vnc_create
+                       and the user put "geom=1600x1200" in his
+                       ~/.x11vnc_create file.
+
                        To troubleshoot the FINDCREATEDISPLAY mechanism,
-                       set the following env. var. to an ouput log file,
+                       set the following env. var. to an output log file,
                        e.g -env CREATE_DISPLAY_OUTPUT=/tmp/mydebug.txt
 
                        To disable the option setting set the environment
@@ -13699,6 +13794,8 @@ Options:
 
                        It will start looking for an open display number at :20
                        Override via X11VNC_CREATE_STARTING_DISPLAY_NUMBER=n
+                       By default 80 X displays are allowed (i.e. going to :99)
+                       Override via X11VNC_CREATE_MAX_DISPLAYS=n
 
                        By default FINDCREATEDISPLAY will try Xvfb and then
                        Xdummy:
@@ -14221,6 +14318,7 @@ Options:
 
 -sslGenCA [dir]        Generate your own Certificate Authority private key,
                        certificate, and other files in directory [dir].
+                       x11vnc then exits.
 
                        If [dir] is not supplied, a -ssldir setting is used,
                        or otherwise ~/.vnc/certs is used.
@@ -14231,7 +14329,7 @@ Options:
                        in PATH.
 
                        After the CA files and directories are created the
-                       command exits; the VNC server is not run.
+                       x11vnc command exits; the VNC server is not run.
 
                        You will be prompted for information to put into the CA
                        certificate.  The info does not have to be accurate just
@@ -14259,8 +14357,8 @@ Options:
                        -sslGenCA.  The openssl(1) program must be installed
                        on the system and available in PATH.
 
-                       After the Certificate is generated the command exits;
-                       the VNC server is not run.
+                       After the Certificate is generated x11vnc exits; the
+                       VNC server is not run.
 
                        The type of key to be generated is the string "type".
                        It is either "server" (i.e. for use by x11vnc) or
@@ -14379,7 +14477,7 @@ Options:
                                scp ~/.vnc/certs/clients/roger.pem somehost:.
                                rm  ~/.vnc/certs/clients/roger.pem
 
-                       x11vnc is then started with the the option -sslverify
+                       x11vnc is then started with the option -sslverify
                        ~/.vnc/certs/clients/roger.crt (or simply -sslverify
                        roger), and on the viewer user on somehost could do
                        for example:
@@ -14402,7 +14500,7 @@ Options:
 
                        The openssl(1) program must be installed on the system
                        and available in PATH.  After the Key file is encrypted
-                       the command exits; the VNC server is not run.
+                       the x11vnc command exits; the VNC server is not run.
 
                        Examples:
                                x11vnc -sslEncKey /path/to/foo.pem
@@ -14414,6 +14512,9 @@ Options:
                        The openssl(1) program must be in PATH. Basically the
                        command "openssl x509 -text" is run on the pem.
 
+                       After the info is printed the x11vnc command exits;
+                       the VNC server is not run.
+
                        The "SAVE" notation described under -ssl applies
                        as well.
 
@@ -14439,13 +14540,13 @@ Options:
                        also be lowercase, e.g. "list".
 
 -sslDelCert pem        Prompts you to delete all .crt .pem .key .req files
-                       associated with [pem].  "SAVE" and lookups as in
-                       -sslCertInfo apply as well.
+                       associated with [pem].  x11vnc then exits. "SAVE"
+                       and lookups as in -sslCertInfo apply as well.
 
 -sslScripts            Prints out both the 'genCA' and 'genCert' x11vnc
                        openssl wrapper scripts for you to examine, modify, etc.
-                       The scripts are printed to stdout and then the program
-                       exits.
+                       The scripts are printed to stdout and then the x11vnc
+                       program exits.
 
 
 -stunnel [pem]         Use the stunnel(8) (stunnel.mirt.net) to provide an
@@ -15015,6 +15116,9 @@ t
                        just use 1 shm tile for polling.  Limits shm segments
                        used to 3.
 
+                       To disable any automatic shm reduction set the
+                       env. var. X11VNC_NO_LIMIT_SHM.
+
 -solid [color]         To improve performance, when VNC clients are connected
                        try to change the desktop background to a solid color.
                        The [color] is optional: the default color is "cyan4".
@@ -15265,7 +15369,7 @@ t
                        the wire and are applied correctly to the x11vnc-side
                        X server.  Note this mode probably won't do what you
                        want in -nomodtweak mode.  Also, a kludge for KP_n
-                       digits is always done it this mode: they are mapped to
+                       digits is always done in this mode: they are mapped to
                        regular digit keysyms.  See also -capslock above.
                        The default is -noskip_lockkeys.
 
@@ -15548,6 +15652,34 @@ t
                        enabled by default if XINERAMA is found to be active.
                        To prevent this, use -noxwarppointer.
 
+-always_inject         Even if there is no displacement (dx = dy = 0) for a
+                       VNC mouse event force the pointer to the indicated x,y
+                       position anyway.  Recent (2009) gui toolkits (gnome)
+                       have problems with x11vnc's original mouse input
+                       injection method.  So x11vnc's mouse input injection
+                       method has been modified.  To regain the OLD behavior
+                       use this option: -always_inject.  Then x11vnc will
+                       always force positioning the mouse to the x,y position
+                       even if that position has not changed since the previous
+                       VNC input event.
+
+                       The first place this problem was noticed was in gnome
+                       terminal: if you pressed and released mouse button 3, a
+                       menu was posted and then its first element 'New Terminal
+                       Window' was activated.  This was because x11vnc injected
+                       the mouse position twice: once on ButtonPress and again
+                       on ButtonRelease.  The toolkit interpreted the 2nd one
+                       as mouse motion even though the mouse hadn't moved.
+                       So now by default x11vnc tries to avoid injecting the
+                       2nd one.
+
+                       Note that with the new default x11vnc will be oblivious
+                       to applications moving the pointer (warping) or the
+                       user at the physical display moving it.  So it might,
+                       e.g., inject ButtonRelease at the wrong position.
+                       If this (or similar scenarios) causes problems in your
+                       environment, specify -always_inject for the old method.
+
 -buttonmap string      String to remap mouse buttons.  Format: IJK-LMN, this
                        maps buttons I -> L, etc., e.g.  -buttonmap 13-31
 
@@ -16005,7 +16137,7 @@ t
                        the whole-server grabbing application expects mouse or
                        keyboard input before releasing the grab.  It is usually
                        a window manager that does this.  x11vnc takes care to
-                       avoid the the problem, but if caught x11vnc will freeze.
+                       avoid the problem, but if caught x11vnc will freeze.
                        Without -grab_buster, the only solution is to go the
                        physical display and give it some input to satisfy the
                        grabbing app.  Or manually kill and restart the window
@@ -16845,7 +16977,7 @@ er
 -macuskbd              For the native MacOSX server, use the original
                        keystroke insertion code based on a US keyboard.
 
--gui [gui-opts]        Start up a simple tcl/tk gui based on the the remote
+-gui [gui-opts]        Start up a simple tcl/tk gui based on the remote
                        control options -remote/-query described below.
                        Requires the "wish" program to be installed on the
                        machine.  "gui-opts" is not required: the default
@@ -16976,9 +17108,9 @@ n
                        x11vnc server.  "-R" and "-r" are aliases for
                        "-remote".  After the remote control command is
                        sent to the running server the 'x11vnc -remote ...'
-                       command exits.  You can often use the -query command
-                       (see below) to see if the x11vnc server processed your
-                       -remote command.
+                       x11vnc command exits.  You can often use the -query
+                       command (see below) to see if the x11vnc server
+                       processed your -remote command.
 
                        The default communication channel is that of X
                        properties (specifically X11VNC_REMOTE), and so this
@@ -17231,6 +17363,8 @@ n
                        nocursorpos     enable  -nocursorpos mode.
                        xwarp           enable  -xwarppointer mode.
                        noxwarp         disable -xwarppointer mode.
+                       always_inject   enable  -always_inject mode.
+                       noalways_inject disable -always_inject mode.
                        buttonmap:str   set -buttonmap "str", empty to disable
                        dragging        disable -nodragging mode.
                        nodragging      enable  -nodragging mode.
@@ -17555,11 +17689,11 @@ n
                        nosetprimary clipboard noclipboard setclipboard
                        nosetclipboard seldir cursorshape nocursorshape
                        cursorpos nocursorpos cursor_drag nocursor_drag 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 ncache_cr
+                       show_cursor noshow_cursor nocursor arrow xfixes noxfixes
+                       xdamage noxdamage xd_area xd_mem alphacut alphafrac
+                       alpharemove noalpharemove alphablend noalphablend
+                       xwarppointer xwarp noxwarppointer noxwarp always_inject
+                       noalways_inject buttonmap dragging nodragging ncache_cr
                        noncache_cr ncache_no_moveraise noncache_no_moveraise
                        ncache_no_dtchange noncache_no_dtchange
                        ncache_no_rootpixmap noncache_no_rootpixmap
diff --git a/x11vnc/avahi.c b/x11vnc/avahi.c
index 7f38d57ffc0d7dd3b2865212ea7b0bc23e10ce33..7c646b7914543cc3a08a95bf5bd916bc520b59e0 100644
--- a/x11vnc/avahi.c
+++ b/x11vnc/avahi.c
@@ -37,7 +37,7 @@ so, delete this exception statement from your version.
 #include "cleanup.h"
 
 void avahi_initialise(void);
-void avahi_advertise(const char *name, const char *host, const uint16_t port);
+void avahi_advertise(char *name, char *host, uint16_t port);
 void avahi_reset(void);
 void avahi_cleanup(void);
 
@@ -45,12 +45,13 @@ static pid_t avahi_pid = 0;
 
 static void kill_avahi_pid(void) {
 	if (avahi_pid != 0) {
+		rfbLog("kill_avahi_pid: %d\n", (int) avahi_pid);
 		kill(avahi_pid, SIGTERM);
 		avahi_pid = 0;
 	}
 }
 
-static int try_avahi_helper(const char *name, const char *host, const uint16_t port) {
+static int try_avahi_helper(char *name, char *host, uint16_t port) {
 #if LIBVNCSERVER_HAVE_FORK
 	char *cmd, *p, *path = getenv("PATH"), portstr[32];
 	int i;
@@ -146,7 +147,12 @@ void avahi_initialise(void) {
 	rfbLog("avahi_initialise: no Avahi support at buildtime.\n");
 }
 
-void avahi_advertise(const char *name, const char *host, const uint16_t port) {
+void avahi_advertise(char *name, char *host, uint16_t port) {
+	char *t;
+	t = getenv("X11VNC_AVAHI_NAME"); if (t) name = t;
+	t = getenv("X11VNC_AVAHI_HOST"); if (t) host = t;
+	t = getenv("X11VNC_AVAHI_PORT"); if (t) port = atoi(t);
+
 	if (!try_avahi_helper(name, host, port)) {
 		rfbLog("avahi_advertise:  no Avahi support at buildtime.\n");
 		avahi = 0;
@@ -243,8 +249,8 @@ if (db) fprintf(stderr, "    avahi_initialise: poll not null\n");
 if (db) fprintf(stderr, "out avahi_initialise\n");
 }
 
-static void _avahi_create_services(const char *name, const char *host,
-    const uint16_t port);
+static void _avahi_create_services(char *name, char *host,
+    uint16_t port);
 
 static void _avahi_entry_group_callback(AvahiEntryGroup *g,
     AvahiEntryGroupState state, void *userdata) {
@@ -285,12 +291,11 @@ if (db) fprintf(stderr, "in  _avahi_entry_group_callback %d 0x%p\n", state, svc)
 if (db) fprintf(stderr, "out _avahi_entry_group_callback\n");
 }
 
-static void _avahi_create_services(const char *name, const char *host,
-    const uint16_t port) {
+static void _avahi_create_services(char *name, char *host, uint16_t port) {
 	avahi_service_t *svc = (avahi_service_t *)malloc(sizeof(avahi_service_t));
 	int ret = 0;
 
-if (db) fprintf(stderr, "in  _avahi_create_services  %s %s %d\n", name, host, port);
+if (db) fprintf(stderr, "in  _avahi_create_services  '%s' '%s' %d\n", name, host, port);
 	svc->name = name;
 	svc->host = host;
 	svc->port = port;
@@ -323,9 +328,14 @@ if (db) fprintf(stderr, "    _avahi_create_services create group\n");
 if (db) fprintf(stderr, "out _avahi_create_services\n");
 }
 
-void avahi_advertise(const char *name, const char *host, const uint16_t port) {
+void avahi_advertise(char *name, char *host, uint16_t port) {
 	int i;
-if (db) fprintf(stderr, "in  avahi_advertise: %s %s %d\n", name, host, port);
+	char *t;
+	t = getenv("X11VNC_AVAHI_NAME"); if (t) name = t;
+	t = getenv("X11VNC_AVAHI_HOST"); if (t) host = t;
+	t = getenv("X11VNC_AVAHI_PORT"); if (t) port = atoi(t);
+
+if (db) fprintf(stderr, "in  avahi_advertise: '%s' '%s' %d\n", name, host, port);
 	if (!_client) {
 if (db) fprintf(stderr, "    avahi_advertise client null\n");
 		return;
@@ -388,18 +398,34 @@ if (db) fprintf(stderr, "    avahi_reset client/group null\n");
 if (db) fprintf(stderr, "out avahi_reset\n");
 }
 
+static void avahi_timeout (int sig) {
+	int i;
+	rfbLog("sig: %d, avahi_cleanup timed out.\n", sig);
+	exit(1);
+}
+
+
 void avahi_cleanup(void) {
 if (db) fprintf(stderr, "in  avahi_cleanup\n");
 	if (!_client) {
 if (db) fprintf(stderr, "    avahi_cleanup client null\n");
 		return;
 	}
+if (db) fprintf(stderr, "    avahi_cleanup poll_lock\n");
 	avahi_threaded_poll_lock(_poll);
+if (db) fprintf(stderr, "    avahi_cleanup poll_stop\n");
+
+	signal(SIGALRM, avahi_timeout);
+	alarm(3);
 	avahi_threaded_poll_stop(_poll);
+	alarm(0);
+	signal(SIGALRM, SIG_DFL);
 
+if (db) fprintf(stderr, "    avahi_cleanup client_free\n");
 	avahi_client_free(_client);
 	_client = NULL;
 
+if (db) fprintf(stderr, "    avahi_cleanup poll_free\n");
 	avahi_threaded_poll_free(_poll);
 	_poll = NULL;
 if (db) fprintf(stderr, "out avahi_cleanup\n");
diff --git a/x11vnc/avahi.h b/x11vnc/avahi.h
index a8a07e3f96e7e6b83bcdf95608f2427da4a02be1..7b7a6bcf6ede3b79e4c4d00f898969de89e05f27 100644
--- a/x11vnc/avahi.h
+++ b/x11vnc/avahi.h
@@ -36,7 +36,7 @@ so, delete this exception statement from your version.
 /* -- avahi.h -- */
 
 extern void avahi_initialise(void);
-extern void avahi_advertise(const char *name, const char *host, const uint16_t port);
+extern void avahi_advertise(char *name, char *host, uint16_t port);
 extern void avahi_reset(void);
 extern void avahi_cleanup(void);
 
diff --git a/x11vnc/cleanup.c b/x11vnc/cleanup.c
index e9222b5ec5cfb4357f9f0d05f6940a5572d8f5c1..4ecef424d2628a8ff236ba64323af869dda85828 100644
--- a/x11vnc/cleanup.c
+++ b/x11vnc/cleanup.c
@@ -165,9 +165,6 @@ void clean_up_exit(int ret) {
 		ssl_helper_pid(0, 0);	/* killall */
 	}
 
-	if (avahi) {
-		avahi_cleanup();
-	}
 	if (ssh_pid > 0) {
 		kill(ssh_pid, SIGTERM);
 		ssh_pid = 0;
@@ -242,6 +239,11 @@ void clean_up_exit(int ret) {
 		rm_flagfile = NULL;
 	}
 
+	if (avahi) {
+		avahi_cleanup();
+		fflush(stderr);
+	}
+
 	exit(ret);
 }
 
diff --git a/x11vnc/connections.c b/x11vnc/connections.c
index d1af60e514f5885734b15a5516297b34fcce508e..abb7a27a47bdaba7f9d56801ca6f5c870dc2658e 100644
--- a/x11vnc/connections.c
+++ b/x11vnc/connections.c
@@ -932,11 +932,7 @@ void client_gone(rfbClientPtr client) {
 			kill(gui_pid, SIGTERM);
 		}
 		CLIENT_UNLOCK;
-		if (connect_or_exit) {
-			clean_up_exit(1);
-		} else {
-			clean_up_exit(0);
-		}
+		clean_up_exit(0);
 	}
 #ifdef MACOSX
 	if (macosx_console && client_count == 0) {
@@ -3149,7 +3145,7 @@ static void pmove(int x, int y) {
 		return;
 	}
 	rfbLog("pmove: x y: %d %d\n", x, y);
-	pointer(0, x, y, NULL);
+	pointer_event(0, x, y, NULL);
 	X_LOCK;
 	XFlush_wr(dpy);
 	X_UNLOCK;
diff --git a/x11vnc/help.c b/x11vnc/help.c
index 90dddfd5259c767fa1498b5cba9a9439ad70bb10..5eb80ccd47f1b08eeb6791b4628a01580339b93f 100644
--- a/x11vnc/help.c
+++ b/x11vnc/help.c
@@ -467,6 +467,12 @@ void print_help(int mode) {
 "-forever               Keep listening for more connections rather than exiting\n"
 "                       as soon as the first client(s) disconnect. Same as -many\n"
 "\n"
+"                       To get the standard non-shared VNC behavior where when\n"
+"                       a new VNC client connects the existing VNC client is\n"
+"                       dropped use:  -nevershared -forever   This method can\n"
+"                       also be used to guard against hung TCP connections that\n"
+"                       do not go away.\n"
+"\n"
 "-loop                  Create an outer loop restarting the x11vnc process\n"
 "                       whenever it terminates.  -bg and -inetd are ignored\n"
 "                       in this mode (however see -loopbg below).\n"
@@ -574,6 +580,11 @@ void print_help(int mode) {
 "                       may need to start avahi-daemon and open udp port 5353\n"
 "                       in your firewall.\n"
 "\n"
+"                       You can set X11VNC_AVAHI_NAME, X11VNC_AVAHI_HOST,\n"
+"                       and/or X11VNC_AVAHI_PORT environment variables\n"
+"                       to override the default values.  For example:\n"
+"                       -env X11VNC_AVAHI_NAME=wally\n"
+"\n"
 "                       If the avahi API cannot be found at build time, a helper\n"
 "                       program like avahi-publish(1) or dns-sd(1) will be tried\n"
 "\n"
@@ -1212,13 +1223,13 @@ void print_help(int mode) {
 "                       virtual terminal of the X server.\n"
 "-listdpy               Have the FINDDISPLAY program list all of your displays\n"
 "                       (i.e. all the X displays on the local machine that you\n"
-"                       have access rights to).\n"
+"                       have access rights to).  x11vnc then exits.\n"
 "\n"
 "-findauth [disp]       Apply the -find/-finddpy heuristics to try to guess\n"
 "                       the XAUTHORITY file for DISPLAY 'disp'.  If 'disp'\n"
 "                       is not supplied, then the value in the -display on\n"
 "                       the cmdline is used; failing that $DISPLAY is used;\n"
-"                       and failing that \":0\" is used.\n"
+"                       and failing that \":0\" is used.  x11vnc then exits.\n"
 "\n"
 "                       If nothing is printed out, that means no XAUTHORITY was\n"
 "                       found for 'disp'; i.e. failure.  If \"XAUTHORITY=\"\n"
@@ -1454,8 +1465,19 @@ void print_help(int mode) {
 "                       if the viewer-side supplied value is not completely\n"
 "                       composed of alphanumeric or '_' or '-' characters.\n"
 "\n"
+"                       User preferences file: Instead of having the user type\n"
+"                       in geom=WxH,... etc. every time he logs in to find\n"
+"                       or create his X session, if you set FD_USERPREFS to\n"
+"                       a string that does not contain the \"/\" character,\n"
+"                       then the user's home directory is prepended to that\n"
+"                       string and if the file exists its first line is read\n"
+"                       and appended to any options he supplied at the login:\n"
+"                       prompt.  For example -env FD_USERPREFS=.x11vnc_create\n"
+"                       and the user put \"geom=1600x1200\" in his\n"
+"                       ~/.x11vnc_create file.\n"
+"\n"
 "                       To troubleshoot the FINDCREATEDISPLAY mechanism,\n"
-"                       set the following env. var. to an ouput log file,\n"
+"                       set the following env. var. to an output log file,\n"
 "                       e.g -env CREATE_DISPLAY_OUTPUT=/tmp/mydebug.txt\n"
 "\n"
 "                       To disable the option setting set the environment\n"
@@ -1544,6 +1566,8 @@ void print_help(int mode) {
 "\n"
 "                       It will start looking for an open display number at :20\n"
 "                       Override via X11VNC_CREATE_STARTING_DISPLAY_NUMBER=n\n"
+"                       By default 80 X displays are allowed (i.e. going to :99)\n"
+"                       Override via X11VNC_CREATE_MAX_DISPLAYS=n\n"
 "\n"
 "                       By default FINDCREATEDISPLAY will try Xvfb and then\n"
 "                       Xdummy:\n"
@@ -2066,6 +2090,7 @@ void print_help(int mode) {
 "\n"
 "-sslGenCA [dir]        Generate your own Certificate Authority private key,\n"
 "                       certificate, and other files in directory [dir].\n"
+"                       x11vnc then exits.\n"
 "\n"
 "                       If [dir] is not supplied, a -ssldir setting is used,\n"
 "                       or otherwise ~/.vnc/certs is used.\n"
@@ -2076,7 +2101,7 @@ void print_help(int mode) {
 "                       in PATH.\n"
 "\n"
 "                       After the CA files and directories are created the\n"
-"                       command exits; the VNC server is not run.\n"
+"                       x11vnc command exits; the VNC server is not run.\n"
 "\n"
 "                       You will be prompted for information to put into the CA\n"
 "                       certificate.  The info does not have to be accurate just\n"
@@ -2104,8 +2129,8 @@ void print_help(int mode) {
 "                       -sslGenCA.  The openssl(1) program must be installed\n"
 "                       on the system and available in PATH.\n"
 "\n"
-"                       After the Certificate is generated the command exits;\n"
-"                       the VNC server is not run.\n"
+"                       After the Certificate is generated x11vnc exits; the\n"
+"                       VNC server is not run.\n"
 "\n"
 "                       The type of key to be generated is the string \"type\".\n"
 "                       It is either \"server\" (i.e. for use by x11vnc) or\n"
@@ -2225,7 +2250,7 @@ void print_help(int mode) {
 "                               scp ~/.vnc/certs/clients/roger.pem somehost:.\n"
 "                               rm  ~/.vnc/certs/clients/roger.pem\n"
 "\n"
-"                       x11vnc is then started with the the option -sslverify\n"
+"                       x11vnc is then started with the option -sslverify\n"
 "                       ~/.vnc/certs/clients/roger.crt (or simply -sslverify\n"
 "                       roger), and on the viewer user on somehost could do\n"
 "                       for example:\n"
@@ -2248,7 +2273,7 @@ void print_help(int mode) {
 "\n"
 "                       The openssl(1) program must be installed on the system\n"
 "                       and available in PATH.  After the Key file is encrypted\n"
-"                       the command exits; the VNC server is not run.\n"
+"                       the x11vnc command exits; the VNC server is not run.\n"
 "\n"
 "                       Examples:\n"
 "                               x11vnc -sslEncKey /path/to/foo.pem\n"
@@ -2260,6 +2285,9 @@ void print_help(int mode) {
 "                       The openssl(1) program must be in PATH. Basically the\n"
 "                       command \"openssl x509 -text\" is run on the pem.\n"
 "\n"
+"                       After the info is printed the x11vnc command exits;\n"
+"                       the VNC server is not run.\n"
+"\n"
 "                       The \"SAVE\" notation described under -ssl applies\n"
 "                       as well.\n"
 "\n"
@@ -2285,13 +2313,13 @@ void print_help(int mode) {
 "                       also be lowercase, e.g. \"list\".\n"
 "\n"
 "-sslDelCert pem        Prompts you to delete all .crt .pem .key .req files\n"
-"                       associated with [pem].  \"SAVE\" and lookups as in\n"
-"                       -sslCertInfo apply as well.\n"
+"                       associated with [pem].  x11vnc then exits. \"SAVE\"\n"
+"                       and lookups as in -sslCertInfo apply as well.\n"
 "\n"
 "-sslScripts            Prints out both the 'genCA' and 'genCert' x11vnc\n"
 "                       openssl wrapper scripts for you to examine, modify, etc.\n"
-"                       The scripts are printed to stdout and then the program\n"
-"                       exits.\n"
+"                       The scripts are printed to stdout and then the x11vnc\n"
+"                       program exits.\n"
 "\n"
 "\n"
 "-stunnel [pem]         Use the stunnel(8) (stunnel.mirt.net) to provide an\n"
@@ -2860,6 +2888,9 @@ void print_help(int mode) {
 "                       just use 1 shm tile for polling.  Limits shm segments\n"
 "                       used to 3.\n"
 "\n"
+"                       To disable any automatic shm reduction set the\n"
+"                       env. var. X11VNC_NO_LIMIT_SHM.\n"
+"\n"
 "-solid [color]         To improve performance, when VNC clients are connected\n"
 "                       try to change the desktop background to a solid color.\n"
 "                       The [color] is optional: the default color is \"cyan4\".\n"
@@ -3109,7 +3140,7 @@ void print_help(int mode) {
 "                       the wire and are applied correctly to the x11vnc-side\n"
 "                       X server.  Note this mode probably won't do what you\n"
 "                       want in -nomodtweak mode.  Also, a kludge for KP_n\n"
-"                       digits is always done it this mode: they are mapped to\n"
+"                       digits is always done in this mode: they are mapped to\n"
 "                       regular digit keysyms.  See also -capslock above.\n"
 "                       The default is -noskip_lockkeys.\n"
 "\n"
@@ -3392,6 +3423,34 @@ void print_help(int mode) {
 "                       enabled by default if XINERAMA is found to be active.\n"
 "                       To prevent this, use -noxwarppointer.\n"
 "\n"
+"-always_inject         Even if there is no displacement (dx = dy = 0) for a\n"
+"                       VNC mouse event force the pointer to the indicated x,y\n"
+"                       position anyway.  Recent (2009) gui toolkits (gnome)\n"
+"                       have problems with x11vnc's original mouse input\n"
+"                       injection method.  So x11vnc's mouse input injection\n"
+"                       method has been modified.  To regain the OLD behavior\n"
+"                       use this option: -always_inject.  Then x11vnc will\n"
+"                       always force positioning the mouse to the x,y position\n"
+"                       even if that position has not changed since the previous\n"
+"                       VNC input event.\n"
+"\n"
+"                       The first place this problem was noticed was in gnome\n"
+"                       terminal: if you pressed and released mouse button 3, a\n"
+"                       menu was posted and then its first element 'New Terminal\n"
+"                       Window' was activated.  This was because x11vnc injected\n"
+"                       the mouse position twice: once on ButtonPress and again\n"
+"                       on ButtonRelease.  The toolkit interpreted the 2nd one\n"
+"                       as mouse motion even though the mouse hadn't moved.\n"
+"                       So now by default x11vnc tries to avoid injecting the\n"
+"                       2nd one.\n"
+"\n"
+"                       Note that with the new default x11vnc will be oblivious\n"
+"                       to applications moving the pointer (warping) or the\n"
+"                       user at the physical display moving it.  So it might,\n"
+"                       e.g., inject ButtonRelease at the wrong position.\n"
+"                       If this (or similar scenarios) causes problems in your\n"
+"                       environment, specify -always_inject for the old method.\n"
+"\n"
 "-buttonmap string      String to remap mouse buttons.  Format: IJK-LMN, this\n"
 "                       maps buttons I -> L, etc., e.g.  -buttonmap 13-31\n"
 "\n"
@@ -3851,7 +3910,7 @@ void print_help(int mode) {
 "                       the whole-server grabbing application expects mouse or\n"
 "                       keyboard input before releasing the grab.  It is usually\n"
 "                       a window manager that does this.  x11vnc takes care to\n"
-"                       avoid the the problem, but if caught x11vnc will freeze.\n"
+"                       avoid the problem, but if caught x11vnc will freeze.\n"
 "                       Without -grab_buster, the only solution is to go the\n"
 "                       physical display and give it some input to satisfy the\n"
 "                       grabbing app.  Or manually kill and restart the window\n"
@@ -4689,7 +4748,7 @@ void print_help(int mode) {
 "-macuskbd              For the native MacOSX server, use the original\n"
 "                       keystroke insertion code based on a US keyboard.\n"
 "\n"
-"-gui [gui-opts]        Start up a simple tcl/tk gui based on the the remote\n"
+"-gui [gui-opts]        Start up a simple tcl/tk gui based on the remote\n"
 "                       control options -remote/-query described below.\n"
 "                       Requires the \"wish\" program to be installed on the\n"
 "                       machine.  \"gui-opts\" is not required: the default\n"
@@ -4819,9 +4878,9 @@ void print_help(int mode) {
 "                       x11vnc server.  \"-R\" and \"-r\" are aliases for\n"
 "                       \"-remote\".  After the remote control command is\n"
 "                       sent to the running server the 'x11vnc -remote ...'\n"
-"                       command exits.  You can often use the -query command\n"
-"                       (see below) to see if the x11vnc server processed your\n"
-"                       -remote command.\n"
+"                       x11vnc command exits.  You can often use the -query\n"
+"                       command (see below) to see if the x11vnc server\n"
+"                       processed your -remote command.\n"
 "\n"
 "                       The default communication channel is that of X\n"
 "                       properties (specifically X11VNC_REMOTE), and so this\n"
@@ -5082,6 +5141,8 @@ void print_help(int mode) {
 "                       nocursorpos     enable  -nocursorpos mode.\n"
 "                       xwarp           enable  -xwarppointer mode.\n"
 "                       noxwarp         disable -xwarppointer mode.\n"
+"                       always_inject   enable  -always_inject mode.\n"
+"                       noalways_inject disable -always_inject mode.\n"
 "                       buttonmap:str   set -buttonmap \"str\", empty to disable\n"
 "                       dragging        disable -nodragging mode.\n"
 "                       nodragging      enable  -nodragging mode.\n"
@@ -5404,11 +5465,11 @@ void print_help(int mode) {
 "                       nosetprimary clipboard noclipboard setclipboard\n"
 "                       nosetclipboard seldir cursorshape nocursorshape\n"
 "                       cursorpos nocursorpos cursor_drag nocursor_drag cursor\n"
-"                       show_cursor noshow_cursor nocursor arrow xfixes\n"
-"                       noxfixes xdamage noxdamage xd_area xd_mem alphacut\n"
-"                       alphafrac alpharemove noalpharemove alphablend\n"
-"                       noalphablend xwarppointer xwarp noxwarppointer\n"
-"                       noxwarp buttonmap dragging nodragging ncache_cr\n"
+"                       show_cursor noshow_cursor nocursor arrow xfixes noxfixes\n"
+"                       xdamage noxdamage xd_area xd_mem alphacut alphafrac\n"
+"                       alpharemove noalpharemove alphablend noalphablend\n"
+"                       xwarppointer xwarp noxwarppointer noxwarp always_inject\n"
+"                       noalways_inject buttonmap dragging nodragging ncache_cr\n"
 "                       noncache_cr ncache_no_moveraise noncache_no_moveraise\n"
 "                       ncache_no_dtchange noncache_no_dtchange\n"
 "                       ncache_no_rootpixmap noncache_no_rootpixmap\n"
@@ -5830,7 +5891,7 @@ void nopassword_warning_msg(int gotloc) {
 	char str4[] =
 "#@                                                           @#\n"
 "#@  To disable this warning use the -nopw option, or put     @#\n"
-"#@  the setting in your ~/.x11vncrc file.                    @#\n"
+"#@  'nopw' on a line in your ~/.x11vncrc file.               @#\n"
 "#@                                                           @#\n"
 "#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#\n"
 "###############################################################\n"
@@ -5845,7 +5906,7 @@ void nopassword_warning_msg(int gotloc) {
 	fprintf(stderr, "%s", str1);
 	fflush(stderr);
 #if !PASSWD_REQUIRED
-	usleep(1000 * 1000);
+	usleep(750 * 1000);
 #endif
 	if (!quiet) {
 		fprintf(stderr, "%s", str2);
@@ -5858,7 +5919,7 @@ void nopassword_warning_msg(int gotloc) {
 	}
 	fflush(stderr);
 #if !PASSWD_REQUIRED
-	usleep(500 * 1000);
+	usleep(250 * 1000);
 #endif
 }
 
diff --git a/x11vnc/inet.c b/x11vnc/inet.c
index a70ce241d5bd16b4ffbddc4dc4d4e95a00344555..a7410ee1cd2a13132b8078f4e1e3c633201bcfbf 100644
--- a/x11vnc/inet.c
+++ b/x11vnc/inet.c
@@ -347,7 +347,7 @@ char *ident_username(rfbClientPtr client) {
 			if (ret > 0) {
 				int i;
 				char *q, *p;
-				for (i=0; i < sizeof(msg); i++) {
+				for (i=0; i < (int) sizeof(msg); i++) {
 					msg[i] = '\0';
 				}
 				usleep(250*1000);
diff --git a/x11vnc/keyboard.c b/x11vnc/keyboard.c
index edce68016a1a698b0fbcf29325d64ad369c58b94..9e9e044f6479bf0d4360231ef1761ff7f7502c4f 100644
--- a/x11vnc/keyboard.c
+++ b/x11vnc/keyboard.c
@@ -1325,7 +1325,7 @@ xkbmodifiers[]    For the KeySym bound to this (keycode,group,level) store
 	 * loop over all possible (keycode, group, level) triples
 	 * and record what we find for it:
 	 */
-	if (debug_keyboard > 1) {
+	if (debug_keyboard) {
 		rfbLog("initialize_xkb_modtweak: XKB keycode -> keysyms "
 		    "mapping info:\n");
 	}
@@ -1502,7 +1502,7 @@ xkbmodifiers[]    For the KeySym bound to this (keycode,group,level) store
 				xkbignore[kc][grp][lvl] = mods_save | ms2;
 			}
 
-			if (debug_keyboard > 1) {
+			if (debug_keyboard) {
 				char *str;
 				fprintf(stderr, "  %03d  G%d L%d  mod=%s ",
 				    kc, grp+1, lvl+1, bitprint(ms, 8));
@@ -1560,7 +1560,7 @@ xkbmodifiers[]    For the KeySym bound to this (keycode,group,level) store
 		}
 		free(str);
 	}
-	if (debug_keyboard > 1) {
+	if (debug_keyboard) {
 		fprintf(stderr, "grp_max=%d lvl_max=%d\n", grp_max, lvl_max);
 	}
 }
@@ -2898,9 +2898,9 @@ static void pipe_keyboard(rfbBool down, rfbKeySym keysym, rfbClientPtr client) {
 			t[1] = '\0';
 			if (sscanf(t, "%d", &butt) == 1) {
 				mask = 1<<(butt-1);
-				pointer(mask, x, y, client);
+				pointer_event(mask, x, y, client);
 				mask = 0;
-				pointer(mask, x, y, client);
+				pointer_event(mask, x, y, client);
 			}
 			b++;
 		}
diff --git a/x11vnc/misc/ultravnc_repeater.pl b/x11vnc/misc/ultravnc_repeater.pl
index 00ade3400c91a89537b57cff3023ad77dd4dc6af..0c44a05046e7d381a570ad87d1b0a55f0f2d9d96 100755
--- a/x11vnc/misc/ultravnc_repeater.pl
+++ b/x11vnc/misc/ultravnc_repeater.pl
@@ -725,6 +725,11 @@ sub xfer_both {
 	}
 }
 
+sub fsleep {
+	my ($time) = @_;
+	select(undef, undef, undef, $time) if $time;
+}
+
 sub cleanup {
 	close $client_listen  if $client_listen;
 	close $client_listen6 if $client_listen6;
diff --git a/x11vnc/options.c b/x11vnc/options.c
index 0ad72f973678275edc71dc43a4a5410b10d0b553..890a8a460cdfcb3d7eef3f2c8becbf1c3a722b58 100644
--- a/x11vnc/options.c
+++ b/x11vnc/options.c
@@ -258,6 +258,7 @@ int cursor_drag_changes = CURSOR_DRAG;
 int cursor_pos_updates = 1;	/* cursor position updates -cursorpos */
 int cursor_shape_updates = 1;	/* cursor shape updates -nocursorshape */
 int use_xwarppointer = 0;	/* use XWarpPointer instead of XTestFake... */
+int always_inject = 0;		/* inject new mouse coordinates even if dx=dy=0 */
 int show_dragging = 1;		/* process mouse movement events */
 #ifndef WIREFRAME
 #define WIREFRAME 1
diff --git a/x11vnc/options.h b/x11vnc/options.h
index 34ec6c1611a26f6e1474090f7985f6c99314a5d1..cfe0cdda6042ad6a6782394214215af395b636c1 100644
--- a/x11vnc/options.h
+++ b/x11vnc/options.h
@@ -222,6 +222,7 @@ extern int cursor_drag_changes;
 extern int cursor_pos_updates;
 extern int cursor_shape_updates;
 extern int use_xwarppointer;
+extern int always_inject;
 extern int show_dragging;
 extern int wireframe;
 extern int wireframe_local;
diff --git a/x11vnc/pointer.c b/x11vnc/pointer.c
index 097a43c0fa417bae20f383af2dc2c53ac474a631..c57d2d71bffdf5ecad5fa3ac3590794f39eac638 100644
--- a/x11vnc/pointer.c
+++ b/x11vnc/pointer.c
@@ -54,7 +54,7 @@ int pointer_queued_sent = 0;
 
 void initialize_pointer_map(char *pointer_remap);
 void do_button_mask_change(int mask, int button);
-void pointer(int mask, int x, int y, rfbClientPtr client);
+void pointer_event(int mask, int x, int y, rfbClientPtr client);
 void initialize_pipeinput(void);
 int check_pipeinput(void);
 void update_x11_pointer_position(int x, int y);
@@ -342,20 +342,11 @@ void update_x11_pointer_position(int x, int y) {
 	return;
 #else
 	int rc;
-	static int watch_dx_dy = -1;
 
 	RAWFB_RET_VOID
 
-	if (watch_dx_dy == -1) {
-		if (getenv("X11VNC_WATCH_DX_DY")) {
-			watch_dx_dy = 1;
-		} else {
-			watch_dx_dy = 0;
-		}
-	}
-
 	X_LOCK;
-	if (watch_dx_dy && cursor_x == x && cursor_y == y) {
+	if (!always_inject && cursor_x == x && cursor_y == y) {
 		;
 	} else if (use_xwarppointer) {
 		/*
@@ -668,7 +659,7 @@ static void pipe_pointer(int mask, int x, int y, rfbClientPtr client) {
  * This may queue pointer events rather than sending them immediately
  * to the X server. (see update_x11_pointer*())
  */
-void pointer(int mask, int x, int y, rfbClientPtr client) {
+void pointer_event(int mask, int x, int y, rfbClientPtr client) {
 	allowed_input_t input;
 	int sent = 0, buffer_it = 0;
 	double now;
diff --git a/x11vnc/pointer.h b/x11vnc/pointer.h
index 558f381dcdae7b4513ae0eee43bb9d3429478d2f..1fe5e0bc7ce3d2a1324da4a141b8b2af7961ce4c 100644
--- a/x11vnc/pointer.h
+++ b/x11vnc/pointer.h
@@ -39,7 +39,7 @@ extern int pointer_queued_sent;
 
 extern void initialize_pointer_map(char *pointer_remap);
 extern void do_button_mask_change(int mask, int button);
-extern void pointer(int mask, int x, int y, rfbClientPtr client);
+extern void pointer_event(int mask, int x, int y, rfbClientPtr client);
 extern int check_pipeinput(void);
 extern void initialize_pipeinput(void);
 extern void update_x11_pointer_position(int x, int y);
diff --git a/x11vnc/remote.c b/x11vnc/remote.c
index 6b2903b7032a88e908140bfb30b1b5e5124abcdb..fef39af45f6bf792605f5bb464a0f31e32ad1833 100644
--- a/x11vnc/remote.c
+++ b/x11vnc/remote.c
@@ -3443,6 +3443,24 @@ char *process_remote_cmd(char *cmd, int stringonly) {
 		use_xwarppointer = 0;
 		goto done;
 	}
+	if (strstr(p, "always_inject") == p) {
+		if (query) {
+			snprintf(buf, bufn, "ans=%s:%d", p, always_inject);
+			goto qry;
+		}
+		rfbLog("remote_cmd: turning on always_inject mode.\n");
+		always_inject = 1;
+		goto done;
+	}
+	if (strstr(p, "noalways_inject") == p) {
+		if (query) {
+			snprintf(buf, bufn, "ans=%s:%d", p, !always_inject);
+			goto qry;
+		}
+		rfbLog("remote_cmd: turning off always_inject mode.\n");
+		always_inject = 0;
+		goto done;
+	}
 	if (strstr(p, "buttonmap") == p) {
 		COLON_CHECK("buttonmap:")
 		if (query) {
@@ -4426,9 +4444,9 @@ char *process_remote_cmd(char *cmd, int stringonly) {
 		p += strlen("ptr:");
 		rfbLog("remote_cmd: insert pointer event: %s\n", p);
 		if (sscanf(p, "%d,%d,%d", &x, &y, &m) == 3) {
-			pointer(m, x, y, NULL);
+			pointer_event(m, x, y, NULL);
 		} else if (sscanf(p, "%d,%d", &x, &y) == 2) {
-			pointer(m, x, y, NULL);
+			pointer_event(m, x, y, NULL);
 		} else {
 			rfbLog("remote_cmd: bad ptr:x,y,mask\n");
 		}
@@ -4593,7 +4611,7 @@ char *process_remote_cmd(char *cmd, int stringonly) {
 		} else if (strstr(res, "GRAB_FAIL") && try < max_tries) {
 			rfbLog("bcx_xattach: failed grab check for '%s': %s.  Retrying[%d]...\n", p, res, try);
 			free(res);
-			pointer(0, dpy_x/2 + try, dpy_y/2 + try, NULL);
+			pointer_event(0, dpy_x/2 + try, dpy_y/2 + try, NULL);
 #if !NO_X11
 			X_LOCK;
 			XFlush_wr(dpy);
diff --git a/x11vnc/scan.c b/x11vnc/scan.c
index 7ef931c839b9315c7fcd08e08978b1d27edd2891..b8fa645c83363180b6cc38c1ced1f80e9fdaf230 100644
--- a/x11vnc/scan.c
+++ b/x11vnc/scan.c
@@ -3550,7 +3550,7 @@ int scan_for_updates(int count_only) {
 			fb_copy_in_progress = 0;
 			SCAN_FATAL(cs);
 			if (use_threads && pointer_mode != 1) {
-				pointer(-1, 0, 0, NULL);
+				pointer_event(-1, 0, 0, NULL);
 			}
 			nap_check(tile_count);
 			return tile_count;
@@ -3637,7 +3637,7 @@ if (tile_count) fprintf(stderr, "XX copytile: %.4f  tile_count: %d\n", dnow() -
 		 * tell the pointer handler it can process any queued
 		 * pointer events:
 		 */
-		pointer(-1, 0, 0, NULL);
+		pointer_event(-1, 0, 0, NULL);
 	}
 
 	if (blackouts) {
diff --git a/x11vnc/screen.c b/x11vnc/screen.c
index c41774c1f18304083d748606c93fb90c48c0abcc..6bada902a70215d2686b3b47cdfd1462d2f5fe68 100644
--- a/x11vnc/screen.c
+++ b/x11vnc/screen.c
@@ -1265,6 +1265,28 @@ void vnc_reflect_got_cursorshape(rfbClient *cl, int xhot, int yhot, int width, i
 	set_cursor(cursor_x, cursor_y, get_which_cursor());
 }
 
+rfbBool vnc_reflect_cursor_pos(rfbClient *cl, int x, int y) {
+	if (cl) {}
+	if (debug_pointer) {
+		rfbLog("vnc_reflect_cursor_pos: %d %d\n", x, y);
+	}
+	if (unixpw_in_progress) {
+		if (debug_pointer) {
+			rfbLog("vnc_reflect_cursor_pos: unixpw_in_progress%d\n", unixpw_in_progress);
+		}
+		return TRUE;
+	}
+	if (! all_clients_initialized()) {
+		rfbLog("vnc_reflect_cursor_pos: no send: uninitialized clients\n");
+		return TRUE; /* some clients initializing, cannot send */ 
+	}
+
+	cursor_position(x, y);
+	set_cursor(x, y, get_which_cursor());
+
+	return TRUE;
+}
+
 static void from_libvncclient_CopyRectangleFromRectangle(rfbClient* client, int src_x, int src_y, int w, int h, int dest_x, int dest_y) {
   int i,j;
 
@@ -1350,6 +1372,49 @@ rfbBool vnc_reflect_resize(rfbClient *cl)  {
 	return cl->frameBuffer ? TRUE : FALSE;
 }
 
+#ifdef rfbCredentialTypeX509
+static rfbCredential* vnc_reflect_get_credential(rfbClient* client, int type) {
+	char *pass = getenv("X11VNC_REFLECT_PASSWORD");
+	char *user = getenv("X11VNC_REFLECT_USER");
+	char *cert = getenv("X11VNC_REFLECT_CACERT");
+	char *ccrl = getenv("X11VNC_REFLECT_CACRL");
+	char *clic = getenv("X11VNC_REFLECT_CLIENTCERT");
+	char *clik = getenv("X11VNC_REFLECT_CLIENTKEY");
+	int db = 0;
+	if (client) {}
+if (db) fprintf(stderr, "type: %d\n", type);
+#ifdef rfbCredentialTypeUser
+	if (type == rfbCredentialTypeUser) {
+		if (!pass && !user) {
+			return NULL;
+		} else {
+			rfbCredential *rc = (rfbCredential *) calloc(sizeof(rfbCredential), 1);
+			rc->userCredential.username = (user ? strdup(user) : NULL);
+			rc->userCredential.password = (pass ? strdup(pass) : NULL);
+			return rc;
+		}
+	}
+#endif
+	if (type == rfbCredentialTypeX509) {
+if (db) fprintf(stderr, "cert: %s\n", cert);
+if (db) fprintf(stderr, "ccrl: %s\n", ccrl);
+if (db) fprintf(stderr, "clic: %s\n", clic);
+if (db) fprintf(stderr, "clik: %s\n", clik);
+		if (!cert && !ccrl && !clic && !clik) {
+			return NULL;
+		} else {
+			rfbCredential *rc = (rfbCredential *) calloc(sizeof(rfbCredential), 1);
+			rc->x509Credential.x509CACertFile     = (cert ? strdup(cert) : NULL);
+			rc->x509Credential.x509CACrlFile      = (ccrl ? strdup(ccrl) : NULL);
+			rc->x509Credential.x509ClientCertFile = (clic ? strdup(clic) : NULL);
+			rc->x509Credential.x509ClientKeyFile  = (clik ? strdup(clik) : NULL);
+			return rc;
+		}
+	}
+	return NULL;
+}
+#endif
+
 static char* vnc_reflect_get_password(rfbClient* client) {
 	char *q, *p, *str = getenv("X11VNC_REFLECT_PASSWORD");
 	int len = 110;
@@ -1408,17 +1473,32 @@ char *vnc_reflect_guess(char *str, char **raw_fb_addr) {
 	}
 
 	client->appData.useRemoteCursor = TRUE;
+	client->canHandleNewFBSize = TRUE;
+
+	client->HandleCursorPos = vnc_reflect_cursor_pos;
+	client->GotFrameBufferUpdate = vnc_reflect_got_update;
+	client->MallocFrameBuffer = vnc_reflect_resize;
 	client->Bell = vnc_reflect_bell;
+#if 0
+	client->SoftCursorLockArea = NULL;
+	client->SoftCursorUnlockScreen = NULL;
+	client->FinishedFrameBufferUpdate = NULL;
+	client->HandleKeyboardLedState = NULL;
+	client->HandleTextChat = NULL;
+#endif
 	client->GotXCutText = vnc_reflect_recv_cuttext;
-	client->GotCopyRect = vnc_reflect_got_copyrect;
 	client->GotCursorShape = vnc_reflect_got_cursorshape;
-	client->MallocFrameBuffer = vnc_reflect_resize;
-	client->canHandleNewFBSize = TRUE;
-	client->GotFrameBufferUpdate = vnc_reflect_got_update;
+	client->GotCopyRect = vnc_reflect_got_copyrect;
 
 	if (getenv("X11VNC_REFLECT_PASSWORD")) {
 		client->GetPassword = vnc_reflect_get_password;
 	}
+#ifdef rfbCredentialTypeX509
+	client->GetCredential = NULL;
+	if (0 || getenv("LIBVNCCLIENT_GET_CREDENTIAL")) {
+		client->GetCredential = vnc_reflect_get_credential;
+	}
+#endif
 
 	if (first) {
 		argv[argc++] = "x11vnc_rawfb_vnc";
@@ -3538,7 +3618,7 @@ void initialize_screen(int *argc, char **argv, XImage *fb) {
 	/* event callbacks: */
 	screen->newClientHook = new_client;
 	screen->kbdAddEvent = keyboard;
-	screen->ptrAddEvent = pointer;
+	screen->ptrAddEvent = pointer_event;
 	screen->setXCutText = xcut_receive;
 	screen->setTranslateFunction = set_xlate_wrapper;
 
diff --git a/x11vnc/sslhelper.c b/x11vnc/sslhelper.c
index a363eeef480404b8954ff4cad8c80b06904cfe40..ca5168f4af8fa18fbb6ab5daf15522501ef09af4 100644
--- a/x11vnc/sslhelper.c
+++ b/x11vnc/sslhelper.c
@@ -4009,7 +4009,11 @@ void accept_openssl(int mode, int presock) {
 				rfbLog("helper[%d]:\n", pid);
 				rfbLog("***********************************************************\n");
 				rfbLog("SSL: WARNING CLIENT ASKED FOR NONEXISTENT 'VncViewer.class'\n");
-				rfbLog("SSL: USER NEEDS TO **RESTART** HIS WEB BROWSER.\n");
+				rfbLog("SSL: USER NEEDS TO MAKE SURE THE JAVA PLUGIN IS INSTALLED\n");
+				rfbLog("SSL: AND WORKING PROPERLY (e.g. a test-java-plugin page.)\n");
+				rfbLog("SSL: AND/OR USER NEEDS TO **RESTART** HIS WEB BROWSER.\n");
+				rfbLog("SSL: SOMETIMES THE BROWSER 'REMEMBERS' FAILED APPLET DOWN-\n");
+				rfbLog("SSL: LOADS AND RESTARTING IT IS THE ONLY WAY TO FIX THINGS.\n");
 				rfbLog("***********************************************************\n");
 				rfbLog("\n");
 			}
diff --git a/x11vnc/ssltools.h b/x11vnc/ssltools.h
index 89849a500fc86914df6814d4d314c6db30c0fd47..9c74d5f04ed71b6697c633a18fc10d13b8dc5d67 100644
--- a/x11vnc/ssltools.h
+++ b/x11vnc/ssltools.h
@@ -1151,7 +1151,7 @@ char find_display[] =
 "	list=\"$list \"`xauth list | awk '{print $1}' | grep /unix | grep \"^${host}\" | sed -e 's/^.*:/:/' | sort -n | uniq`\n"
 "\n"
 "	# check for gdm and kdm non-NFS cookies in /tmp: (and now /var/run/gdm)\n"
-"	for xa in /tmp/.gdm* /tmp/.Xauth* /var/run/gdm/auth-for-*/database /var/run/gdm/auth-cookie-*-for-*\n"
+"	for xa in /tmp/.gdm* /tmp/.Xauth* /var/run/gdm*/auth-for-*/database /var/run/gdm*/auth-cookie-*-for-*\n"
 "	do\n"
 "		# try to be somewhat careful about the real owner of the file:\n"
 "		if [ \"X$am_root\" = \"X1\" ]; then\n"
@@ -1307,16 +1307,34 @@ char find_display[] =
 "		if [ \"X$p\" = \"X\" ]; then\n"
 "			continue\n"
 "		fi\n"
+"\n"
 "		env \"$myenv\" xdpyinfo -display \"$p\" >/dev/null 2>&1\n"
 "		rc=$?\n"
-"		if [ $rc != 0 -a \"X$XAUTHLOCALHOSTNAME\" = \"X\" ]; then\n"
+"\n"
+"		if [ $rc != 0 ]; then\n"
 "			# guard against libxcb/desktop silliness: \n"
-"			env \"$myenv\" XAUTHLOCALHOSTNAME=localhost xdpyinfo -display \"$p\" >/dev/null 2>&1\n"
-"			rc=$?\n"
-"			if [ $rc = 0 ]; then\n"
-"				# better export it for cmds below...\n"
-"				XAUTHLOCALHOSTNAME=localhost\n"
-"				export XAUTHLOCALHOSTNAME\n"
+"			xalhn_save=$XAUTHLOCALHOSTNAME\n"
+"\n"
+"			if [ \"X$xalhn_save\" != \"X\" ]; then\n"
+"				# try it again unset\n"
+"				unset XAUTHLOCALHOSTNAME\n"
+"				env \"$myenv\" xdpyinfo -display \"$p\" >/dev/null 2>&1\n"
+"				rc=$?\n"
+"				if [ $rc != 0 ]; then\n"
+"					# did not work; put it back\n"
+"					XAUTHLOCALHOSTNAME=$xalhn_save\n"
+"					export XAUTHLOCALHOSTNAME\n"
+"				fi\n"
+"			fi\n"
+"			if [ $rc != 0 -a \"X$xalhn_save\" != \"Xlocalhost\" ]; then\n"
+"				# try it again with localhost\n"
+"				env \"$myenv\" XAUTHLOCALHOSTNAME=localhost xdpyinfo -display \"$p\" >/dev/null 2>&1\n"
+"				rc=$?\n"
+"				if [ $rc = 0 ]; then\n"
+"					# better export it for cmds below...\n"
+"					XAUTHLOCALHOSTNAME=localhost\n"
+"					export XAUTHLOCALHOSTNAME\n"
+"				fi\n"
 "			fi\n"
 "		fi\n"
 "\n"
@@ -1460,11 +1478,14 @@ char create_display[] =
 "\n"
 "findfree() {\n"
 "	try=20\n"
-"	sry=99\n"
+"	dpymax=79\n"
 "	if [ \"X$X11VNC_CREATE_STARTING_DISPLAY_NUMBER\" != \"X\" ]; then\n"
 "		try=$X11VNC_CREATE_STARTING_DISPLAY_NUMBER\n"
-"		sry=`expr $try + 99`\n"
 "	fi\n"
+"	if [ \"X$X11VNC_CREATE_MAX_DISPLAYS\" != \"X\" ]; then\n"
+"		dpymax=$X11VNC_CREATE_MAX_DISPLAYS\n"
+"	fi\n"
+"	sry=`expr $try + $dpymax`\n"
 "	n=\"\"\n"
 "	nsout=\"\"\n"
 "	if [ \"X$have_netstat\" != \"X\" ]; then\n"
diff --git a/x11vnc/tkx11vnc b/x11vnc/tkx11vnc
index afff89cb8cebd3cbb49376c413793582aaaf67d2..c87d7530b64f7a284ebd6e2fb30ead53b69623ad 100755
--- a/x11vnc/tkx11vnc
+++ b/x11vnc/tkx11vnc
@@ -238,6 +238,7 @@ Pointer
 	buttonmap:
 	--
 	xwarppointer
+	always_inject
 
 Misc
 	=GD-C:full,icon,tray WindowView:
diff --git a/x11vnc/tkx11vnc.h b/x11vnc/tkx11vnc.h
index c38e600b9501bf0159742d108f859e3dc0b69e77..46f4bbca87e521357cb293475d75bde16d57966e 100644
--- a/x11vnc/tkx11vnc.h
+++ b/x11vnc/tkx11vnc.h
@@ -249,6 +249,7 @@ char gui_code[] = "";
 "	buttonmap:\n"
 "	--\n"
 "	xwarppointer\n"
+"	always_inject\n"
 "\n"
 "Misc\n"
 "	=GD-C:full,icon,tray WindowView:\n"
diff --git a/x11vnc/unixpw.c b/x11vnc/unixpw.c
index 90c2e06a7254c6b8edb9cb8232fa9b4a76e7e9fe..b610fa9812052ac2c98a0290902c11d2c89d2cf5 100644
--- a/x11vnc/unixpw.c
+++ b/x11vnc/unixpw.c
@@ -1512,6 +1512,52 @@ static void progress_skippy(void) {
 	usleep(50*1000);
 }
 
+void check_unixpw_userprefs(void) {
+	char *prefs = getenv("FD_USERPREFS");
+	if (keep_unixpw_user == NULL || keep_unixpw_opts == NULL) {
+		return;
+	}
+#if LIBVNCSERVER_HAVE_PWD_H
+	if (prefs != NULL && !strchr(prefs, '/')) {
+		struct passwd *pw = getpwnam(keep_unixpw_user);
+		if (pw != NULL) {
+			char *file;
+			FILE *f;
+
+			file = (char *) malloc(strlen(pw->pw_dir) + 1 + strlen(prefs) + 1);
+			sprintf(file, "%s/%s", pw->pw_dir, prefs);
+
+			f = fopen(file, "r");
+			if (f) {
+				char *t, *q, buf[1024];
+				memset(buf, 0, sizeof(buf));
+
+				fgets(buf, 1024, f);
+				fclose(f);
+
+				q = strchr(buf, '\n');
+				if (q) *q = '\0';
+				q = strchr(buf, '\r');
+				if (q) *q = '\0';
+
+				rfbLog("read user prefs %s: %s\n", file, buf);
+
+				if (buf[0] == '#') buf[0] = '\0';
+
+				t = (char *) malloc(strlen(keep_unixpw_opts) + 1 + strlen(buf) + 1);
+				sprintf(t, "%s,%s", keep_unixpw_opts, buf); 
+				free(keep_unixpw_opts);
+				keep_unixpw_opts = t;
+			} else {
+				rfbLog("could not read user prefs %s\n", file);
+				rfbLogPerror("fopen");
+			}
+			free(file);
+		}
+	}
+#endif
+}
+
 
 void unixpw_verify_screen(char *user, char *pass) {
 	int x, y;
@@ -1569,7 +1615,9 @@ if (db) fprintf(stderr, "unixpw_verify: '%s' '%s'\n", user, db > 1 ? pass : "***
 			} else {
 				keep_unixpw_opts = strdup("");
 			}
+			check_unixpw_userprefs();
 		}
+
 		if (colon) *colon = ':';
 
 		return;
@@ -1759,6 +1807,7 @@ void unixpw_keystroke(rfbBool down, rfbKeySym keysym, int init) {
 			} else {
 				keep_unixpw_opts = strdup("");
 			}
+			check_unixpw_userprefs();
 		}
 		unixpw_system_greeter_active = 2;
 		set_env("X11VNC_XDM_ONLY", "1");
diff --git a/x11vnc/user.c b/x11vnc/user.c
index 150ad37b03c3625730cbb0390dd027c969844efb..e9028ba19372148eb73785d31f4f6ed16a6861a5 100644
--- a/x11vnc/user.c
+++ b/x11vnc/user.c
@@ -1985,8 +1985,9 @@ static char *build_create_cmd(char *cmd, int *saw_xdmcp, char *usslpeer, char *t
 	fdxdmcpif[0]  = '\0';
 	cdout[0]  = '\0';
 
-	if (unixpw && keep_unixpw_opts && keep_unixpw_opts[0] != '\0') {
+	if (unixpw && keep_unixpw_opts && !getenv("X11VNC_NO_UNIXPW_OPTS")) {
 		char *q, *p, *t = strdup(keep_unixpw_opts);
+
 		if (strstr(t, "gnome")) {
 			sprintf(fdsess, "gnome");
 		} else if (strstr(t, "kde")) {
diff --git a/x11vnc/userinput.c b/x11vnc/userinput.c
index 8c8308007e96008f86a1d9e891d0048a0f15c52b..84bcb7b05eeb1c0ff222191e1ef6d7de42416ce0 100644
--- a/x11vnc/userinput.c
+++ b/x11vnc/userinput.c
@@ -3008,7 +3008,7 @@ if (db) fprintf(stderr, "check_xrecord: BUTTON-UP-KEEP-GOING:  %.3f/%.3f %d/%d %
 	pointer_queued_sent = 0;
 	last_x = cursor_x;
 	last_y = cursor_y;
-	pointer(-1, 0, 0, NULL);
+	pointer_event(-1, 0, 0, NULL);
 	pointer_flush_delay = 0.0;
 
 	if (xrecording && pointer_queued_sent && button_mask_save &&
@@ -4565,7 +4565,7 @@ if (db) fprintf(stderr, "INTERIOR\n");
 	/* -threads support for check_wireframe() is rough... crash? */
 	if (use_threads) {
 		/* purge any stored up pointer events: */
-		pointer(-1, 0, 0, NULL);
+		pointer_event(-1, 0, 0, NULL);
 	}
 
 	if (cursor_noshape_updates_clients(screen)) {
diff --git a/x11vnc/x11vnc.1 b/x11vnc/x11vnc.1
index 7de21cb03a9e9be8b20bf739b296ad078dc2be41..cfab1521ae5d63d94903ddcbc0bda10aa07e8da9 100644
--- a/x11vnc/x11vnc.1
+++ b/x11vnc/x11vnc.1
@@ -1,8 +1,8 @@
 .\" This file was automatically generated from x11vnc -help output.
-.TH X11VNC "1" "May 2010" "x11vnc " "User Commands"
+.TH X11VNC "1" "September 2010" "x11vnc " "User Commands"
 .SH NAME
 x11vnc - allow VNC connections to real X11 displays
-         version: 0.9.11, lastmod: 2010-05-08
+         version: 0.9.13, lastmod: 2010-09-10
 .SH SYNOPSIS
 .B x11vnc
 [OPTION]...
@@ -487,6 +487,12 @@ disconnects, opposite of \fB-forever.\fR This is the Default.
 .IP
 Keep listening for more connections rather than exiting
 as soon as the first client(s) disconnect. Same as \fB-many\fR
+.IP
+To get the standard non-shared VNC behavior where when
+a new VNC client connects the existing VNC client is
+dropped use:  \fB-nevershared\fR \fB-forever\fR   This method can
+also be used to guard against hung TCP connections that
+do not go away.
 .PP
 \fB-loop\fR
 .IP
@@ -617,6 +623,11 @@ Rendezvous, Bonjour).  Depending on your setup, you
 may need to start avahi-daemon and open udp port 5353
 in your firewall.
 .IP
+You can set X11VNC_AVAHI_NAME, X11VNC_AVAHI_HOST,
+and/or X11VNC_AVAHI_PORT environment variables
+to override the default values.  For example:
+\fB-env\fR X11VNC_AVAHI_NAME=wally
+.IP
 If the avahi API cannot be found at build time, a helper
 program like avahi-
 .IR publish (1)
@@ -1329,7 +1340,7 @@ virtual terminal of the X server.
 .IP
 Have the FINDDISPLAY program list all of your displays
 (i.e. all the X displays on the local machine that you
-have access rights to).
+have access rights to).  x11vnc then exits.
 .PP
 \fB-findauth\fR \fI[disp]\fR
 .IP
@@ -1337,7 +1348,7 @@ Apply the \fB-find/-finddpy\fR heuristics to try to guess
 the XAUTHORITY file for DISPLAY 'disp'.  If 'disp'
 is not supplied, then the value in the \fB-display\fR on
 the cmdline is used; failing that $DISPLAY is used;
-and failing that ":0" is used.
+and failing that ":0" is used.  x11vnc then exits.
 .IP
 If nothing is printed out, that means no XAUTHORITY was
 found for 'disp'; i.e. failure.  If "XAUTHORITY="
@@ -1611,8 +1622,19 @@ be ignored if the FD_TAG env. var. is already set or
 if the viewer-side supplied value is not completely
 composed of alphanumeric or '_' or '-' characters.
 .IP
+User preferences file: Instead of having the user type
+in geom=WxH,... etc. every time he logs in to find
+or create his X session, if you set FD_USERPREFS to
+a string that does not contain the "/" character,
+then the user's home directory is prepended to that
+string and if the file exists its first line is read
+and appended to any options he supplied at the login:
+prompt.  For example \fB-env\fR FD_USERPREFS=.x11vnc_create
+and the user put "geom=1600x1200" in his
+~/.x11vnc_create file.
+.IP
 To troubleshoot the FINDCREATEDISPLAY mechanism,
-set the following env. var. to an ouput log file,
+set the following env. var. to an output log file,
 e.g \fB-env\fR CREATE_DISPLAY_OUTPUT=/tmp/mydebug.txt
 .IP
 To disable the option setting set the environment
@@ -1706,6 +1728,8 @@ The option "\fB-create\fR" is an alias for this mode.
 .IP
 It will start looking for an open display number at :20
 Override via X11VNC_CREATE_STARTING_DISPLAY_NUMBER=n
+By default 80 X displays are allowed (i.e. going to :99)
+Override via X11VNC_CREATE_MAX_DISPLAYS=n
 .IP
 By default FINDCREATEDISPLAY will try Xvfb and then
 Xdummy:
@@ -2268,6 +2292,7 @@ commands 'openssl ca \fB-revoke\fR ...' and 'openssl ca
 .IP
 Generate your own Certificate Authority private key,
 certificate, and other files in directory [dir].
+x11vnc then exits.
 .IP
 If [dir] is not supplied, a \fB-ssldir\fR setting is used,
 or otherwise ~/.vnc/certs is used.
@@ -2279,7 +2304,7 @@ program must be installed on the system and available
 in PATH.
 .IP
 After the CA files and directories are created the
-command exits; the VNC server is not run.
+x11vnc command exits; the VNC server is not run.
 .IP
 You will be prompted for information to put into the CA
 certificate.  The info does not have to be accurate just
@@ -2311,8 +2336,8 @@ key pair signed by the CA created previously with
 program must be installed
 on the system and available in PATH.
 .IP
-After the Certificate is generated the command exits;
-the VNC server is not run.
+After the Certificate is generated x11vnc exits; the
+VNC server is not run.
 .IP
 The type of key to be generated is the string \fItype\fR.
 It is either "server" (i.e. for use by x11vnc) or
@@ -2431,7 +2456,7 @@ x11vnc \fB-sslGenCert\fR client roger
 scp ~/.vnc/certs/clients/roger.pem somehost:.
 rm  ~/.vnc/certs/clients/roger.pem
 .IP
-x11vnc is then started with the the option \fB-sslverify\fR
+x11vnc is then started with the option \fB-sslverify\fR
 ~/.vnc/certs/clients/roger.crt (or simply \fB-sslverify\fR
 roger), and on the viewer user on somehost could do
 for example:
@@ -2460,7 +2485,7 @@ The
 .IR openssl (1)
 program must be installed on the system
 and available in PATH.  After the Key file is encrypted
-the command exits; the VNC server is not run.
+the x11vnc command exits; the VNC server is not run.
 .IP
 Examples:
 x11vnc \fB-sslEncKey\fR /path/to/foo.pem
@@ -2476,6 +2501,9 @@ The
 program must be in PATH. Basically the
 command "openssl x509 \fB-text"\fR is run on the pem.
 .IP
+After the info is printed the x11vnc command exits;
+the VNC server is not run.
+.IP
 The "SAVE" notation described under \fB-ssl\fR applies
 as well.
 .IP
@@ -2503,15 +2531,15 @@ also be lowercase, e.g. "list".
 \fB-sslDelCert\fR \fIpem\fR
 .IP
 Prompts you to delete all .crt .pem .key .req files
-associated with [pem].  "SAVE" and lookups as in
-\fB-sslCertInfo\fR apply as well.
+associated with [pem].  x11vnc then exits. "SAVE"
+and lookups as in \fB-sslCertInfo\fR apply as well.
 .PP
 \fB-sslScripts\fR
 .IP
 Prints out both the 'genCA' and 'genCert' x11vnc
 openssl wrapper scripts for you to examine, modify, etc.
-The scripts are printed to stdout and then the program
-exits.
+The scripts are printed to stdout and then the x11vnc
+program exits.
 .PP
 \fB-stunnel\fR \fI[pem]\fR
 .IP
@@ -3142,6 +3170,9 @@ endianness.  Ignored unless \fB-noshm\fR is set.
 Do not use the new copy_tiles() framebuffer mechanism,
 just use 1 shm tile for polling.  Limits shm segments
 used to 3.
+.IP
+To disable any automatic shm reduction set the
+env. var. X11VNC_NO_LIMIT_SHM.
 .PP
 \fB-solid\fR \fI[color]\fR
 .IP
@@ -3457,7 +3488,7 @@ Nevertheless your capitalized letters come in over
 the wire and are applied correctly to the x11vnc-side
 X server.  Note this mode probably won't do what you
 want in \fB-nomodtweak\fR mode.  Also, a kludge for KP_n
-digits is always done it this mode: they are mapped to
+digits is always done in this mode: they are mapped to
 regular digit keysyms.  See also \fB-capslock\fR above.
 The default is \fB-noskip_lockkeys.\fR
 .PP
@@ -3818,6 +3849,36 @@ It is also sometimes needed on XINERAMA displays and is
 enabled by default if XINERAMA is found to be active.
 To prevent this, use \fB-noxwarppointer.\fR
 .PP
+\fB-always_inject\fR
+.IP
+Even if there is no displacement (dx = dy = 0) for a
+VNC mouse event force the pointer to the indicated x,y
+position anyway.  Recent (2009) gui toolkits (gnome)
+have problems with x11vnc's original mouse input
+injection method.  So x11vnc's mouse input injection
+method has been modified.  To regain the OLD behavior
+use this option: \fB-always_inject.\fR  Then x11vnc will
+always force positioning the mouse to the x,y position
+even if that position has not changed since the previous
+VNC input event.
+.IP
+The first place this problem was noticed was in gnome
+terminal: if you pressed and released mouse button 3, a
+menu was posted and then its first element 'New Terminal
+Window' was activated.  This was because x11vnc injected
+the mouse position twice: once on ButtonPress and again
+on ButtonRelease.  The toolkit interpreted the 2nd one
+as mouse motion even though the mouse hadn't moved.
+So now by default x11vnc tries to avoid injecting the
+2nd one.
+.IP
+Note that with the new default x11vnc will be oblivious
+to applications moving the pointer (warping) or the
+user at the physical display moving it.  So it might,
+e.g., inject ButtonRelease at the wrong position.
+If this (or similar scenarios) causes problems in your
+environment, specify \fB-always_inject\fR for the old method.
+.PP
 \fB-buttonmap\fR \fIstring\fR
 .IP
 String to remap mouse buttons.  Format: IJK-LMN, this
@@ -4336,7 +4397,7 @@ tiny window for XGrabServer deadlock.  This is only if
 the whole-server grabbing application expects mouse or
 keyboard input before releasing the grab.  It is usually
 a window manager that does this.  x11vnc takes care to
-avoid the the problem, but if caught x11vnc will freeze.
+avoid the problem, but if caught x11vnc will freeze.
 Without \fB-grab_buster,\fR the only solution is to go the
 physical display and give it some input to satisfy the
 grabbing app.  Or manually kill and restart the window
@@ -5334,7 +5395,7 @@ keystroke insertion code based on a US keyboard.
 .PP
 \fB-gui\fR \fI[gui-opts]\fR
 .IP
-Start up a simple tcl/tk gui based on the the remote
+Start up a simple tcl/tk gui based on the remote
 control options \fB-remote/-query\fR described below.
 Requires the "wish" program to be installed on the
 machine.  "gui-opts" is not required: the default
@@ -5466,9 +5527,9 @@ Remotely control some aspects of an already running
 x11vnc server.  "\fB-R\fR" and "\fB-r\fR" are aliases for
 "\fB-remote\fR".  After the remote control command is
 sent to the running server the 'x11vnc \fB-remote\fR ...'
-command exits.  You can often use the \fB-query\fR command
-(see below) to see if the x11vnc server processed your
-\fB-remote\fR command.
+x11vnc command exits.  You can often use the \fB-query\fR
+command (see below) to see if the x11vnc server
+processed your \fB-remote\fR command.
 .IP
 The default communication channel is that of X
 properties (specifically X11VNC_REMOTE), and so this
@@ -5886,6 +5947,10 @@ xwarp           enable  \fB-xwarppointer\fR mode.
 .IP
 noxwarp         disable \fB-xwarppointer\fR mode.
 .IP
+always_inject   enable  \fB-always_inject\fR mode.
+.IP
+noalways_inject disable \fB-always_inject\fR mode.
+.IP
 buttonmap:str   set \fB-buttonmap\fR "str", empty to disable
 .IP
 dragging        disable \fB-nodragging\fR mode.
@@ -6376,11 +6441,11 @@ nobell sendbell sel nosel primary noprimary setprimary
 nosetprimary clipboard noclipboard setclipboard
 nosetclipboard seldir cursorshape nocursorshape
 cursorpos nocursorpos cursor_drag nocursor_drag 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 ncache_cr
+show_cursor noshow_cursor nocursor arrow xfixes noxfixes
+xdamage noxdamage xd_area xd_mem alphacut alphafrac
+alpharemove noalpharemove alphablend noalphablend
+xwarppointer xwarp noxwarppointer noxwarp always_inject
+noalways_inject buttonmap dragging nodragging ncache_cr
 noncache_cr ncache_no_moveraise noncache_no_moveraise
 ncache_no_dtchange noncache_no_dtchange
 ncache_no_rootpixmap noncache_no_rootpixmap
diff --git a/x11vnc/x11vnc.c b/x11vnc/x11vnc.c
index 96238b6a4823b8b35a59640186da0ec498cc6d6f..3f965e2c87cc0842905977b4f0aeb99200e1effc 100644
--- a/x11vnc/x11vnc.c
+++ b/x11vnc/x11vnc.c
@@ -992,6 +992,9 @@ static int limit_shm(void) {
 	if (UT.sysname == NULL) {
 		return 0;
 	}
+	if (getenv("X11VNC_NO_LIMIT_SHM")) {
+		return 0;
+	}
 	if (!strcmp(UT.sysname, "SunOS")) {
 		char *r = UT.release;
 		if (*r == '5' && *(r+1) == '.') {
@@ -1554,6 +1557,7 @@ static void print_settings(int try_http, int bg, char *gui_str) {
 	fprintf(stderr, " cursorshape:%d\n", cursor_shape_updates);
 	fprintf(stderr, " cursorpos:  %d\n", cursor_pos_updates);
 	fprintf(stderr, " xwarpptr:   %d\n", use_xwarppointer);
+	fprintf(stderr, " alwaysinj:  %d\n", always_inject);
 	fprintf(stderr, " buttonmap:  %s\n", pointer_remap
 	    ? pointer_remap : "null");
 	fprintf(stderr, " dragging:   %d\n", show_dragging);
@@ -2280,7 +2284,7 @@ int main(int argc, char* argv[]) {
 		}
 		if (!strcmp(arg, "-reflect")) {
 			CHECK_ARGC
-			raw_fb_str = (char *) malloc(4 + strlen(argv[i]) + 1);
+			raw_fb_str = (char *) malloc(4 + strlen(argv[i+1]) + 1);
 			sprintf(raw_fb_str, "vnc:%s", argv[++i]);
 			shared = 1;
 			continue;
@@ -3397,6 +3401,10 @@ int main(int argc, char* argv[]) {
 			got_noxwarppointer = 1;
 			continue;
 		}
+		if (!strcmp(arg, "-always_inject")) {
+			always_inject = 1;
+			continue;
+		}
 		if (!strcmp(arg, "-buttonmap")) {
 			CHECK_ARGC
 			pointer_remap = strdup(argv[++i]);
diff --git a/x11vnc/x11vnc_defs.c b/x11vnc/x11vnc_defs.c
index 9ef72e6cc88c3d74923201a8183bda60620845bd..fc6215b71df72d930cd401e733ad51f1f3fd5616 100644
--- a/x11vnc/x11vnc_defs.c
+++ b/x11vnc/x11vnc_defs.c
@@ -47,7 +47,7 @@ int xtrap_base_event_type = 0;
 int xdamage_base_event_type = 0;
 
 /*               date +'lastmod: %Y-%m-%d' */
-char lastmod[] = "0.9.11 lastmod: 2010-05-08";
+char lastmod[] = "0.9.13 lastmod: 2010-09-10";
 
 /* X display info */
 
diff --git a/x11vnc/xevents.c b/x11vnc/xevents.c
index 4221090fab3b4922554011813cb5c8b3f4c601e8..2fc122d4a4983ade3a016231698b21d2b385cde3 100644
--- a/x11vnc/xevents.c
+++ b/x11vnc/xevents.c
@@ -148,25 +148,34 @@ void initialize_clipboard_atom(void) {
      18 gdm_string: Gdm-simple-greeter
      24 gdm_string: metacity
      36 gdm_string: gdm-simple-greeter
+
+	kdmgreet
+	Kdmgreet
  */
 
-static int gdm_string(char *str) {
+static int dm_string(char *str) {
+	char *s = getenv("DEBUG_WM_RUNNING");
 	if (str == NULL) {
 		return 0;
 	}
 	if (str[0] == '\0') {
 		return 0;
 	}
-	if (0) fprintf(stderr, "gdm_string: %s\n", str);
+	if (0) fprintf(stderr, "dm_string: %s\n", str);
 	if (strstr(str, "gdm-") == str || strstr(str, "Gdm-") == str) {
 		if (strstr(str, "-greeter") != NULL) {
+			if (s) rfbLog("dm_string: %s\n", str);
 			return 1;
 		}
 	}
+	if (!strcmp(str, "kdmgreet") || !strcmp(str, "Kdmgreet")) {
+		if (s) rfbLog("dm_string: %s\n", str);
+		return 1;
+	}
 	return 0;
 }
 
-static int gdm_still_running(void) {
+static int dm_still_running(void) {
 #if NO_X11
 	return 0;
 #else
@@ -195,7 +204,7 @@ static int gdm_still_running(void) {
 		char *name = NULL;
 		Window w = winlist[i];
 		if (XFetchName(dpy, w, &name) && name != NULL) {
-			saw_gdm_name += gdm_string(name);
+			saw_gdm_name += dm_string(name);
 			XFree_wr(name);
 		}
 		classhint->res_name = NULL;
@@ -203,12 +212,12 @@ static int gdm_still_running(void) {
 		if (XGetClassHint(dpy, w, classhint)) {
 			name = classhint->res_name;
 			if (name != NULL) {
-				saw_gdm_name += gdm_string(name);
+				saw_gdm_name += dm_string(name);
 				XFree_wr(name);
 			}
 			name = classhint->res_class;
 			if (name != NULL) {
-				saw_gdm_name += gdm_string(name);
+				saw_gdm_name += dm_string(name);
 				XFree_wr(name);
 			}
 		}
@@ -230,6 +239,7 @@ static int gdm_still_running(void) {
 
 static int wm_running(void) {
 	char *s = getenv("DEBUG_WM_RUNNING");
+	int ret = 0;
 	RAWFB_RET(0)
 #if NO_X11
 	return 0;
@@ -238,30 +248,36 @@ static int wm_running(void) {
 	 * Unfortunately with recent GDM (v2.28), they run gnome-session,
 	 * dbus-launch, and metacity for the Login greeter!  So the simple
 	 * XInternAtom checks below no longer work.
+         * We also see a similar thing with KDE.
 	 */
-	if (gdm_still_running()) {
+	if (dm_still_running()) {
 		return 0;
 	}
 
 	/* we are xlocked. */
 	if (XInternAtom(dpy, "_NET_SUPPORTED", True) != None) {
 		if (s) rfbLog("wm is running (_NET_SUPPORTED).\n");
-		return 1;
+		ret++;
 	}
 	if (XInternAtom(dpy, "_WIN_PROTOCOLS", True) != None) {
 		if (s) rfbLog("wm is running (_WIN_PROTOCOLS).\n");
-		return 1;
+		ret++;
 	}
 	if (XInternAtom(dpy, "_XROOTPMAP_ID", True) != None) {
 		if (s) rfbLog("wm is running (_XROOTPMAP_ID).\n");
-		return 1;
+		ret++;
 	}
 	if (XInternAtom(dpy, "_MIT_PRIORITY_COLORS", True) != None) {
 		if (s) rfbLog("wm is running (_MIT_PRIORITY_COLORS).\n");
+		ret++;
+	}
+	if (!ret) {
+		if (s) rfbLog("wm is not running.\n");
+		return 0;
+	} else {
+		if (s) rfbLog("wm is running ret=%d.\n", ret);
 		return 1;
 	}
-	if (s) rfbLog("wm is not running.\n");
-	return 0;
 #endif	/* NO_X11 */
 	
 }
@@ -307,6 +323,9 @@ int guess_dm_gone(int t1, int t2) {
 		}
 		X_UNLOCK;
 	}
+	if (getenv("DEBUG_WM_RUNNING")) {
+		rfbLog("guess_dm_gone: wait=%d\n", wait);
+	}
 	/* we assume they've logged in OK after wait seconds... */
 	if (time(NULL) <= tcheck + wait)  {
 		return 0;
@@ -365,7 +384,7 @@ static void initialize_xevents(int reset) {
 		 * We try to delay creating selwin until we are past
 		 * any GDM, (or other KillInitClients=true) manager.
 		 */
-		if (guess_dm_gone(5, 45)) {
+		if (guess_dm_gone(8, 45)) {
 			X_LOCK;
 			selwin = XCreateSimpleWindow(dpy, rootwin, 3, 2, 1, 1, 0, 0, 0);
 			X_UNLOCK;
@@ -400,7 +419,7 @@ static void initialize_xevents(int reset) {
 		 * we are past the display manager, due to Xorg bug:
 		 * http://bugs.freedesktop.org/show_bug.cgi?id=18451
 		 */
-		if (guess_dm_gone(5, 45)) {
+		if (guess_dm_gone(8, 45)) {
 			initialize_xfixes();
 			did_xfixes = 1;
 			if (! quiet) rfbLog("called initialize_xfixes()\n");
diff --git a/x11vnc/xwrappers.c b/x11vnc/xwrappers.c
index 6037114ce6bcdf593b9ee2131f52899db7cd09a2..667957e4af797e19e59113918b4fdf5f57ad04d2 100644
--- a/x11vnc/xwrappers.c
+++ b/x11vnc/xwrappers.c
@@ -1320,22 +1320,25 @@ Display *XOpenDisplay_wr(char *display_name) {
 	d = XOpenDisplay(display_name);
 	if (db) fprintf(stderr, "XOpenDisplay_wr: %s  %p\n", display_name, (void *)d);
 
-	if (d == NULL) {
-	    if (!getenv("NO_XAUTHLOCALHOSTNAME")) {
-		if (!getenv("XAUTHLOCALHOSTNAME")) {
+	if (d == NULL && !getenv("NO_XAUTHLOCALHOSTNAME")) {
+		char *xalhn = getenv("XAUTHLOCALHOSTNAME");
+		if (1 || !xalhn) {
 			rfbLog("XOpenDisplay(\"%s\") failed.\n",
 			    display_name ? display_name : "");
 			rfbLog("Trying again with XAUTHLOCALHOSTNAME=localhost ...\n");
 			set_env("XAUTHLOCALHOSTNAME", "localhost");
 			d = XOpenDisplay(display_name);
-			if (0) {
+			if (d == NULL && xalhn) {
 				char *ptr = getenv("XAUTHLOCALHOSTNAME");
 				if (ptr) {
 					*(ptr-2) = '_';	/* yow */
+					rfbLog("XOpenDisplay(\"%s\") failed.\n",
+					    display_name ? display_name : "");
+					rfbLog("Trying again with unset XAUTHLOCALHOSTNAME ...\n");
+					d = XOpenDisplay(display_name);
 				}
 			}
 		}
-	    }
 	}
 
 	xauth_raw(0);