X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2415cf6725d5cfb11f52d29e5d28dfdaa197b366..5063450e489683e9ce90951614d64dbfffc9ae61:/src/unix/utilsunx.cpp diff --git a/src/unix/utilsunx.cpp b/src/unix/utilsunx.cpp index 6a7fcd27be..bba1eb7be5 100644 --- a/src/unix/utilsunx.cpp +++ b/src/unix/utilsunx.cpp @@ -132,6 +132,10 @@ #include // for SAGET and MINFO structures #endif +#ifdef HAVE_SETPRIORITY + #include // for setpriority() +#endif + // ---------------------------------------------------------------------------- // conditional compilation // ---------------------------------------------------------------------------- @@ -545,6 +549,21 @@ long wxExecute(char **argv, int flags, wxProcess *process, } } + // priority: we need to map wxWidgets priority which is in the range 0..100 + // to Unix nice value which is in the range -20..19. As there is an odd + // number of elements in our range and an even number in the Unix one, we + // have to do it in this rather ugly way to guarantee that: + // 1. wxPRIORITY_{MIN,DEFAULT,MAX} map to -20, 0 and 19 respectively. + // 2. The mapping is monotonously increasing. + // 3. The mapping is onto the target range. + int prio = process ? process->GetPriority() : 0; + if ( prio <= 50 ) + prio = (2*prio)/5 - 20; + else if ( prio < 55 ) + prio = 1; + else + prio = (2*prio)/5 - 21; + // fork the process // // NB: do *not* use vfork() here, it completely breaks this code for some @@ -578,6 +597,13 @@ long wxExecute(char **argv, int flags, wxProcess *process, } #endif // !__VMS +#if defined(HAVE_SETPRIORITY) + if ( prio && setpriority(PRIO_PROCESS, 0, prio) != 0 ) + { + wxLogSysError(_("Failed to set process priority")); + } +#endif // HAVE_SETPRIORITY + // redirect stdin, stdout and stderr if ( pipeIn.IsOk() ) { @@ -818,11 +844,16 @@ wxString wxGetUserHome( const wxString &user ) // the trailing newline static wxString wxGetCommandOutput(const wxString &cmd) { - FILE *f = popen(cmd.ToAscii(), "r"); + // Suppress stderr from the shell to avoid outputting errors if the command + // doesn't exist. + FILE *f = popen((cmd + " 2>/dev/null").ToAscii(), "r"); if ( !f ) { - wxLogSysError(wxT("Executing \"%s\" failed"), cmd.c_str()); - return wxEmptyString; + // Notice that this doesn't happen simply if the command doesn't exist, + // but only in case of some really catastrophic failure inside popen() + // so we should really notify the user about this as this is not normal. + wxLogSysError(wxT("Executing \"%s\" failed"), cmd); + return wxString(); } wxString s; @@ -992,7 +1023,7 @@ wxLinuxDistributionInfo wxGetLinuxDistributionInfo() #endif // these functions are in src/osx/utilsexc_base.cpp for wxMac -#ifndef __WXMAC__ +#ifndef __DARWIN__ wxOperatingSystemId wxGetOsVersion(int *verMaj, int *verMin) { @@ -1028,7 +1059,7 @@ wxString wxGetOsDescription() return wxGetCommandOutput(wxT("uname -s -r -m")); } -#endif // !__WXMAC__ +#endif // !__DARWIN__ unsigned long wxGetProcessId() {