]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/utilsexc.cpp
(hopefully) workaround for a carbon bug not always setting the modifiers event record...
[wxWidgets.git] / src / msw / utilsexc.cpp
index e63bb93ba0f3d2172379c6b9d0aefef4e5c9942d..21b74439c33f7289e21634a72d3428fe4a1c592e 100644 (file)
@@ -259,8 +259,10 @@ size_t wxPipeOutputStream::OnSysWrite(const void *buffer, size_t len)
 
 #ifdef __WIN32__
 
-static DWORD wxExecuteThread(wxExecuteData *data)
+static DWORD __stdcall wxExecuteThread(void *arg)
 {
+    wxExecuteData *data = (wxExecuteData*)arg;
+
     WaitForSingleObject(data->hProcess, INFINITE);
 
     // get the exit code
@@ -358,7 +360,7 @@ static bool wxExecuteDDE(const wxString& ddeServer,
 
 #endif // wxUSE_IPC
 
-long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
+long wxExecute(const wxString& cmd, int flags, wxProcess *handler)
 {
     wxCHECK_MSG( !!cmd, 0, wxT("empty command in wxExecute") );
 
@@ -437,7 +439,7 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
         // termination, try to execute DDE command right now, it can succeed if
         // the process is already running - but as it fails if it's not
         // running, suppress any errors it might generate
-        if ( !sync )
+        if ( !(flags & wxEXEC_SYNC) )
         {
             wxLogNull noErrors;
             if ( wxExecuteDDE(ddeServer, ddeTopic, ddeCommand) )
@@ -482,8 +484,9 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
         {
             wxLogSysError(_("Can't create the inter-process read pipe"));
 
-            // indicate failure in both cases
-            return sync ? -1 : 0;
+            // indicate failure: we need to return different error code
+            // depending on the sync flag
+            return flags & wxEXEC_SYNC ? -1 : 0;
         }
 
         // and a stdout one
@@ -494,7 +497,7 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
 
             wxLogSysError(_("Can't create the inter-process write pipe"));
 
-            return sync ? -1 : 0;
+            return flags & wxEXEC_SYNC ? -1 : 0;
         }
 
         (void)::CreatePipe(&hpipeStderr[0], &hpipeStderr[1], &security, 0);
@@ -511,15 +514,20 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
 #if wxUSE_STREAMS
     if ( redirect )
     {
-        // when the std IO is redirected, we don't show the (console) process
-        // window
-        si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
+        si.dwFlags = STARTF_USESTDHANDLES;
 
         si.hStdInput = hpipeStdin[0];
         si.hStdOutput = hpipeStdout[1];
         si.hStdError = hpipeStderr[1];
 
-        si.wShowWindow = SW_HIDE;
+        // when the std IO is redirected, we don't show the (console) process
+        // window by default, but this can be overridden by the caller by
+        // specifying wxEXEC_NOHIDE flag
+        if ( !(flags & wxEXEC_NOHIDE) )
+        {
+            si.dwFlags |= STARTF_USESHOWWINDOW;
+            si.wShowWindow = SW_HIDE;
+        }
 
         // we must duplicate the handle to the write side of stdin pipe to make
         // it non inheritable: indeed, we must close hpipeStdin[1] before
@@ -585,7 +593,7 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
 
         wxLogSysError(_("Execution of command '%s' failed"), command.c_str());
 
-        return sync ? -1 : 0;
+        return flags & wxEXEC_SYNC ? -1 : 0;
     }
 
 #if wxUSE_STREAMS
@@ -630,8 +638,8 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
     data->hProcess    = pi.hProcess;
     data->dwProcessId = pi.dwProcessId;
     data->hWnd        = hwnd;
-    data->state       = sync;
-    if ( sync )
+    data->state       = (flags & wxEXEC_SYNC) != 0;
+    if ( flags & wxEXEC_SYNC )
     {
         // handler may be !NULL for capturing program output, but we don't use
         // it wxExecuteData struct in this case
@@ -646,7 +654,7 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
     DWORD tid;
     HANDLE hThread = ::CreateThread(NULL,
                                     0,
-                                    (LPTHREAD_START_ROUTINE)wxExecuteThread,
+                                    wxExecuteThread,
                                     (void *)data,
                                     0,
                                     &tid);
@@ -710,7 +718,7 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
     }
 #endif // wxUSE_IPC
 
-    if ( !sync )
+    if ( !(flags & wxEXEC_SYNC) )
     {
         // clean up will be done when the process terminates
 
@@ -727,7 +735,11 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
 #endif // wxUSE_GUI
 
     while ( data->state )
+    {
+        // don't take 100% of the CPU
+        ::Sleep(500);
         wxYield();
+    }
 
 #if wxUSE_GUI
     }
@@ -740,21 +752,24 @@ long wxExecute(const wxString& cmd, bool sync, wxProcess *handler)
     return dwExitCode;
 #else // Win16
     long instanceID = WinExec((LPCSTR) WXSTRINGCAST command, SW_SHOW);
-    if (instanceID < 32) return(0);
+    if (instanceID < 32)
+        return flags & wxEXEC_SYNC ? -1 : 0;
 
-    if (sync) {
+    if ( flags & wxEXEC_SYNC )
+    {
         int running;
-        do {
+        do
+        {
             wxYield();
             running = GetModuleUsage((HINSTANCE)instanceID);
         } while (running);
     }
 
-    return(instanceID);
+    return instanceID;
 #endif // Win16/32
 }
 
-long wxExecute(char **argv, bool sync, wxProcess *handler)
+long wxExecute(char **argv, int flags, wxProcess *handler)
 {
     wxString command;
 
@@ -765,6 +780,6 @@ long wxExecute(char **argv, bool sync, wxProcess *handler)
 
     command.RemoveLast();
 
-    return wxExecute(command, sync, handler);
+    return wxExecute(command, flags, handler);
 }