diff --git a/src/lib/platform/COSXDragSimulator.m b/src/lib/platform/COSXDragSimulator.m index b85cdb22..ee073465 100644 --- a/src/lib/platform/COSXDragSimulator.m +++ b/src/lib/platform/COSXDragSimulator.m @@ -26,9 +26,14 @@ COSXDragView* g_dragView = NULL; void runCocoaApp() { + // HACK: sleep, carbon loop should start first. + usleep(1000000); + NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; + NSApplication* app = [[NSApplication alloc] init]; + NSWindow* window = [[NSWindow alloc] initWithContentRect: NSMakeRect(0, 0, 100, 4) styleMask: NSBorderlessWindowMask @@ -44,8 +49,10 @@ runCocoaApp() g_dragView = dragView; [window setContentView: dragView]; + NSLog(@"starting cocoa loop"); [app run]; + NSLog(@"cocoa: release"); [pool release]; } diff --git a/src/lib/platform/COSXScreen.cpp b/src/lib/platform/COSXScreen.cpp index 194c3463..fd0f675e 100644 --- a/src/lib/platform/COSXScreen.cpp +++ b/src/lib/platform/COSXScreen.cpp @@ -1691,8 +1691,13 @@ COSXScreen::watchSystemPowerThread(void*) return; } - // start the run loop LOG((CLOG_DEBUG "started watchSystemPowerThread")); + + // HACK: sleep, this seem to stop synergy from freezing. + ARCH->sleep(1); + + // start the run loop + LOG((CLOG_DEBUG "starting carbon loop")); CFRunLoopRun(); // cleanup diff --git a/src/lib/synergy/CApp.cpp b/src/lib/synergy/CApp.cpp index 6c441017..b72fd939 100644 --- a/src/lib/synergy/CApp.cpp +++ b/src/lib/synergy/CApp.cpp @@ -385,5 +385,12 @@ CApp::handleIpcMessage(const CEvent& e, void*) if (m->type() == kIpcShutdown) { LOG((CLOG_INFO "got ipc shutdown message")); m_events->addEvent(CEvent(CEvent::kQuit)); - } + } +} + +void +CApp::runEventsLoop(void*) +{ + m_events->cacheCurrentEventQueueRef(); + m_events->loop(); } diff --git a/src/lib/synergy/CApp.h b/src/lib/synergy/CApp.h index 98bb80a3..9a84113b 100644 --- a/src/lib/synergy/CApp.h +++ b/src/lib/synergy/CApp.h @@ -112,9 +112,11 @@ protected: virtual bool parseArg(const int& argc, const char* const* argv, int& i); void initIpcClient(); void cleanupIpcClient(); + void runEventsLoop(void*); IArchTaskBarReceiver* m_taskBarReceiver; bool m_suspended; + IEventQueue* m_events; private: CArgsBase* m_args; @@ -123,7 +125,6 @@ private: CreateTaskBarReceiverFunc m_createTaskBarReceiver; ARCH_APP_UTIL m_appUtil; CIpcClient* m_ipcClient; - IEventQueue* m_events; CSocketMultiplexer* m_socketMultiplexer; CString m_fileTransferSrc; CString m_fileTransferDes; diff --git a/src/lib/synergy/CClientApp.cpp b/src/lib/synergy/CClientApp.cpp index 0bee70f9..065696d6 100644 --- a/src/lib/synergy/CClientApp.cpp +++ b/src/lib/synergy/CClientApp.cpp @@ -61,7 +61,6 @@ CClientApp::CClientApp(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver) : CApp(events, createTaskBarReceiver, new CArgs()), - m_events(events), s_client(NULL), s_clientScreen(NULL) { @@ -535,12 +534,17 @@ CClientApp::mainLoop() // later. the timer installed by startClient() will take care of // that. DAEMON_RUNNING(true); - + #if defined(MAC_OS_X_VERSION_10_7) + CThread thread( new TMethodJob( this, &CClientApp::runEventsLoop, NULL)); + + // HACK: sleep, allow queue to start. + ARCH->sleep(1); + runCocoaApp(); #else m_events->loop(); @@ -626,10 +630,3 @@ CClientApp::startNode() m_bye(kExitFailed); } } - -void -CClientApp::runEventsLoop(void*) -{ - m_events->cacheCurrentEventQueueRef(); - m_events->loop(); -} diff --git a/src/lib/synergy/CClientApp.h b/src/lib/synergy/CClientApp.h index a19c81fd..03cd9ce3 100644 --- a/src/lib/synergy/CClientApp.h +++ b/src/lib/synergy/CClientApp.h @@ -87,10 +87,8 @@ public: private: virtual bool parseArg(const int& argc, const char* const* argv, int& i); - void runEventsLoop(void*); private: CClient* s_client; CScreen* s_clientScreen; - IEventQueue* m_events; }; diff --git a/src/lib/synergy/CServerApp.cpp b/src/lib/synergy/CServerApp.cpp index d20502be..3ee62f22 100644 --- a/src/lib/synergy/CServerApp.cpp +++ b/src/lib/synergy/CServerApp.cpp @@ -63,7 +63,6 @@ CServerApp::CServerApp(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver) : CApp(events, createTaskBarReceiver, new CArgs()), - m_events(events), s_server(NULL), s_serverState(kUninitialized), s_serverScreen(NULL), @@ -788,10 +787,15 @@ CServerApp::mainLoop() DAEMON_RUNNING(true); #if defined(MAC_OS_X_VERSION_10_7) + CThread thread( new TMethodJob( this, &CServerApp::runEventsLoop, NULL)); + + // HACK: sleep, allow queue to start. + ARCH->sleep(1); + runCocoaApp(); #else m_events->loop(); @@ -915,10 +919,3 @@ CServerApp::startNode() m_bye(kExitFailed); } } - -void -CServerApp::runEventsLoop(void*) -{ - m_events->cacheCurrentEventQueueRef(); - m_events->loop(); -} diff --git a/src/lib/synergy/CServerApp.h b/src/lib/synergy/CServerApp.h index 8bc86e19..bc1b31dd 100644 --- a/src/lib/synergy/CServerApp.h +++ b/src/lib/synergy/CServerApp.h @@ -121,12 +121,9 @@ public: CClientListener* s_listener; CEventQueueTimer* s_timer; - IEventQueue* m_events; - private: virtual bool parseArg(const int& argc, const char* const* argv, int& i); void handleScreenSwitched(const CEvent&, void* data); - void runEventsLoop(void*); }; // configuration file name