[prev in list] [next in list] [prev in thread] [next in thread] 

List:       lyx-cvs
Subject:    r34721 - lyx-devel/trunk/src/support
From:       joost () lyx ! org
Date:       2010-06-28 17:45:05
Message-ID: 20100628174505.63CAF3087B () lyx ! lyx ! org
[Download RAW message or body]

Author: joost
Date: Mon Jun 28 19:45:04 2010
New Revision: 34721
URL: http://www.lyx.org/trac/changeset/34721

Log:
Launch external Windows processes for e.g. display image conversion using \
CreateProcess with a CREATE_NO_WINDOW flag, allowing LyX to be compiled as a GUI \
application without console windows popping up.

Modified:
   lyx-devel/trunk/src/support/ForkedCalls.cpp
   lyx-devel/trunk/src/support/filetools.cpp

Modified: lyx-devel/trunk/src/support/ForkedCalls.cpp
==============================================================================
--- lyx-devel/trunk/src/support/ForkedCalls.cpp	Mon Jun 28 19:23:48 2010	(r34720)
+++ lyx-devel/trunk/src/support/ForkedCalls.cpp	Mon Jun 28 19:45:04 2010	(r34721)
@@ -300,6 +300,9 @@
 	if (line.empty())
 		return 1;
 
+#if !defined (_WIN32)
+	// POSIX
+
 	// Split the input command up into an array of words stored
 	// in a contiguous block of memory. The array contains pointers
 	// to each word.
@@ -326,23 +329,11 @@
 			if (c == ' ')
 				*it = '\0';
 			else if (c == '\'' || c == '"') {
-#if defined (_WIN32)
-				// How perverse!
-				// spawnvp *requires* the quotes or it will
-				// split the arg at the internal whitespace!
-				// Make shure the quote is a DOS-style one.
-				*it = '"';
-#else
 				*it = '\0';
-#endif
 				inside_quote = c;
 			}
 		} else if (c == inside_quote) {
-#if defined (_WIN32)
-			*it = '"';
-#else
 			*it = '\0';
-#endif
 			inside_quote = 0;
 		}
 	}
@@ -370,9 +361,6 @@
 		lyxerr << "</command>" << endl;
 	}
 
-#ifdef _WIN32
-	pid_t const cpid = spawnvp(_P_NOWAIT, argv[0], &*argv.begin());
-#else // POSIX
 	pid_t const cpid = ::fork();
 	if (cpid == 0) {
 		// Child
@@ -383,6 +371,24 @@
 		       << strerror(errno) << endl;
 		_exit(1);
 	}
+#else
+	// Windows
+
+	pid_t cpid = -1;
+
+	STARTUPINFO startup; 
+	PROCESS_INFORMATION process; 
+
+	memset(&startup, 0, sizeof(STARTUPINFO));
+	memset(&process, 0, sizeof(PROCESS_INFORMATION));
+    
+	startup.cb = sizeof(STARTUPINFO);
+
+	if (CreateProcess(0, (LPSTR)line.c_str(), 0, 0, FALSE,
+		CREATE_NO_WINDOW, 0, 0, &startup, &process)) {
+		CloseHandle(process.hThread);
+		cpid = (pid_t)process.hProcess;
+	}
 #endif
 
 	if (cpid < 0) {
@@ -571,6 +577,7 @@
 			} else {
 				actCall->setRetValue(exit_code);
 			}
+			CloseHandle(hProcess);
 			remove_it = true;
 			break;
 		}
@@ -578,6 +585,7 @@
 			lyxerr << "WaitForSingleObject failed waiting for child\n"
 			       << getChildErrorMessage() << endl;
 			actCall->setRetValue(1);
+			CloseHandle(hProcess);
 			remove_it = true;
 			break;
 		}

Modified: lyx-devel/trunk/src/support/filetools.cpp
==============================================================================
--- lyx-devel/trunk/src/support/filetools.cpp	Mon Jun 28 19:23:48 2010	(r34720)
+++ lyx-devel/trunk/src/support/filetools.cpp	Mon Jun 28 19:45:04 2010	(r34721)
@@ -39,6 +39,7 @@
 #include <boost/regex.hpp>
 
 #include <fcntl.h>
+#include <io.h>
 
 #include <cerrno>
 #include <cstdlib>
@@ -48,6 +49,10 @@
 #include <fstream>
 #include <sstream>
 
+#if defined (_WIN32)
+#include <windows.h>
+#endif
+
 using namespace std;
 
 #define USE_QPROCESS
@@ -766,7 +771,39 @@
 	// pstream (process stream), with the
 	// variants ipstream, opstream
 
-#if defined (HAVE_POPEN)
+#if defined (_WIN32)
+	int fno; 
+	STARTUPINFO startup; 
+	PROCESS_INFORMATION process; 
+	SECURITY_ATTRIBUTES security; 
+	HANDLE in, out;
+	FILE * inf = 0;
+    
+	security.nLength = sizeof(SECURITY_ATTRIBUTES); 
+	security.bInheritHandle = TRUE; 
+	security.lpSecurityDescriptor = NULL; 
+
+	if (CreatePipe(&in, &out, &security, 0)) { 
+		memset(&startup, 0, sizeof(STARTUPINFO));
+		memset(&process, 0, sizeof(PROCESS_INFORMATION));
+    
+		startup.cb = sizeof(STARTUPINFO);
+		startup.dwFlags = STARTF_USESTDHANDLES;
+  
+		startup.hStdError = GetStdHandle(STD_ERROR_HANDLE);
+		startup.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
+		startup.hStdOutput = out;
+
+		if (CreateProcess(0, (LPTSTR)cmd.c_str(), &security, &security,
+			TRUE, CREATE_NO_WINDOW, 0, 0, &startup, &process)) {
+
+			CloseHandle(process.hThread);
+			fno = _open_osfhandle((long)in, _O_RDONLY);
+			CloseHandle(out);
+			inf = _fdopen(fno, "r");
+		}
+	}
+#elif defined (HAVE_POPEN)
 	FILE * inf = ::popen(cmd.c_str(), os::popen_read_mode());
 #elif defined (HAVE__POPEN)
 	FILE * inf = ::_popen(cmd.c_str(), os::popen_read_mode());
@@ -787,7 +824,11 @@
 		c = fgetc(inf);
 	}
 
-#if defined (HAVE_PCLOSE)
+#if defined (_WIN32)
+	WaitForSingleObject(process.hProcess, INFINITE);
+	CloseHandle(process.hProcess);
+	int const pret = fclose(inf);
+#elif defined (HAVE_PCLOSE)
 	int const pret = pclose(inf);
 #elif defined (HAVE__PCLOSE)
 	int const pret = _pclose(inf);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic