X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e2478fde622a16d25c66690af353dfdc37e7b582..095b80e2b5120d4c476a834b2017c355fa9afef0:/src/unix/utilsunx.cpp diff --git a/src/unix/utilsunx.cpp b/src/unix/utilsunx.cpp index f6d60dcf32..bf7dc8d178 100644 --- a/src/unix/utilsunx.cpp +++ b/src/unix/utilsunx.cpp @@ -15,12 +15,16 @@ // headers // ---------------------------------------------------------------------------- +// for compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + #include "wx/defs.h" #include "wx/string.h" #include "wx/intl.h" #include "wx/log.h" #include "wx/app.h" +#include "wx/apptrait.h" #include "wx/utils.h" #include "wx/process.h" @@ -30,11 +34,20 @@ #include "wx/unix/execute.h" -#ifdef __WXBASE__ +#if wxUSE_STREAMS + +// define this to let wxexec.cpp know that we know what we're doing +#define _WX_USED_BY_WXEXECUTE_ +#include "../common/execcmn.cpp" + +#endif // wxUSE_STREAMS + +#if wxUSE_BASE #if defined( __MWERKS__ ) && defined(__MACH__) #define WXWIN_OS_DESCRIPTION "MacOS X" #define HAVE_NANOSLEEP +#define HAVE_UNAME #endif // not only the statfs syscall is called differently depending on platform, but @@ -346,22 +359,6 @@ bool wxShutdown(wxShutdownFlags wFlags) #if wxUSE_STREAMS -// ---------------------------------------------------------------------------- -// wxPipeInputStream: stream for reading from a pipe -// ---------------------------------------------------------------------------- - -class wxPipeInputStream : public wxFileInputStream -{ -public: - wxPipeInputStream(int fd) : wxFileInputStream(fd) { } - - // return TRUE if the pipe is still opened - bool IsOpened() const { return !Eof(); } - - // return TRUE if we have anything to read, don't block - virtual bool CanRead() const; -}; - bool wxPipeInputStream::CanRead() const { if ( m_lasterror == wxSTREAM_EOF ) @@ -398,10 +395,6 @@ bool wxPipeInputStream::CanRead() const } } -// define this to let wxexec.cpp know that we know what we're doing -#define _WX_USED_BY_WXEXECUTE_ -#include "../common/execcmn.cpp" - #endif // wxUSE_STREAMS // ---------------------------------------------------------------------------- @@ -515,7 +508,9 @@ long wxExecute(wxChar **argv, // start an xterm executing it. if ( !(flags & wxEXEC_SYNC) ) { - for ( int fd = 0; fd < FD_SETSIZE; fd++ ) + // FD_SETSIZE is unsigned under BSD, signed under other platforms + // so we need a cast to avoid warnings on all platforms + for ( int fd = 0; fd < (int)FD_SETSIZE; fd++ ) { if ( fd == pipeIn[wxPipe::Read] || fd == pipeOut[wxPipe::Write] @@ -585,6 +580,9 @@ long wxExecute(wxChar **argv, { ARGS_CLEANUP; + // save it for WaitForChild() use + execData.pid = pid; + // prepare for IO redirection #if wxUSE_STREAMS @@ -828,17 +826,6 @@ wxString wxGetOsDescription() #endif // !__WXMAC__ -int wxGetOsVersion(int *verMaj, int *verMin) -{ - // we want this function to work even if there is no wxApp - wxConsoleAppTraits traitsConsole; - wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL; - if ( ! traits ) - traits = &traitsConsole; - - return traits->GetOSVersion(verMaj, verMin); -} - unsigned long wxGetProcessId() { return (unsigned long)getpid(); @@ -941,7 +928,7 @@ bool wxSetEnv(const wxString& variable, const wxChar *value) s << _T('=') << value; // transform to ANSI - const char *p = s.mb_str(); + const wxWX2MBbuf p = s.mb_str(); // the string will be free()d by libc char *buf = (char *)malloc(strlen(p) + 1); @@ -949,7 +936,7 @@ bool wxSetEnv(const wxString& variable, const wxChar *value) return putenv(buf) == 0; #else // no way to set an env var - return FALSE; + return false; #endif } @@ -1060,7 +1047,7 @@ void wxFatalError( const wxString &msg, const wxString &title ) #endif // WXWIN_COMPATIBILITY_2_2 -#endif // __WXBASE__ +#endif // wxUSE_BASE #if wxUSE_GUI @@ -1079,7 +1066,7 @@ bool wxGUIAppTraits::CreateEndProcessPipe(wxExecuteData& execData) bool wxGUIAppTraits::IsWriteFDOfEndProcessPipe(wxExecuteData& execData, int fd) { - return fd == execData.pipeEndProcDetect[wxPipe::Write] + return fd == (execData.pipeEndProcDetect)[wxPipe::Write]; } void wxGUIAppTraits::DetachWriteFDOfEndProcessPipe(wxExecuteData& execData) @@ -1157,14 +1144,27 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData) // process terminates while ( endProcData->pid != 0 ) { + bool idle = true; + #if wxUSE_STREAMS if ( execData.bufOut ) + { execData.bufOut->Update(); + idle = false; + } if ( execData.bufErr ) + { execData.bufErr->Update(); + idle = false; + } #endif // wxUSE_STREAMS + // don't consume 100% of the CPU while we're sitting this in this + // loop + if ( idle ) + wxUsleep(1); + // give GTK+ a chance to call GTK_EndProcessDetector here and // also repaint the GUI wxYield(); @@ -1182,6 +1182,9 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData) } } +#endif // wxUSE_GUI +#if wxUSE_BASE + void wxHandleProcessTermination(wxEndProcessData *proc_data) { // notify user about termination if required @@ -1202,5 +1205,4 @@ void wxHandleProcessTermination(wxEndProcessData *proc_data) } } -#endif // wxUSE_GUI - +#endif // wxUSE_BASE