]> git.saurik.com Git - wxWidgets.git/blobdiff - src/unix/apptraits.cpp
Disable wxUSE_ENH_METAFILE for wxGTK builds.
[wxWidgets.git] / src / unix / apptraits.cpp
index b81b55db1717af5a03a9fd3d40e03f0383134678..91e821e327c3523b4abd6faa6e5c18edd9f9a11e 100644 (file)
     #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
 
 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);
 }
 
-