From a8123c1359cb21b246cc9f97d96993d8cff685fe Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Sat, 27 Jul 2013 19:00:25 +0000 Subject: [PATCH] OSX adaptions git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74603 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/evtloop.h | 2 +- include/wx/osx/cocoa/evtloop.h | 4 ++++ src/osx/cocoa/evtloop.mm | 28 +++++++++++++++++++++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/include/wx/evtloop.h b/include/wx/evtloop.h index 8dd5d6eb7b..d83f5d23f6 100644 --- a/include/wx/evtloop.h +++ b/include/wx/evtloop.h @@ -203,9 +203,9 @@ protected: bool m_isInsideYield; long m_eventsToProcessInsideYield; -private: // this flag is set on entry into Run() and reset before leaving it bool m_isInsideRun; +private: wxDECLARE_NO_COPY_CLASS(wxEventLoopBase); }; diff --git a/include/wx/osx/cocoa/evtloop.h b/include/wx/osx/cocoa/evtloop.h index ab15dd94af..7ae6981b29 100644 --- a/include/wx/osx/cocoa/evtloop.h +++ b/include/wx/osx/cocoa/evtloop.h @@ -16,6 +16,8 @@ public: wxGUIEventLoop(); ~wxGUIEventLoop(); + int Run(); + void BeginModalSession( wxWindow* modalWindow ); void EndModalSession(); @@ -25,6 +27,8 @@ public: void OSXUseLowLevelWakeup(bool useIt) { m_osxLowLevelWakeUp = useIt ; } + void OSXOnWillTerminate(); + protected: virtual int DoDispatchTimeout(unsigned long timeout); diff --git a/src/osx/cocoa/evtloop.mm b/src/osx/cocoa/evtloop.mm index 2a27139d35..089695d1d8 100644 --- a/src/osx/cocoa/evtloop.mm +++ b/src/osx/cocoa/evtloop.mm @@ -242,6 +242,26 @@ int wxGUIEventLoop::DoDispatchTimeout(unsigned long timeout) static int gs_loopNestingLevel = 0; +int wxGUIEventLoop::Run() +{ + // because we are using native callbacks for notifying about entering and exiting + // the main event loop, we must this leave out here + + // event loops are not recursive, you need to create another loop! + wxCHECK_MSG( !IsInsideRun(), -1, wxT("can't reenter a message loop") ); + + // We might be called again, after a previous call to ScheduleExit(), so + // reset this flag. + m_shouldExit = false; + + // Set this variable to true for the duration of this method. + m_isInsideRun = true; + wxON_BLOCK_EXIT_SET(m_isInsideRun, false); + + // Finally really run the loop. + return DoRun(); +} + void wxGUIEventLoop::OSXDoRun() { /* @@ -340,7 +360,8 @@ void wxGUIEventLoop::OSXDoStop() // We should only stop the top level event loop. if ( gs_loopNestingLevel <= 1 ) { - [NSApp stop:0]; + // using terminate support all native notifications + [NSApp terminate:0]; } // For the top level loop only calling stop: is not enough when called from @@ -350,6 +371,11 @@ void wxGUIEventLoop::OSXDoStop() WakeUp(); } +void wxGUIEventLoop::OSXOnWillTerminate() +{ + OnExit(); +} + void wxGUIEventLoop::WakeUp() { // NSEvent* cevent = [NSApp currentEvent]; -- 2.47.2