X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5e1febfacedfb966daaf4050c293e0833593df82..6e7b6cc6f79fdcacfda3cc4e498a6d6f77b75c4d:/src/common/utilscmn.cpp diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index c9e9207ebb..b8841a57b0 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -952,7 +952,7 @@ int isascii( int c ) #endif // __MWERKS__ // ---------------------------------------------------------------------------- -// misc functions +// wxSafeYield and supporting functions // ---------------------------------------------------------------------------- void wxEnableTopLevelWindows(bool enable) @@ -962,65 +962,63 @@ void wxEnableTopLevelWindows(bool enable) node->GetData()->Enable(enable); } -static void wxFindDisabledWindows(wxWindowList& winDisabled, wxWindow *win) -{ - wxWindowList::Node *node; - for ( node = win->GetChildren().GetFirst(); node; node = node->GetNext() ) - { - wxWindow *child = node->GetData(); - wxFindDisabledWindows(winDisabled, child); - - if ( child->IsEnabled() ) - { - winDisabled.Append(child); - child->Disable(); - } - } -} - wxWindowDisabler::wxWindowDisabler(wxWindow *winToSkip) { - // remember all windows we're going to (temporarily) disable - m_winDisabled = new wxWindowList; - #ifdef __WXMSW__ +#ifdef __WIN32__ // and the top level window too HWND hwndFG = ::GetForegroundWindow(); m_winTop = hwndFG ? wxFindWinFromHandle((WXHWND)hwndFG) : (wxWindow *)NULL; +#else + HWND hwndFG = ::GetTopWindow(); + m_winTop = hwndFG ? wxFindWinFromHandle((WXHWND)hwndFG) : (wxWindow *)NULL; +#endif #endif // MSW + // remember the top level windows which were already disabled, so that we + // don't reenable them later + m_winDisabled = NULL; + wxWindowList::Node *node; for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) { wxWindow *winTop = node->GetData(); + if ( winTop == winToSkip ) + continue; + if ( winTop->IsEnabled() ) { - wxFindDisabledWindows(*m_winDisabled, winTop); - - m_winDisabled->Append(winTop); winTop->Disable(); } - } + else + { + if ( !m_winDisabled ) + { + m_winDisabled = new wxWindowList; + } - if ( winToSkip && m_winDisabled->Find(winToSkip) ) - { - // always enable ourselves - m_winDisabled->DeleteObject(winToSkip); - winToSkip->Enable(); + m_winDisabled->Append(winTop); + } } } wxWindowDisabler::~wxWindowDisabler() { wxWindowList::Node *node; - for ( node = m_winDisabled->GetFirst(); node; node = node->GetNext() ) + for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) { - node->GetData()->Enable(); + wxWindow *winTop = node->GetData(); + if ( !m_winDisabled || !m_winDisabled->Find(winTop) ) + { + winTop->Enable(); + } + //else: had been already disabled, don't reenable } delete m_winDisabled; #ifdef __WXMSW__ +#ifdef __WIN32__ if ( m_winTop ) { if ( !::SetForegroundWindow(GetHwndOf(m_winTop)) ) @@ -1028,6 +1026,18 @@ wxWindowDisabler::~wxWindowDisabler() wxLogLastError("SetForegroundWindow"); } } +#else + if ( m_winTop ) + { + // 16-bit SetForegroundWindow() replacement + RECT reWin; + GetWindowRect(m_winTop, &reWin); + SetWindowPos (m_winTop, HWND_TOP, + reWin.left, reWin.top, + reWin.right - reWin.left, reWin.bottom, + SWP_SHOWWINDOW); + } +#endif #endif // MSW } @@ -1042,6 +1052,10 @@ bool wxSafeYield(wxWindow *win) return rc; } +// ---------------------------------------------------------------------------- +// misc functions +// ---------------------------------------------------------------------------- + // Don't synthesize KeyUp events holding down a key and producing KeyDown // events with autorepeat. On by default and always on in wxMSW. wxGTK version // in utilsgtk.cpp.