Merge branch 'perf' of https://github.com/CendioOssman/tigervnc
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3091d7b..5ecd89e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -226,6 +226,9 @@
   if(X11_Xcursor_FOUND)
     set(FLTK_LIBRARIES ${FLTK_LIBRARIES} ${X11_Xcursor_LIB})
   endif()
+  if(X11_Xrender_FOUND)
+    set(FLTK_LIBRARIES ${FLTK_LIBRARIES} ${X11_Xrender_LIB})
+  endif()
 endif()
 
 if(FLTK_FOUND)
diff --git a/cmake/StaticBuild.cmake b/cmake/StaticBuild.cmake
index 0b99035..0ec3361 100644
--- a/cmake/StaticBuild.cmake
+++ b/cmake/StaticBuild.cmake
@@ -79,12 +79,12 @@
     elseif(APPLE)
       set(FLTK_LIBRARIES "${FLTK_LIBRARIES} -framework Cocoa")
     else()
-      set(FLTK_LIBRARIES "${FLTK_LIBRARIES} -lm")
+      set(FLTK_LIBRARIES "${FLTK_LIBRARIES} -lm -ldl")
     endif()
 
     if(X11_FOUND AND NOT APPLE)
       if(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
-        set(FLTK_LIBRARIES "${FLTK_LIBRARIES} ${X11_Xcursor_LIB} ${X11_Xfixes_LIB} -Wl,-Bstatic -lXft -Wl,-Bdynamic -lfontconfig -lXext -R/usr/sfw/lib")
+        set(FLTK_LIBRARIES "${FLTK_LIBRARIES} ${X11_Xcursor_LIB} ${X11_Xfixes_LIB} -Wl,-Bstatic -lXft -Wl,-Bdynamic -lfontconfig -lXrender -lXext -R/usr/sfw/lib -L=/usr/sfw/lib -lfreetype -lsocket -lnsl")
       else()
         set(FLTK_LIBRARIES "${FLTK_LIBRARIES} -Wl,-Bstatic -lXcursor -lXfixes -lXft -lfontconfig -lexpat -lfreetype -lbz2 -lXrender -lXext -lXinerama -Wl,-Bdynamic")
       endif()
diff --git a/common/os/winerrno.h b/common/os/winerrno.h
new file mode 100644
index 0000000..aebbdbe
--- /dev/null
+++ b/common/os/winerrno.h
@@ -0,0 +1,101 @@
+
+/* Generated with:
+cat /usr/i686-pc-mingw32/sys-root/mingw/include/winerror.h \
+ | awk '/#define WSAE.*WSABASE/{gsub("WSA", ""); print "#undef " $2 "\n#define " $2 " WSA" $2}' \
+ | egrep -v '_QOS|PROVIDER|PROCTABLE'
+*/
+
+#undef EINTR
+#define EINTR WSAEINTR
+#undef EBADF
+#define EBADF WSAEBADF
+#undef EACCES
+#define EACCES WSAEACCES
+#undef EFAULT
+#define EFAULT WSAEFAULT
+#undef EINVAL
+#define EINVAL WSAEINVAL
+#undef EMFILE
+#define EMFILE WSAEMFILE
+#undef EWOULDBLOCK
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#undef EINPROGRESS
+#define EINPROGRESS WSAEINPROGRESS
+#undef EALREADY
+#define EALREADY WSAEALREADY
+#undef ENOTSOCK
+#define ENOTSOCK WSAENOTSOCK
+#undef EDESTADDRREQ
+#define EDESTADDRREQ WSAEDESTADDRREQ
+#undef EMSGSIZE
+#define EMSGSIZE WSAEMSGSIZE
+#undef EPROTOTYPE
+#define EPROTOTYPE WSAEPROTOTYPE
+#undef ENOPROTOOPT
+#define ENOPROTOOPT WSAENOPROTOOPT
+#undef EPROTONOSUPPORT
+#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
+#undef ESOCKTNOSUPPORT
+#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
+#undef EOPNOTSUPP
+#define EOPNOTSUPP WSAEOPNOTSUPP
+#undef EPFNOSUPPORT
+#define EPFNOSUPPORT WSAEPFNOSUPPORT
+#undef EAFNOSUPPORT
+#define EAFNOSUPPORT WSAEAFNOSUPPORT
+#undef EADDRINUSE
+#define EADDRINUSE WSAEADDRINUSE
+#undef EADDRNOTAVAIL
+#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
+#undef ENETDOWN
+#define ENETDOWN WSAENETDOWN
+#undef ENETUNREACH
+#define ENETUNREACH WSAENETUNREACH
+#undef ENETRESET
+#define ENETRESET WSAENETRESET
+#undef ECONNABORTED
+#define ECONNABORTED WSAECONNABORTED
+#undef ECONNRESET
+#define ECONNRESET WSAECONNRESET
+#undef ENOBUFS
+#define ENOBUFS WSAENOBUFS
+#undef EISCONN
+#define EISCONN WSAEISCONN
+#undef ENOTCONN
+#define ENOTCONN WSAENOTCONN
+#undef ESHUTDOWN
+#define ESHUTDOWN WSAESHUTDOWN
+#undef ETOOMANYREFS
+#define ETOOMANYREFS WSAETOOMANYREFS
+#undef ETIMEDOUT
+#define ETIMEDOUT WSAETIMEDOUT
+#undef ECONNREFUSED
+#define ECONNREFUSED WSAECONNREFUSED
+#undef ELOOP
+#define ELOOP WSAELOOP
+#undef ENAMETOOLONG
+#define ENAMETOOLONG WSAENAMETOOLONG
+#undef EHOSTDOWN
+#define EHOSTDOWN WSAEHOSTDOWN
+#undef EHOSTUNREACH
+#define EHOSTUNREACH WSAEHOSTUNREACH
+#undef ENOTEMPTY
+#define ENOTEMPTY WSAENOTEMPTY
+#undef EPROCLIM
+#define EPROCLIM WSAEPROCLIM
+#undef EUSERS
+#define EUSERS WSAEUSERS
+#undef EDQUOT
+#define EDQUOT WSAEDQUOT
+#undef ESTALE
+#define ESTALE WSAESTALE
+#undef EREMOTE
+#define EREMOTE WSAEREMOTE
+#undef EDISCON
+#define EDISCON WSAEDISCON
+#undef ENOMORE
+#define ENOMORE WSAENOMORE
+#undef ECANCELLED
+#define ECANCELLED WSAECANCELLED
+#undef EREFUSED
+#define EREFUSED WSAEREFUSED
diff --git a/common/rdr/FdInStream.cxx b/common/rdr/FdInStream.cxx
index adb14c5..22433a1 100644
--- a/common/rdr/FdInStream.cxx
+++ b/common/rdr/FdInStream.cxx
@@ -31,8 +31,7 @@
 #define close closesocket
 #undef errno
 #define errno WSAGetLastError()
-#undef EINTR
-#define EINTR WSAEINTR
+#include <os/winerrno.h>
 #else
 #include <sys/types.h>
 #include <errno.h>
diff --git a/common/rdr/FdOutStream.cxx b/common/rdr/FdOutStream.cxx
index 533faa3..83360d6 100644
--- a/common/rdr/FdOutStream.cxx
+++ b/common/rdr/FdOutStream.cxx
@@ -26,11 +26,9 @@
 #ifdef _WIN32
 #include <winsock2.h>
 #define write(s,b,l) send(s,(const char*)b,l,0)
-#define EWOULDBLOCK WSAEWOULDBLOCK
 #undef errno
 #define errno WSAGetLastError()
-#undef EINTR
-#define EINTR WSAEINTR
+#include <os/winerrno.h>
 #else
 #include <sys/types.h>
 #include <errno.h>
diff --git a/contrib/packages/deb/ubuntu-precise/debian/patches/100_rethrow_signals.patch b/contrib/packages/deb/ubuntu-precise/debian/patches/100_rethrow_signals.patch
index 7c2e6d0..b40b148 100644
--- a/contrib/packages/deb/ubuntu-precise/debian/patches/100_rethrow_signals.patch
+++ b/contrib/packages/deb/ubuntu-precise/debian/patches/100_rethrow_signals.patch
@@ -1,5 +1,5 @@
---- a/unix/xserver/hw/vnc/xvnc.cc	2013-07-14 14:05:29.963390223 -0400
-+++ b/unix/xserver/hw/vnc/xvnc.cc	2013-07-14 14:04:12.840357191 -0400
+--- a/unix/xserver/hw/vnc/xvnc.c	2013-07-14 14:05:29.963390223 -0400
++++ b/unix/xserver/hw/vnc/xvnc.c	2013-07-14 14:04:12.840357191 -0400
 @@ -250,7 +250,7 @@
  #if XORG < 111
  AbortDDX()
diff --git a/contrib/packages/deb/ubuntu-precise/debian/patches/511_tigervnc11-gethomedir.patch b/contrib/packages/deb/ubuntu-precise/debian/patches/511_tigervnc11-gethomedir.patch
index 208608c..ac1a85f 100644
--- a/contrib/packages/deb/ubuntu-precise/debian/patches/511_tigervnc11-gethomedir.patch
+++ b/contrib/packages/deb/ubuntu-precise/debian/patches/511_tigervnc11-gethomedir.patch
@@ -8,7 +8,7 @@
  COMMON_LIBS=$(NETWORK_LIB) $(RFB_LIB) $(RDR_LIB) $(XREGION_LIB)
  
  noinst_LTLIBRARIES = libvnccommon.la
-@@ -55,7 +56,7 @@ libvnc_la_CPPFLAGS = $(XVNC_CPPFLAGS) -I
+@@ -55,6 +56,6 @@ libvnc_la_CPPFLAGS = $(XVNC_CPPFLAGS) -I
  
  libvnc_la_LDFLAGS = -module -avoid-version -Wl,-z,now
  
@@ -16,4 +16,3 @@
 +libvnc_la_LIBADD = libvnccommon.la $(COMMON_LIBS) $(OS_LIB)
  
  EXTRA_DIST = Xvnc.man
- 
diff --git a/contrib/packages/deb/ubuntu-trusty/debian/patches/100_rethrow_signals.patch b/contrib/packages/deb/ubuntu-trusty/debian/patches/100_rethrow_signals.patch
index 7c2e6d0..b40b148 100644
--- a/contrib/packages/deb/ubuntu-trusty/debian/patches/100_rethrow_signals.patch
+++ b/contrib/packages/deb/ubuntu-trusty/debian/patches/100_rethrow_signals.patch
@@ -1,5 +1,5 @@
---- a/unix/xserver/hw/vnc/xvnc.cc	2013-07-14 14:05:29.963390223 -0400
-+++ b/unix/xserver/hw/vnc/xvnc.cc	2013-07-14 14:04:12.840357191 -0400
+--- a/unix/xserver/hw/vnc/xvnc.c	2013-07-14 14:05:29.963390223 -0400
++++ b/unix/xserver/hw/vnc/xvnc.c	2013-07-14 14:04:12.840357191 -0400
 @@ -250,7 +250,7 @@
  #if XORG < 111
  AbortDDX()
diff --git a/contrib/packages/deb/ubuntu-trusty/debian/patches/511_tigervnc11-gethomedir.patch b/contrib/packages/deb/ubuntu-trusty/debian/patches/511_tigervnc11-gethomedir.patch
index 208608c..ac1a85f 100644
--- a/contrib/packages/deb/ubuntu-trusty/debian/patches/511_tigervnc11-gethomedir.patch
+++ b/contrib/packages/deb/ubuntu-trusty/debian/patches/511_tigervnc11-gethomedir.patch
@@ -8,7 +8,7 @@
  COMMON_LIBS=$(NETWORK_LIB) $(RFB_LIB) $(RDR_LIB) $(XREGION_LIB)
  
  noinst_LTLIBRARIES = libvnccommon.la
-@@ -55,7 +56,7 @@ libvnc_la_CPPFLAGS = $(XVNC_CPPFLAGS) -I
+@@ -55,6 +56,6 @@ libvnc_la_CPPFLAGS = $(XVNC_CPPFLAGS) -I
  
  libvnc_la_LDFLAGS = -module -avoid-version -Wl,-z,now
  
@@ -16,4 +16,3 @@
 +libvnc_la_LIBADD = libvnccommon.la $(COMMON_LIBS) $(OS_LIB)
  
  EXTRA_DIST = Xvnc.man
- 
diff --git a/contrib/packages/rpm/el5/SOURCES/tigervnc11-gethomedir.patch b/contrib/packages/rpm/el5/SOURCES/tigervnc11-gethomedir.patch
index fd07be3..ea54438 100644
--- a/contrib/packages/rpm/el5/SOURCES/tigervnc11-gethomedir.patch
+++ b/contrib/packages/rpm/el5/SOURCES/tigervnc11-gethomedir.patch
@@ -9,7 +9,7 @@
  COMMON_LIBS=$(NETWORK_LIB) $(RFB_LIB) $(RDR_LIB) $(XREGION_LIB)
  
  noinst_LTLIBRARIES = libvnccommon.la
-@@ -52,7 +53,7 @@ libvnc_la_CPPFLAGS = $(XVNC_CPPFLAGS) -I
+@@ -52,6 +53,6 @@ libvnc_la_CPPFLAGS = $(XVNC_CPPFLAGS) -I
  
  libvnc_la_LDFLAGS = -module -avoid-version -Wl,-z,now
  
@@ -17,4 +17,3 @@
 +libvnc_la_LIBADD = libvnccommon.la $(COMMON_LIBS) $(OS_LIB)
  
  EXTRA_DIST = Xvnc.man
- 
diff --git a/contrib/packages/rpm/el6/SOURCES/tigervnc11-gethomedir.patch b/contrib/packages/rpm/el6/SOURCES/tigervnc11-gethomedir.patch
index 0a4252d..53b4dc1 100644
--- a/contrib/packages/rpm/el6/SOURCES/tigervnc11-gethomedir.patch
+++ b/contrib/packages/rpm/el6/SOURCES/tigervnc11-gethomedir.patch
@@ -9,7 +9,7 @@
  COMMON_LIBS=$(NETWORK_LIB) $(RFB_LIB) $(RDR_LIB) $(XREGION_LIB)
  
  noinst_LTLIBRARIES = libvnccommon.la
-@@ -55,7 +56,7 @@ libvnc_la_CPPFLAGS = $(XVNC_CPPFLAGS) -I
+@@ -55,6 +56,6 @@ libvnc_la_CPPFLAGS = $(XVNC_CPPFLAGS) -I
  
  libvnc_la_LDFLAGS = -module -avoid-version -Wl,-z,now
  
@@ -17,4 +17,3 @@
 +libvnc_la_LIBADD = libvnccommon.la $(COMMON_LIBS) $(OS_LIB)
  
  EXTRA_DIST = Xvnc.man
- 
diff --git a/unix/xserver/hw/vnc/Makefile.am b/unix/xserver/hw/vnc/Makefile.am
index 902aabf..ab8becb 100644
--- a/unix/xserver/hw/vnc/Makefile.am
+++ b/unix/xserver/hw/vnc/Makefile.am
@@ -31,6 +31,11 @@
 	$(top_srcdir)/Xi/stubs.c $(top_srcdir)/mi/miinitext.c \
 	$(top_srcdir)/fb/fbcmap_mi.c buildtime.c
 
+# Xvnc contains no C++ sources so automake doesn't understand that we
+# need to use the C++ compiler to link things. This is the upstream
+# recommendation for coaxing automake.
+nodist_EXTRA_Xvnc_SOURCES = dummy.cxx
+
 Xvnc_CPPFLAGS = $(XVNC_CPPFLAGS) -DTIGERVNC -DNO_MODULE_EXTS \
 	-UHAVE_CONFIG_H \
 	-DXFree86Server -DVENDOR_RELEASE="$(VENDOR_RELEASE)" \
@@ -47,6 +52,9 @@
 
 libvnc_la_SOURCES = vncModule.c
 
+# See Xvnc magic above
+nodist_EXTRA_libvnc_la_SOURCES = dummy.cxx
+
 libvnc_la_CPPFLAGS = $(XVNC_CPPFLAGS) -I$(TIGERVNC_SRCDIR)/common -UHAVE_CONFIG_H \
 	-I$(top_srcdir)/hw/xfree86/common \
 	-I$(top_srcdir)/hw/xfree86/os-support \
diff --git a/unix/xserver/hw/vnc/vncExtInit.h b/unix/xserver/hw/vnc/vncExtInit.h
index 6c9857c..65cbbe4 100644
--- a/unix/xserver/hw/vnc/vncExtInit.h
+++ b/unix/xserver/hw/vnc/vncExtInit.h
@@ -20,6 +20,7 @@
 #define __VNCEXTINIT_H__
 
 #include <stdint.h>
+#include <stddef.h>
 #include <sys/select.h>
 
 // Only from C++
diff --git a/unix/xserver/hw/vnc/vncModule.c b/unix/xserver/hw/vnc/vncModule.c
index 5dcf875..8cbf9c2 100644
--- a/unix/xserver/hw/vnc/vncModule.c
+++ b/unix/xserver/hw/vnc/vncModule.c
@@ -29,6 +29,9 @@
 #endif
 
 #include "xorg-version.h"
+#if XORG <= 111
+typedef pointer XF86OptionPtr;
+#endif
 
 #include "xf86.h"
 #include "xf86Module.h"
diff --git a/vncviewer/vncviewer.cxx b/vncviewer/vncviewer.cxx
index 7fb712a..d980ed2 100644
--- a/vncviewer/vncviewer.cxx
+++ b/vncviewer/vncviewer.cxx
@@ -32,6 +32,7 @@
 #include <sys/stat.h>
 
 #ifdef WIN32
+#include <os/winerrno.h>
 #include <direct.h>
 #define mkdir(path, mode) _mkdir(path)
 #endif