X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2FSystemcall.cpp;h=6ec50e1238b305d4346aa1fc45e0eb76aea37d6a;hb=7b0f9d95248820bc70b820dd6b558de4a6713bae;hp=fe8c23fb23cfb5cdfd1f786f0cc02211ae2af38d;hpb=61b1a20185498e92593b17a8bb38034dea7925fc;p=lyx.git diff --git a/src/support/Systemcall.cpp b/src/support/Systemcall.cpp index fe8c23fb23..6ec50e1238 100644 --- a/src/support/Systemcall.cpp +++ b/src/support/Systemcall.cpp @@ -23,16 +23,13 @@ #include "support/os.h" #include "support/ProgressInterface.h" -#include "frontends/Application.h" - #include "LyX.h" -#include "LyXRC.h" #include #include #include -#include +#include #include #include #include @@ -81,7 +78,7 @@ public: }; -static ProgressInterface * progress_instance = 0; +static ProgressInterface * progress_instance = nullptr; void ProgressInterface::setInstance(ProgressInterface* p) { @@ -208,7 +205,7 @@ string const parsecmd(string const & incmd, string & infile, string & outfile, in_double_quote = !in_double_quote; } } else if (c == '\\' && !escaped) { - escaped = !escaped; + escaped = true; } else if (c == '>' && !(in_double_quote || escaped)) { if (suffixIs(outcmd[o], " 2")) { outcmd[o] = rtrim(outcmd[o], "2"); @@ -236,6 +233,12 @@ string const parsecmd(string const & incmd, string & infile, string & outfile, } // namespace +void Systemcall::killscript() +{ + SystemcallPrivate::kill_script = true; +} + + int Systemcall::startscript(Starttype how, string const & what, string const & path, string const & lpath, bool process_events) @@ -255,28 +258,6 @@ int Systemcall::startscript(Starttype how, string const & what, SystemcallPrivate d(infile, outfile, errfile); bool do_events = process_events || how == WaitLoop; -#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, do_events, -1)) { - if (d.state == SystemcallPrivate::Error) { - LYXERR0("Systemcall: '" << cmd << "' did not start!"); - LYXERR0("error " << d.errorMessage()); - return NOSTART; - } else if (d.state == SystemcallPrivate::Killed) { - LYXERR0("Killed: " << cmd); - return KILLED; - } - } - if (how == DontWait) { - d.releaseProcess(); - return OK; - } -#else d.startProcess(cmd, path, lpath, how == DontWait); if (how == DontWait && d.state == SystemcallPrivate::Running) return OK; @@ -292,7 +273,6 @@ int Systemcall::startscript(Starttype how, string const & what, return KILLED; } } -#endif if (!d.waitWhile(SystemcallPrivate::Running, do_events, os::timeout_min() * 60 * 1000)) { @@ -315,6 +295,9 @@ int Systemcall::startscript(Starttype how, string const & what, } +bool SystemcallPrivate::kill_script = false; + + SystemcallPrivate::SystemcallPrivate(std::string const & sf, std::string const & of, std::string const & ef) : state(Error), process_(new QProcess), out_index_(0), err_index_(0), @@ -387,6 +370,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; @@ -403,11 +395,11 @@ void SystemcallPrivate::startProcess(QString const & cmd, string const & path, bool SystemcallPrivate::waitAndCheck() { Sleep::millisec(100); - if (theApp() && theApp()->cancel_export) { + if (kill_script) { // is there a better place to reset this? process_->kill(); state = Killed; - theApp()->cancel_export = false; + kill_script = false; LYXERR0("Export Canceled!!"); return false; } @@ -448,7 +440,7 @@ bool SystemcallPrivate::waitWhile(State waitwhile, bool process_events, int time while (!timedout) { if (process_->waitForFinished(timeout)) return true; - bool stop = queryStopCommand(cmd_); + bool const stop = queryStopCommand(cmd_); // The command may have finished in the meantime if (process_->state() == QProcess::NotRunning) return true; @@ -475,7 +467,7 @@ bool SystemcallPrivate::waitWhile(State waitwhile, bool process_events, int time } // process events while waiting with timeout - QTime timer; + QElapsedTimer timer; timer.start(); while (state == waitwhile && state != Error && !timedout) { // check for cancellation of background process @@ -483,7 +475,7 @@ bool SystemcallPrivate::waitWhile(State waitwhile, bool process_events, int time return false; if (timer.elapsed() > timeout) { - bool stop = queryStopCommand(cmd_); + bool const stop = queryStopCommand(cmd_); // The command may have finished in the meantime if (process_->state() == QProcess::NotRunning) break; @@ -647,7 +639,7 @@ int SystemcallPrivate::exitCode() QProcess* SystemcallPrivate::releaseProcess() { QProcess* released = process_; - process_ = 0; + process_ = nullptr; return released; }