From cfb0ef701eb4d8043b91822931ca0e6e3af5fddc Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Thu, 8 Apr 2010 09:46:36 +0000 Subject: [PATCH] allowing direct native tlw modal loops git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63912 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/osx/evtloop.h | 4 +++- src/osx/carbon/evtloop.cpp | 41 +++++++++++++++++++++++++------------- src/osx/cocoa/evtloop.mm | 19 ++++++++++++++---- src/osx/iphone/evtloop.mm | 17 ++++++++++++++-- 4 files changed, 60 insertions(+), 21 deletions(-) diff --git a/include/wx/osx/evtloop.h b/include/wx/osx/evtloop.h index b86cfeecf3..45b411e903 100644 --- a/include/wx/osx/evtloop.h +++ b/include/wx/osx/evtloop.h @@ -98,7 +98,8 @@ class WXDLLIMPEXP_FWD_CORE wxNonOwnedWindow; class WXDLLIMPEXP_CORE wxModalEventLoop : public wxGUIEventLoop { public: - wxModalEventLoop(wxWindow *winModal); + wxModalEventLoop(wxWindow *modalWindow); + wxModalEventLoop(WXWindow modalNativeWindow); protected: virtual void DoRun(); @@ -107,6 +108,7 @@ protected: // (in case) the modal window for this event loop wxNonOwnedWindow* m_modalWindow; + WXWindow m_modalNativeWindow; }; #endif // wxUSE_GUI diff --git a/src/osx/carbon/evtloop.cpp b/src/osx/carbon/evtloop.cpp index 68695943bb..4ca136ca90 100644 --- a/src/osx/carbon/evtloop.cpp +++ b/src/osx/carbon/evtloop.cpp @@ -94,37 +94,51 @@ void wxGUIEventLoop::DoStop() QuitApplicationEventLoop(); } -wxModalEventLoop::wxModalEventLoop(wxWindow *winModal) +// TODO move into a evtloop_osx.cpp + +wxModalEventLoop::wxModalEventLoop(wxWindow *modalWindow) { - m_modalWindow = dynamic_cast (winModal); + m_modalWindow = dynamic_cast (modalWindow); 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::DoRun() { 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 ) { @@ -136,8 +150,7 @@ void wxModalEventLoop::DoRun() void wxModalEventLoop::DoStop() { wxMacAutoreleasePool autoreleasepool; - WindowRef theWindow = m_modalWindow->GetWXWindow(); - QuitAppModalLoopForWindow(theWindow); + QuitAppModalLoopForWindow(m_modalNativeWindow); } diff --git a/src/osx/cocoa/evtloop.mm b/src/osx/cocoa/evtloop.mm index cfa7486f84..bcd24e8405 100644 --- a/src/osx/cocoa/evtloop.mm +++ b/src/osx/cocoa/evtloop.mm @@ -175,12 +175,24 @@ void wxGUIEventLoop::DoStop() [NSApp stop:0]; } -wxModalEventLoop::wxModalEventLoop(wxWindow *winModal) +// TODO move into a evtloop_osx.cpp + +wxModalEventLoop::wxModalEventLoop(wxWindow *modalWindow) { - m_modalWindow = dynamic_cast (winModal); + m_modalWindow = dynamic_cast (modalWindow); 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::DoRun() { wxMacAutoreleasePool pool; @@ -197,8 +209,7 @@ void wxModalEventLoop::DoRun() } } - NSWindow* theWindow = m_modalWindow->GetWXWindow(); - [NSApp runModalForWindow:theWindow]; + [NSApp runModalForWindow:m_modalNativeWindow]; } void wxModalEventLoop::DoStop() diff --git a/src/osx/iphone/evtloop.mm b/src/osx/iphone/evtloop.mm index 41b8235296..e050cdd0ce 100644 --- a/src/osx/iphone/evtloop.mm +++ b/src/osx/iphone/evtloop.mm @@ -97,12 +97,25 @@ void wxGUIEventLoop::DoRun() } } -wxModalEventLoop::wxModalEventLoop(wxWindow *winModal) +// TODO move into a evtloop_osx.cpp + +wxModalEventLoop::wxModalEventLoop(wxWindow *modalWindow) { - m_modalWindow = dynamic_cast (winModal); + m_modalWindow = dynamic_cast (modalWindow); 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::DoRun() { // presentModalViewController:animated: -- 2.45.2