From 9aee1212251a85e7e52246a621e921af7da6be8d Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Wed, 17 Mar 2010 08:05:04 +0000 Subject: [PATCH] adding proper removal of observer for stacked event loops, using cfrunloop for console on osx as well git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63698 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/evtloop.h | 10 +++++----- include/wx/osx/evtloop.h | 3 +++ include/wx/unix/evtloop.h | 2 +- src/osx/core/evtloop_cf.cpp | 5 ++++- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/include/wx/evtloop.h b/include/wx/evtloop.h index 642cc128f0..3ba5c71aed 100644 --- a/include/wx/evtloop.h +++ b/include/wx/evtloop.h @@ -228,11 +228,6 @@ private: #endif // platforms using "manual" loop -// include the header defining wxConsoleEventLoop for Unix systems -#if defined(__UNIX__) - #include "wx/unix/evtloop.h" -#endif - // we're moving away from old m_impl wxEventLoop model as otherwise the user // code doesn't have access to platform-specific wxEventLoop methods and this // can sometimes be very useful (e.g. under MSW this is necessary for @@ -302,6 +297,11 @@ protected: #endif // wxUSE_GUI +// include the header defining wxConsoleEventLoop for Unix systems +#if defined(__UNIX__) +#include "wx/unix/evtloop.h" +#endif + #if wxUSE_GUI // we use a class rather than a typedef because wxEventLoop is // forward-declared in many places diff --git a/include/wx/osx/evtloop.h b/include/wx/osx/evtloop.h index bc6b5fddfe..b86cfeecf3 100644 --- a/include/wx/osx/evtloop.h +++ b/include/wx/osx/evtloop.h @@ -70,6 +70,9 @@ protected: // the loop exit code int m_exitcode; + // cfrunloop + CFRunLoopRef m_runLoop; + // runloop observer CFRunLoopObserverRef m_runLoopObserver; diff --git a/include/wx/unix/evtloop.h b/include/wx/unix/evtloop.h index 1c47c5cd55..4c57136f3a 100644 --- a/include/wx/unix/evtloop.h +++ b/include/wx/unix/evtloop.h @@ -27,7 +27,7 @@ namespace wxPrivate class WXDLLIMPEXP_BASE wxConsoleEventLoop #ifdef __WXOSX__ -: public wxEventLoopBase +: public wxCFEventLoop #else : public wxEventLoopManual #endif diff --git a/src/osx/core/evtloop_cf.cpp b/src/osx/core/evtloop_cf.cpp index 429312ac88..fae9a5dc5d 100644 --- a/src/osx/core/evtloop_cf.cpp +++ b/src/osx/core/evtloop_cf.cpp @@ -186,16 +186,19 @@ wxCFEventLoop::wxCFEventLoop() { m_shouldExit = false; + m_runLoop = CFGetCurrentRunLoop(); + CFRunLoopObserverContext ctxt; bzero( &ctxt, sizeof(ctxt) ); ctxt.info = this; m_runLoopObserver = CFRunLoopObserverCreate( kCFAllocatorDefault, kCFRunLoopBeforeTimers | kCFRunLoopBeforeWaiting , true /* repeats */, 0, wxObserverCallBack, &ctxt ); - CFRunLoopAddObserver(CFGetCurrentRunLoop(), m_runLoopObserver, kCFRunLoopDefaultMode); + CFRunLoopAddObserver(m_runLoop, m_runLoopObserver, kCFRunLoopDefaultMode); } wxCFEventLoop::~wxCFEventLoop() { + CFRunLoopRemoveObserver(m_runLoop, m_runLoopObserver, kCFRunLoopDefaultMode); } -- 2.45.2