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
This commit is contained in:
Stefan Csomor
2010-03-17 08:05:04 +00:00
parent 80eee8378f
commit 9aee121225
4 changed files with 13 additions and 7 deletions

View File

@@ -228,11 +228,6 @@ private:
#endif // platforms using "manual" loop #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 // 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 // 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 // can sometimes be very useful (e.g. under MSW this is necessary for
@@ -302,6 +297,11 @@ protected:
#endif // wxUSE_GUI #endif // wxUSE_GUI
// include the header defining wxConsoleEventLoop for Unix systems
#if defined(__UNIX__)
#include "wx/unix/evtloop.h"
#endif
#if wxUSE_GUI #if wxUSE_GUI
// we use a class rather than a typedef because wxEventLoop is // we use a class rather than a typedef because wxEventLoop is
// forward-declared in many places // forward-declared in many places

View File

@@ -70,6 +70,9 @@ protected:
// the loop exit code // the loop exit code
int m_exitcode; int m_exitcode;
// cfrunloop
CFRunLoopRef m_runLoop;
// runloop observer // runloop observer
CFRunLoopObserverRef m_runLoopObserver; CFRunLoopObserverRef m_runLoopObserver;

View File

@@ -27,7 +27,7 @@ namespace wxPrivate
class WXDLLIMPEXP_BASE wxConsoleEventLoop class WXDLLIMPEXP_BASE wxConsoleEventLoop
#ifdef __WXOSX__ #ifdef __WXOSX__
: public wxEventLoopBase : public wxCFEventLoop
#else #else
: public wxEventLoopManual : public wxEventLoopManual
#endif #endif

View File

@@ -186,16 +186,19 @@ wxCFEventLoop::wxCFEventLoop()
{ {
m_shouldExit = false; m_shouldExit = false;
m_runLoop = CFGetCurrentRunLoop();
CFRunLoopObserverContext ctxt; CFRunLoopObserverContext ctxt;
bzero( &ctxt, sizeof(ctxt) ); bzero( &ctxt, sizeof(ctxt) );
ctxt.info = this; ctxt.info = this;
m_runLoopObserver = CFRunLoopObserverCreate( kCFAllocatorDefault, kCFRunLoopBeforeTimers | kCFRunLoopBeforeWaiting , true /* repeats */, 0, m_runLoopObserver = CFRunLoopObserverCreate( kCFAllocatorDefault, kCFRunLoopBeforeTimers | kCFRunLoopBeforeWaiting , true /* repeats */, 0,
wxObserverCallBack, &ctxt ); wxObserverCallBack, &ctxt );
CFRunLoopAddObserver(CFGetCurrentRunLoop(), m_runLoopObserver, kCFRunLoopDefaultMode); CFRunLoopAddObserver(m_runLoop, m_runLoopObserver, kCFRunLoopDefaultMode);
} }
wxCFEventLoop::~wxCFEventLoop() wxCFEventLoop::~wxCFEventLoop()
{ {
CFRunLoopRemoveObserver(m_runLoop, m_runLoopObserver, kCFRunLoopDefaultMode);
} }