diff options
| -rw-r--r-- | prepare_x11vnc_dist.sh | 7 | ||||
| -rw-r--r-- | x11vnc/8to24.c | 2 | ||||
| -rw-r--r-- | x11vnc/ChangeLog | 17 | ||||
| -rw-r--r-- | x11vnc/Makefile.am | 3 | ||||
| -rw-r--r-- | x11vnc/README | 382 | ||||
| -rw-r--r-- | x11vnc/avahi.c | 46 | ||||
| -rw-r--r-- | x11vnc/avahi.h | 2 | ||||
| -rw-r--r-- | x11vnc/cleanup.c | 8 | ||||
| -rw-r--r-- | x11vnc/connections.c | 8 | ||||
| -rw-r--r-- | x11vnc/help.c | 113 | ||||
| -rw-r--r-- | x11vnc/inet.c | 2 | ||||
| -rw-r--r-- | x11vnc/keyboard.c | 10 | ||||
| -rwxr-xr-x | x11vnc/misc/ultravnc_repeater.pl | 5 | ||||
| -rw-r--r-- | x11vnc/options.c | 1 | ||||
| -rw-r--r-- | x11vnc/options.h | 1 | ||||
| -rw-r--r-- | x11vnc/pointer.c | 15 | ||||
| -rw-r--r-- | x11vnc/pointer.h | 2 | ||||
| -rw-r--r-- | x11vnc/remote.c | 24 | ||||
| -rw-r--r-- | x11vnc/scan.c | 4 | ||||
| -rw-r--r-- | x11vnc/screen.c | 90 | ||||
| -rw-r--r-- | x11vnc/sslhelper.c | 6 | ||||
| -rw-r--r-- | x11vnc/ssltools.h | 41 | ||||
| -rwxr-xr-x | x11vnc/tkx11vnc | 1 | ||||
| -rw-r--r-- | x11vnc/tkx11vnc.h | 1 | ||||
| -rw-r--r-- | x11vnc/unixpw.c | 49 | ||||
| -rw-r--r-- | x11vnc/user.c | 3 | ||||
| -rw-r--r-- | x11vnc/userinput.c | 4 | ||||
| -rw-r--r-- | x11vnc/x11vnc.1 | 115 | ||||
| -rw-r--r-- | x11vnc/x11vnc.c | 10 | ||||
| -rw-r--r-- | x11vnc/x11vnc_defs.c | 2 | ||||
| -rw-r--r-- | x11vnc/xevents.c | 47 | ||||
| -rw-r--r-- | x11vnc/xwrappers.c | 13 | 
32 files changed, 769 insertions, 265 deletions
diff --git a/prepare_x11vnc_dist.sh b/prepare_x11vnc_dist.sh index e28ea6d..2f6fec1 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 4c55e02..75ab68a 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 5e9a59c..8eb44c7 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 c18f49d..163f930 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 d440a82..8666aad 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 7f38d57..7c646b7 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 a8a07e3..7b7a6bc 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 e9222b5..4ecef42 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 d1af60e..abb7a27 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 90dddfd..5eb80cc 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 a70ce24..a7410ee 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 edce680..9e9e044 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 00ade34..0c44a05 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 0ad72f9..890a8a4 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 34ec6c1..cfe0cdd 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 097a43c..c57d2d7 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 558f381..1fe5e0b 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 6b2903b..fef39af 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 7ef931c..b8fa645 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 c41774c..6bada90 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 a363eee..ca5168f 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 89849a5..9c74d5f 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 afff89c..c87d753 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 c38e600..46f4bbc 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 90c2e06..b610fa9 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 150ad37..e9028ba 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 8c83080..84bcb7b 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 7de21cb..cfab152 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 96238b6..3f965e2 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 9ef72e6..fc6215b 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 4221090..2fc122d 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 6037114..667957e 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);  | 
