X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/203ec4242ba623e2d8ce5ab7ef56bdead3001689..d5363c04ac7bfd5409b369746a67b83fd10cfdbc:/src/osx/cocoa/evtloop.mm?ds=inline diff --git a/src/osx/cocoa/evtloop.mm b/src/osx/cocoa/evtloop.mm index c9ac5ee75d..12e98beac0 100644 --- a/src/osx/cocoa/evtloop.mm +++ b/src/osx/cocoa/evtloop.mm @@ -107,12 +107,15 @@ wxGUIEventLoop::wxGUIEventLoop() { m_modalSession = nil; m_dummyWindow = nil; + m_modalNestedLevel = 0; + m_modalWindow = NULL; } wxGUIEventLoop::~wxGUIEventLoop() { wxASSERT( m_modalSession == nil ); wxASSERT( m_dummyWindow == nil ); + wxASSERT( m_modalNestedLevel == 0 ); } //----------------------------------------------------------------------------- @@ -243,9 +246,15 @@ void wxGUIEventLoop::DoRun() void wxGUIEventLoop::DoStop() { - [NSApp stop:0]; // only calling stop: is not enough when called from a runloop-observer, // therefore add a dummy event, to make sure the runloop gets another round + [NSApp stop:0]; + WakeUp(); +} + +void wxGUIEventLoop::WakeUp() +{ + wxMacAutoreleasePool autoreleasepool; NSEvent *event = [NSEvent otherEventWithType:NSApplicationDefined location:NSMakePoint(0.0, 0.0) modifierFlags:0 @@ -308,6 +317,16 @@ void wxModalEventLoop::DoStop() void wxGUIEventLoop::BeginModalSession( wxWindow* modalWindow ) { WXWindow nsnow = nil; + + if ( m_modalNestedLevel > 0 ) + { + wxASSERT_MSG( m_modalWindow == modalWindow, "Nested Modal Sessions must be based on same window"); + m_modalNestedLevel++; + return; + } + + m_modalWindow = modalWindow; + m_modalNestedLevel = 1; if ( modalWindow ) { @@ -339,12 +358,18 @@ void wxGUIEventLoop::BeginModalSession( wxWindow* modalWindow ) void wxGUIEventLoop::EndModalSession() { wxASSERT_MSG(m_modalSession != NULL, "no modal session active"); - [NSApp endModalSession:(NSModalSession)m_modalSession]; - m_modalSession = nil; - if ( m_dummyWindow ) + + wxASSERT_MSG(m_modalNestedLevel > 0, "incorrect modal nesting level"); + + if ( --m_modalNestedLevel == 0 ) { - [m_dummyWindow release]; - m_dummyWindow = nil; + [NSApp endModalSession:(NSModalSession)m_modalSession]; + m_modalSession = nil; + if ( m_dummyWindow ) + { + [m_dummyWindow release]; + m_dummyWindow = nil; + } } }