// Author: Vadim Zeitlin
// Modified by:
// Created: 2006-01-12
-// RCS-ID: $Id$
// Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#include "wx/log.h"
#endif // WX_PRECOMP
+#if wxUSE_GUI
+#include "wx/nonownedwnd.h"
+#endif
+
#include "wx/osx/private.h"
// ============================================================================
int wxGUIEventLoop::DoDispatchTimeout(unsigned long timeout)
{
wxMacAutoreleasePool autoreleasepool;
-
+
EventRef event;
OSStatus status = ReceiveNextEvent(0, NULL, timeout/1000, true, &event);
switch ( status )
}
}
-void wxGUIEventLoop::DoRun()
+void wxGUIEventLoop::WakeUp()
+{
+ OSStatus err = noErr;
+ wxMacCarbonEvent wakeupEvent;
+ wakeupEvent.Create( 'WXMC', 'WXMC', GetCurrentEventTime(),
+ kEventAttributeNone );
+ err = PostEventToQueue(GetMainEventQueue(), wakeupEvent,
+ kEventPriorityHigh );
+}
+
+void wxGUIEventLoop::OSXDoRun()
{
wxMacAutoreleasePool autoreleasepool;
- RunApplicationEventLoop();
+
+ while (!m_shouldExit)
+ {
+ RunApplicationEventLoop();
+ }
+
+ // Force enclosing event loop to temporarily exit and check
+ // if it should be stopped.
+ QuitApplicationEventLoop();
}
-void wxGUIEventLoop::DoStop()
+void wxGUIEventLoop::OSXDoStop()
{
QuitApplicationEventLoop();
}
-void wxModalEventLoop::DoRun()
+CFRunLoopRef wxGUIEventLoop::CFGetCurrentRunLoop() const
{
+ return wxCFEventLoop::CFGetCurrentRunLoop();
+}
+
+// TODO move into a evtloop_osx.cpp
+
+wxModalEventLoop::wxModalEventLoop(wxWindow *modalWindow)
+{
+ m_modalWindow = wxDynamicCast(modalWindow, wxNonOwnedWindow);
+ wxASSERT_MSG( m_modalWindow != NULL, "must pass in a toplevel window for modal event loop" );
+ m_modalNativeWindow = m_modalWindow->GetWXWindow();
+}
+
+wxModalEventLoop::wxModalEventLoop(WXWindow modalNativeWindow)
+{
+ m_modalWindow = NULL;
+ wxASSERT_MSG( modalNativeWindow != NULL, "must pass in a toplevel window for modal event loop" );
+ m_modalNativeWindow = modalNativeWindow;
+}
+
+// END move into a evtloop_osx.cpp
+
+void wxModalEventLoop::OSXDoRun()
+{
+ wxWindowDisabler disabler(m_modalWindow);
wxMacAutoreleasePool autoreleasepool;
- WindowRef windowRef = m_modalWindow->GetWXWindow();
+
+ bool resetGroupParent = false;
WindowGroupRef windowGroup = NULL;
WindowGroupRef formerParentGroup = NULL;
- bool resetGroupParent = false;
-
+
// make sure modal dialogs are in the right layer so that they are not covered
-
- if ( m_modalWindow->GetParent() == NULL )
+ if ( m_modalWindow != NULL )
{
- windowGroup = GetWindowGroup(windowRef) ;
- if ( windowGroup != GetWindowGroupOfClass( kMovableModalWindowClass ) )
+ if ( m_modalWindow->GetParent() == NULL )
{
- formerParentGroup = GetWindowGroupParent( windowGroup );
- SetWindowGroupParent( windowGroup, GetWindowGroupOfClass( kMovableModalWindowClass ) );
- resetGroupParent = true;
+ windowGroup = GetWindowGroup(m_modalNativeWindow) ;
+ if ( windowGroup != GetWindowGroupOfClass( kMovableModalWindowClass ) )
+ {
+ formerParentGroup = GetWindowGroupParent( windowGroup );
+ SetWindowGroupParent( windowGroup, GetWindowGroupOfClass( kMovableModalWindowClass ) );
+ resetGroupParent = true;
+ }
}
}
m_modalWindow->SetFocus();
-
- RunAppModalLoopForWindow(windowRef);
+
+ RunAppModalLoopForWindow(m_modalNativeWindow);
if ( resetGroupParent )
{
}
-void wxModalEventLoop::DoStop()
+void wxModalEventLoop::OSXDoStop()
{
wxMacAutoreleasePool autoreleasepool;
- WindowRef theWindow = m_modalWindow->GetWXWindow();
- QuitAppModalLoopForWindow(theWindow);
+ QuitAppModalLoopForWindow(m_modalNativeWindow);
}