diff --git a/lib/arch/CArchAppUtilUnix.cpp b/lib/arch/CArchAppUtilUnix.cpp index b66126a2..bedc4afa 100644 --- a/lib/arch/CArchAppUtilUnix.cpp +++ b/lib/arch/CArchAppUtilUnix.cpp @@ -34,6 +34,10 @@ CArchAppUtilUnix::parseArg(const int& argc, const char* const* argv, int& i) app().argsBase().m_display = argv[++i]; } + else if (app().isArg(i, argc, argv, NULL, "--disable-xinitthreads")) { + app().argsBase().m_disableXInitThreads = true; + } + else { // option not supported here return false; diff --git a/lib/platform/CXWindowsScreen.cpp b/lib/platform/CXWindowsScreen.cpp index 66fff57f..9dcb11ba 100644 --- a/lib/platform/CXWindowsScreen.cpp +++ b/lib/platform/CXWindowsScreen.cpp @@ -80,7 +80,7 @@ CXWindowsScreen* CXWindowsScreen::s_screen = NULL; -CXWindowsScreen::CXWindowsScreen(const char* displayName, bool isPrimary, int mouseScrollDelta) : +CXWindowsScreen::CXWindowsScreen(const char* displayName, bool isPrimary, bool disableXInitThreads, int mouseScrollDelta) : m_isPrimary(isPrimary), m_mouseScrollDelta(mouseScrollDelta), m_display(NULL), @@ -109,12 +109,11 @@ CXWindowsScreen::CXWindowsScreen(const char* displayName, bool isPrimary, int mo if (mouseScrollDelta==0) m_mouseScrollDelta=120; s_screen = this; - // initializes Xlib support for concurrent threads. - if (XInitThreads() == 0) - { - throw XArch("XInitThreads() returned zero"); + if (!disableXInitThreads) { + // initializes Xlib support for concurrent threads. + if (XInitThreads() == 0) + throw XArch("XInitThreads() returned zero"); } - // set the X I/O error handler so we catch the display disconnecting XSetIOErrorHandler(&CXWindowsScreen::ioErrorHandler); diff --git a/lib/platform/CXWindowsScreen.h b/lib/platform/CXWindowsScreen.h index 17e9bb4b..753ec9de 100644 --- a/lib/platform/CXWindowsScreen.h +++ b/lib/platform/CXWindowsScreen.h @@ -34,7 +34,7 @@ class CXWindowsScreenSaver; //! Implementation of IPlatformScreen for X11 class CXWindowsScreen : public CPlatformScreen { public: - CXWindowsScreen(const char* displayName, bool isPrimary, int mouseScrollDelta=0); + CXWindowsScreen(const char* displayName, bool isPrimary, bool disableXInitThreads, int mouseScrollDelta=0); virtual ~CXWindowsScreen(); //! @name manipulators diff --git a/lib/synergy/CApp.cpp b/lib/synergy/CApp.cpp index 161859fe..eb7f7757 100644 --- a/lib/synergy/CApp.cpp +++ b/lib/synergy/CApp.cpp @@ -58,6 +58,9 @@ m_pauseOnExit(false), #else m_daemon(true), // backward compatibility for unix (daemon by default) #endif +#if WINAPI_XWINDOWS +m_disableXInitThreads(false), +#endif m_backend(false), m_restartable(true), m_noHooks(false), diff --git a/lib/synergy/CApp.h b/lib/synergy/CApp.h index 15528a2c..5375f612 100644 --- a/lib/synergy/CApp.h +++ b/lib/synergy/CApp.h @@ -49,6 +49,9 @@ public: bool m_relaunchMode; bool m_debugServiceWait; bool m_pauseOnExit; +#endif +#if WINAPI_XWINDOWS + bool m_disableXInitThreads; #endif }; diff --git a/lib/synergy/CClientApp.cpp b/lib/synergy/CClientApp.cpp index 77a086b4..e3c9f511 100644 --- a/lib/synergy/CClientApp.cpp +++ b/lib/synergy/CClientApp.cpp @@ -220,7 +220,9 @@ CClientApp::createScreen() #if WINAPI_MSWINDOWS return new CScreen(new CMSWindowsScreen(false, args().m_noHooks)); #elif WINAPI_XWINDOWS - return new CScreen(new CXWindowsScreen(args().m_display, false, args().m_yscroll)); + return new CScreen(new CXWindowsScreen( + args().m_display, false, args().m_disableXInitThreads, + args().m_yscroll)); #elif WINAPI_CARBON return new CScreen(new COSXScreen(false)); #endif diff --git a/lib/synergy/CServerApp.cpp b/lib/synergy/CServerApp.cpp index 141ed4bc..290afc33 100644 --- a/lib/synergy/CServerApp.cpp +++ b/lib/synergy/CServerApp.cpp @@ -639,7 +639,8 @@ CServerApp::createScreen() #if WINAPI_MSWINDOWS return new CScreen(new CMSWindowsScreen(true, args().m_noHooks)); #elif WINAPI_XWINDOWS - return new CScreen(new CXWindowsScreen(args().m_display, true)); + return new CScreen(new CXWindowsScreen( + args().m_display, true, args().m_disableXInitThreads)); #elif WINAPI_CARBON return new CScreen(new COSXScreen(true)); #endif