+void wxModalEventLoop::DoRun()
+{
+ wxMacAutoreleasePool pool;
+
+ // If the app hasn't started, flush the event queue
+ // If we don't do this, the Dock doesn't get the message that
+ // the app has started so will refuse to activate it.
+ [NSApplication sharedApplication];
+ if (![NSApp isRunning])
+ {
+ while(NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES])
+ {
+ [NSApp sendEvent:event];
+ }
+ }
+
+ [NSApp runModalForWindow:m_modalNativeWindow];
+}
+
+void wxModalEventLoop::DoStop()
+{
+ [NSApp abortModal];
+}
+
+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 )
+ {
+ // we must show now, otherwise beginModalSessionForWindow does it but it
+ // also would do a centering of the window before overriding all our position
+ if ( !modalWindow->IsShownOnScreen() )
+ modalWindow->Show();
+
+ wxNonOwnedWindow* now = dynamic_cast<wxNonOwnedWindow*> (modalWindow);
+ wxASSERT_MSG( now != NULL, "must pass in a toplevel window for modal event loop" );
+ nsnow = now ? now->GetWXWindow() : nil;
+ }
+ else
+ {
+ NSRect r = NSMakeRect(10, 10, 0, 0);
+ nsnow = [NSPanel alloc];
+ [nsnow initWithContentRect:r
+ styleMask:NSBorderlessWindowMask
+ backing:NSBackingStoreBuffered
+ defer:YES
+ ];
+ [nsnow orderOut:nil];
+ m_dummyWindow = nsnow;
+ }
+ m_modalSession = [NSApp beginModalSessionForWindow:nsnow];
+ wxASSERT_MSG(m_modalSession != NULL, "modal session couldn't be started");
+}
+
+void wxGUIEventLoop::EndModalSession()
+{
+ wxASSERT_MSG(m_modalSession != NULL, "no modal session active");
+
+ wxASSERT_MSG(m_modalNestedLevel > 0, "incorrect modal nesting level");
+
+ if ( --m_modalNestedLevel == 0 )
+ {
+ [NSApp endModalSession:(NSModalSession)m_modalSession];
+ m_modalSession = nil;
+ if ( m_dummyWindow )
+ {
+ [m_dummyWindow release];
+ m_dummyWindow = nil;
+ }
+ }
+}
+
+//
+//
+//
+
+wxWindowDisabler::wxWindowDisabler(bool disable)
+{
+ m_modalEventLoop = NULL;
+ m_disabled = disable;
+ if ( disable )
+ DoDisable();