X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/91b4c08d6f5ceb50e1fab3d9b6477dd8c0d54a20..236a9de39afa090fdee3cf91cb5364ceca69e3f8:/src/common/utilscmn.cpp?ds=sidebyside diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index 5a685ccc75..b8841a57b0 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -48,6 +48,9 @@ #endif // wxUSE_GUI #endif // WX_PRECOMP +#include "wx/process.h" +#include "wx/txtstrm.h" + #include #include #include @@ -75,7 +78,7 @@ #endif #ifdef __WXMSW__ - #include "windows.h" + #include "wx/msw/private.h" #endif // ---------------------------------------------------------------------------- @@ -949,35 +952,117 @@ int isascii( int c ) #endif // __MWERKS__ // ---------------------------------------------------------------------------- -// misc functions +// wxSafeYield and supporting functions // ---------------------------------------------------------------------------- void wxEnableTopLevelWindows(bool enable) { - wxWindowList::Node *node; - for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) - node->GetData()->Enable(enable); + wxWindowList::Node *node; + for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() ) + node->GetData()->Enable(enable); +} + +wxWindowDisabler::wxWindowDisabler(wxWindow *winToSkip) +{ +#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() ) + { + winTop->Disable(); + } + else + { + if ( !m_winDisabled ) + { + m_winDisabled = new wxWindowList; + } + + m_winDisabled->Append(winTop); + } + } } -// Yield to other apps/messages and disable user input +wxWindowDisabler::~wxWindowDisabler() +{ + wxWindowList::Node *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; + +#ifdef __WXMSW__ +#ifdef __WIN32__ + if ( m_winTop ) + { + if ( !::SetForegroundWindow(GetHwndOf(m_winTop)) ) + { + 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 +} + +// Yield to other apps/messages and disable user input to all windows except +// the given one bool wxSafeYield(wxWindow *win) { - wxEnableTopLevelWindows(FALSE); - // always enable ourselves - if ( win ) - win->Enable(TRUE); - bool rc = wxYield(); - wxEnableTopLevelWindows(TRUE); - return rc; + wxWindowDisabler wd; + + bool rc = wxYield(); + + 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. #ifndef __WXGTK__ bool wxSetDetectableAutoRepeat( bool WXUNUSED(flag) ) { - return TRUE; // detectable auto-repeat is the only mode MSW supports + return TRUE; // detectable auto-repeat is the only mode MSW supports } #endif // !wxGTK @@ -1117,3 +1202,31 @@ wxString wxGetCurrentDir() } #endif // 0 + +// ---------------------------------------------------------------------------- +// wxExecute +// ---------------------------------------------------------------------------- + +long wxExecute(const wxString& command, wxArrayString& output) +{ + // create a wxProcess which will capture the output + wxProcess *process = new wxProcess; + process->Redirect(); + + long rc = wxExecute(command, TRUE /* sync */, process); + if ( rc != -1 ) + { + wxInputStream& is = *process->GetInputStream(); + wxTextInputStream tis(is); + while ( !is.Eof() && is.IsOk() ) + { + wxString line = tis.ReadLine(); + if ( is.LastError() ) + break; + + output.Add(line); + } + } + + return rc; +}