]> git.saurik.com Git - wxWidgets.git/commitdiff
added wxEXEC_NODISABLE
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 19 Dec 2004 23:59:28 +0000 (23:59 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 19 Dec 2004 23:59:28 +0000 (23:59 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31081 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
docs/latex/wx/function.tex
include/wx/utils.h
src/msw/utilsexc.cpp
src/unix/utilsunx.cpp

index 04e981bdcd27eacc8b5ec1c1757fee56ac78db93..e054637af03e8f1fcc617cb9982724069eb1604b 100644 (file)
@@ -12,6 +12,7 @@ All:
 - classes in the manual are now cross-referenced (Zbigniew Zagórski)
 - Norwegian (Bokmål) translation added (Hans F. Nordhaug)
 - wxDynamicLibrary::HasSymbol() added
+- added wxEXEC_NODISABLE flag to be used with wxExecute(wxEXEC_SYNC)
 - added wxTextInputStream::operator>>(wchar_t) for compilers which support this
 - added wxURI, a class for dealing with Uniform Resource Identifiers
 - changed wxURL to inherit from wxURI and provide assignment and comparison
index 9abdc11976e4e7c7625f18a276b667ed974e67d1..bc1030da8aeede59449fccdcdc0f3772a49e3156 100644 (file)
@@ -553,9 +553,12 @@ In the case of synchronous execution, the return value is the exit code of
 the process (which terminates by the moment the function returns) and will be
 $-1$ if the process couldn't be started and typically 0 if the process
 terminated successfully. Also, while waiting for the process to
-terminate, wxExecute will call \helpref{wxYield}{wxyield}. The caller
-should ensure that this can cause no recursion, in the simplest case by
-calling \helpref{wxEnableTopLevelWindows(false)}{wxenabletoplevelwindows}.
+terminate, wxExecute will call \helpref{wxYield}{wxyield}. Because of this, by
+default this function disables all application windows to avoid unexpected
+reentrancies which could result from the users interaction with the program
+while the child process is running. If you are sure that it is safe to not
+disable the program windows, you may pass \texttt{wxEXEC\_NODISABLE} flag to
+prevent this automatic disabling from happening.
 
 For asynchronous execution, however, the return value is the process id and
 zero value indicates that the command could not be executed. As an added
index a7aba4285c40f93ed8671d8d2c4b0e5d977b9bd0..2450c08a9bcfbe45946ff3857ec7972a7ea906ac 100644 (file)
@@ -173,7 +173,12 @@ enum
 
     // under Unix, if the process is the group leader then passing wxKILL_CHILDREN to wxKill
     // kills all children as well as pid
-    wxEXEC_MAKE_GROUP_LEADER = 4
+    wxEXEC_MAKE_GROUP_LEADER = 4,
+
+    // by default synchronous execution disables all program windows to avoid
+    // that the user interacts with the program while the child process is
+    // running, you can use this flag to prevent this from happening
+    wxEXEC_NODISABLE = 8
 };
 
 // Execute another program.
index 8899b5e0f128fdff2701f2b61c49e3551e9f00fa..5ba14aad626e2a7064579b3221400dce7ed35da7 100644 (file)
@@ -888,11 +888,17 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler)
         return pi.dwProcessId;
     }
 
-    wxAppTraits *traits = wxTheApp ? wxTheApp->GetTraits() : NULL;
-    wxCHECK_MSG( traits, -1, _T("no wxAppTraits in wxExecute()?") );
+    wxAppTraits *traits = NULL;
+    void *cookie wxDUMMY_INITIALIZE(NULL);
+    if ( !(flags & wxEXEC_NODISABLE) )
+    {
+        if ( wxTheApp )
+            traits = wxTheApp->GetTraits();
+        wxCHECK_MSG( traits, -1, _T("no wxAppTraits in wxExecute()?") );
 
-    // disable all app windows while waiting for the child process to finish
-    void *cookie = traits->BeforeChildWaitLoop();
+        // disable all app windows while waiting for the child process to finish
+        cookie = traits->BeforeChildWaitLoop();
+    }
 
     // wait until the child process terminates
     while ( data->state )
@@ -910,7 +916,8 @@ long wxExecute(const wxString& cmd, int flags, wxProcess *handler)
         traits->AlwaysYield();
     }
 
-    traits->AfterChildWaitLoop(cookie);
+    if ( traits )
+        traits->AfterChildWaitLoop(cookie);
 
     DWORD dwExitCode = data->dwExitCode;
     delete data;
index 35a752946104f64a850b2823b159cd0d6b16abd4..89dd3e65a85bd018a92abbcc7594f2032baee78b 100644 (file)
@@ -1133,10 +1133,12 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData)
 {
     wxEndProcessData *endProcData = new wxEndProcessData;
 
+    const int flags = execData.flags;
+
     // wxAddProcessCallback is now (with DARWIN) allowed to call the
     // callback function directly if the process terminates before
     // the callback can be added to the run loop. Set up the endProcData.
-    if ( execData.flags & wxEXEC_SYNC )
+    if ( flags & wxEXEC_SYNC )
     {
         // we may have process for capturing the program output, but it's
         // not used in wxEndProcessData in the case of sync execution
@@ -1167,10 +1169,11 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData)
     execData.pipeEndProcDetect.Close();
 #endif // defined(__DARWIN__) && (defined(__WXMAC__) || defined(__WXCOCOA__))
 
-    if ( execData.flags & wxEXEC_SYNC )
+    if ( flags & wxEXEC_SYNC )
     {
         wxBusyCursor bc;
-        wxWindowDisabler wd;
+        wxWindowDisabler *wd = flags & wxEXEC_NODISABLE ? NULL
+                                                        : new wxWindowDisabler;
 
         // endProcData->pid will be set to 0 from GTK_EndProcessDetector when the
         // process terminates
@@ -1204,6 +1207,7 @@ int wxGUIAppTraits::WaitForChild(wxExecuteData& execData)
 
         int exitcode = endProcData->exitcode;
 
+        delete wd;
         delete endProcData;
 
         return exitcode;