mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-23 05:25:26 +00:00
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.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@34721 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
456827950b
commit
e6254e6fb2
@ -300,6 +300,9 @@ int ForkedCall::generateChild()
|
||||
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 @@ int ForkedCall::generateChild()
|
||||
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 @@ int ForkedCall::generateChild()
|
||||
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 @@ int ForkedCall::generateChild()
|
||||
<< 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 @@ void handleCompletedProcesses()
|
||||
} else {
|
||||
actCall->setRetValue(exit_code);
|
||||
}
|
||||
CloseHandle(hProcess);
|
||||
remove_it = true;
|
||||
break;
|
||||
}
|
||||
@ -578,6 +585,7 @@ void handleCompletedProcesses()
|
||||
lyxerr << "WaitForSingleObject failed waiting for child\n"
|
||||
<< getChildErrorMessage() << endl;
|
||||
actCall->setRetValue(1);
|
||||
CloseHandle(hProcess);
|
||||
remove_it = true;
|
||||
break;
|
||||
}
|
||||
|
@ -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 @@ cmd_ret const runCommand(string const & cmd)
|
||||
// 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 @@ cmd_ret const runCommand(string const & cmd)
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user