diff --git a/include/wx/utils.h b/include/wx/utils.h index ea3042e38b..a6c9f061ce 100644 --- a/include/wx/utils.h +++ b/include/wx/utils.h @@ -731,7 +731,10 @@ private: void DoDisable(wxWindow *winToSkip = NULL); #if defined(__WXOSX__) && wxOSX_USE_COCOA - wxEventLoop* m_modalEventLoop; + void AfterDisable(wxWindow* winToSkip); + void BeforeEnable(); + + wxEventLoop* m_modalEventLoop = NULL; #endif wxVector m_winDisabled; bool m_disabled; diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index 2963212555..eedb02ff49 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -1507,12 +1507,6 @@ void wxEnableTopLevelWindows(bool enable) node->GetData()->Enable(enable); } -#if defined(__WXOSX__) && wxOSX_USE_COCOA - -// defined in evtloop.mm - -#else - wxWindowDisabler::wxWindowDisabler(bool disable) { m_disabled = disable; @@ -1547,6 +1541,10 @@ void wxWindowDisabler::DoDisable(wxWindow *winToSkip) m_winDisabled.push_back(winTop); } } + +#if defined(__WXOSX__) && wxOSX_USE_COCOA + AfterDisable(winToSkip); +#endif } wxWindowDisabler::~wxWindowDisabler() @@ -1554,6 +1552,10 @@ wxWindowDisabler::~wxWindowDisabler() if ( !m_disabled ) return; +#if defined(__WXOSX__) && wxOSX_USE_COCOA + BeforeEnable(); +#endif + wxWindowList::compatibility_iterator node; for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) { @@ -1566,8 +1568,6 @@ wxWindowDisabler::~wxWindowDisabler() } } -#endif - // Yield to other apps/messages and disable user input to all windows except // the given one bool wxSafeYield(wxWindow *win, bool onlyIfNeeded) diff --git a/src/osx/cocoa/evtloop.mm b/src/osx/cocoa/evtloop.mm index f99d09661d..dfe7e5f381 100644 --- a/src/osx/cocoa/evtloop.mm +++ b/src/osx/cocoa/evtloop.mm @@ -558,72 +558,15 @@ void wxGUIEventLoop::EndModalSession() // // -wxWindowDisabler::wxWindowDisabler(bool disable) +void wxWindowDisabler::AfterDisable(wxWindow* winToSkip) { - m_modalEventLoop = NULL; - m_disabled = disable; - if ( disable ) - DoDisable(); -} - -wxWindowDisabler::wxWindowDisabler(wxWindow *winToSkip) -{ - m_disabled = true; - DoDisable(winToSkip); -} - -void wxWindowDisabler::DoDisable(wxWindow *winToSkip) -{ - // remember the top level windows which were already disabled, so that we - // don't reenable them later - m_winDisabled = NULL; - - wxWindowList::compatibility_iterator node; - for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) - { - wxWindow *winTop = node->GetData(); - if ( winTop == winToSkip ) - continue; - - // we don't need to disable the hidden or already disabled windows - if ( winTop->IsEnabled() && winTop->IsShown() ) - { - winTop->Disable(); - } - else - { - if ( !m_winDisabled ) - { - m_winDisabled = new wxWindowList; - } - - m_winDisabled->Append(winTop); - } - } - m_modalEventLoop = (wxEventLoop*)wxEventLoopBase::GetActive(); if (m_modalEventLoop) m_modalEventLoop->BeginModalSession(winToSkip); } -wxWindowDisabler::~wxWindowDisabler() +void wxWindowDisabler::BeforeEnable() { - if ( !m_disabled ) - return; - if (m_modalEventLoop) m_modalEventLoop->EndModalSession(); - - wxWindowList::compatibility_iterator node; - for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) - { - wxWindow *winTop = node->GetData(); - if ( !m_winDisabled || !m_winDisabled->Find(winTop) ) - { - winTop->Enable(); - } - //else: had been already disabled, don't reenable - } - - delete m_winDisabled; }