commit 804ed1bffb3ad13904a8e8838d63c7adc6e542e7 Author: Enrico Forestieri <for...@lyx.org> Date: Thu Sep 27 21:32:24 2018 +0200
Fix bug #11210 On Windows, start viewers in detached processes in order to avoid a crash of the QProcess destructor when their thread terminates. The opening of a console window is avoided by redirecting to the null device all standard I/O channels. --- src/support/Systemcall.cpp | 27 +++++++++------------------ status.23x | 2 ++ 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/support/Systemcall.cpp b/src/support/Systemcall.cpp index 2dbbba7..d4f71ff 100644 --- a/src/support/Systemcall.cpp +++ b/src/support/Systemcall.cpp @@ -252,23 +252,6 @@ int Systemcall::startscript(Starttype how, string const & what, SystemcallPrivate d(infile, outfile, errfile); -#ifdef Q_OS_WIN32 - // QProcess::startDetached cannot provide environment variables. When the - // environment variables are set using the latexEnvCmdPrefix and the process - // is started with QProcess::startDetached, a console window is shown every - // time a viewer is started. To avoid this, we fall back on Windows to the - // original implementation that creates a QProcess object. - d.startProcess(cmd, path, lpath, false); - if (!d.waitWhile(SystemcallPrivate::Starting, process_events, -1)) { - LYXERR0("Systemcall: '" << cmd << "' did not start!"); - LYXERR0("error " << d.errorMessage()); - return 10; - } - if (how == DontWait) { - d.releaseProcess(); - return 0; - } -#else d.startProcess(cmd, path, lpath, how == DontWait); if (how == DontWait && d.state == SystemcallPrivate::Running) return 0; @@ -279,7 +262,6 @@ int Systemcall::startscript(Starttype how, string const & what, LYXERR0("error " << d.errorMessage()); return 10; } -#endif if (!d.waitWhile(SystemcallPrivate::Running, process_events, os::timeout_min() * 60 * 1000)) { @@ -370,6 +352,15 @@ void SystemcallPrivate::startProcess(QString const & cmd, string const & path, cmd_ = cmd; if (detached) { state = SystemcallPrivate::Running; +#ifdef Q_OS_WIN32 + // Avoid opening a console window when a viewer is started + if (in_file_.empty()) + process_->setStandardInputFile(QProcess::nullDevice()); + if (out_file_.empty()) + process_->setStandardOutputFile(QProcess::nullDevice()); + if (err_file_.empty()) + process_->setStandardErrorFile(QProcess::nullDevice()); +#endif if (!QProcess::startDetached(toqstr(latexEnvCmdPrefix(path, lpath)) + cmd_)) { state = SystemcallPrivate::Error; return; diff --git a/status.23x b/status.23x index 8ff974a..9e67c10 100644 --- a/status.23x +++ b/status.23x @@ -113,6 +113,8 @@ What's new - Avoid crash when cursor is outside of work area (bug 11296). +- Fix crash on Windows when closing external viewers (bug 11210). + * USER INTERFACE