X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/eacb6b56a63316a310f33dcc4e14ba3e5bc55c63..ad653fa23069c5d9378247084f03c9a718c3ad62:/src/unix/apptraits.cpp?ds=sidebyside diff --git a/src/unix/apptraits.cpp b/src/unix/apptraits.cpp index b81b55db17..91e821e327 100644 --- a/src/unix/apptraits.cpp +++ b/src/unix/apptraits.cpp @@ -23,11 +23,14 @@ #pragma hdrstop #endif +#include "wx/apptrait.h" + #ifndef WX_PRECOMP + #include "wx/utils.h" #endif // WX_PRECOMP -#include "wx/apptrait.h" #include "wx/unix/execute.h" +#include "wx/evtloop.h" // ============================================================================ // implementation @@ -35,55 +38,15 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData) { - const int flags = execData.flags; - if ( !(flags & wxEXEC_SYNC) || (flags & wxEXEC_NOEVENTS) ) - { - // async or blocking sync cases are already handled by the base class - // just fine, no need to duplicate its code here - return wxAppTraits::WaitForChild(execData); - } - - // here we're dealing with the case of synchronous execution when we want - // to process the GUI events while waiting for the child termination - - wxEndProcessData endProcData; - - // we may have process for capturing the program output, but it's - // not used in wxEndProcessData in the case of sync execution - endProcData.process = NULL; - - // sync execution: indicate it by negating the pid - endProcData.pid = -execData.pid; - - endProcData.tag = AddProcessCallback - ( - &endProcData, - execData.pipeEndProcDetect.Detach(wxPipe::Read) - ); - - execData.pipeEndProcDetect.Close(); - - // prepare to wait for the child termination: show to the user that we're // busy and refuse all input unless explicitly told otherwise wxBusyCursor bc; - wxWindowDisabler wd(!(flags & wxEXEC_NODISABLE)); + wxWindowDisabler wd(!(execData.flags & wxEXEC_NODISABLE)); - // endProcData.pid will be set to 0 from wxHandleProcessTermination() when - // the process terminates - while ( endProcData.pid != 0 ) - { - // don't consume 100% of the CPU while we're sitting in this - // loop - if ( !CheckForRedirectedIO(execData) ) - wxMilliSleep(1); - - // give the toolkit a chance to call wxHandleProcessTermination() here - // and also repaint the GUI and handle other accumulated events - wxYield(); - } - - return endProcData.exitcode; + // Allocate an event loop that will be used to wait for the process + // to terminate, will handle stdout, stderr, and any other events and pass + // it to the common (to console and GUI) code which will run it. + wxGUIEventLoop loop; + return RunLoopUntilChildExit(execData, loop); } -