X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2FSystemcall.cpp;h=5dd4a94e1681e206b4ca4a5f7cdcf0c81a5769c8;hb=aef8746712ccc64f1f10073fe6d011ff1d7eb4a4;hp=0ab7685b5cf4ff2e324e909b36b2ea2a414fcebe;hpb=5225821242887ff552b7370df9c830af5f17d3b3;p=lyx.git diff --git a/src/support/Systemcall.cpp b/src/support/Systemcall.cpp index 0ab7685b5c..5dd4a94e16 100644 --- a/src/support/Systemcall.cpp +++ b/src/support/Systemcall.cpp @@ -71,14 +71,14 @@ public: void warning(QString const &, QString const &) {} void toggleWarning(QString const &, QString const &, QString const &) {} - void error(QString const &, QString const &) {} + void error(QString const &, QString const &, QString const &) {} void information(QString const &, QString const &) {} int prompt(docstring const &, docstring const &, int default_but, int, docstring const &, docstring const &) { return default_but; } }; -static ProgressInterface* progress_instance = 0; +static ProgressInterface * progress_instance = 0; void ProgressInterface::setInstance(ProgressInterface* p) { @@ -86,7 +86,7 @@ void ProgressInterface::setInstance(ProgressInterface* p) } -ProgressInterface* ProgressInterface::instance() +ProgressInterface * ProgressInterface::instance() { if (!progress_instance) { static ProgressDummy dummy; @@ -101,15 +101,12 @@ ProgressInterface* ProgressInterface::instance() // Reuse of instance #ifndef USE_QPROCESS int Systemcall::startscript(Starttype how, string const & what, - std::string const & path, bool /*process_events*/) + string const & path, string const & lpath, + bool /*process_events*/) { - string const python_call = "python -tt"; - string command = to_filesystem8bit(from_utf8(latexEnvCmdPrefix(path))); - - if (prefixIs(what, python_call)) - command += os::python() + what.substr(python_call.length()); - else - command += what; + string command = + to_filesystem8bit(from_utf8(latexEnvCmdPrefix(path, lpath))) + + commandPrep(what); if (how == DontWait) { switch (os::shell()) { @@ -238,29 +235,48 @@ string const parsecmd(string const & incmd, string & infile, string & outfile, int Systemcall::startscript(Starttype how, string const & what, - string const & path, bool process_events) + string const & path, string const & lpath, + bool process_events) { - LYXERR(Debug::INFO,"Running: " << what); + string const what_ss = commandPrep(what); + LYXERR(Debug::INFO,"Running: " << what_ss); string infile; string outfile; string errfile; QString const cmd = QString::fromLocal8Bit( - parsecmd(what, infile, outfile, errfile).c_str()); + parsecmd(what_ss, infile, outfile, errfile).c_str()); SystemcallPrivate d(infile, outfile, errfile); - - d.startProcess(cmd, path, how == DontWait); - if (how == DontWait && d.state == SystemcallPrivate::Running) { +#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; + if (d.state == SystemcallPrivate::Error || !d.waitWhile(SystemcallPrivate::Starting, process_events, -1)) { LYXERR0("Systemcall: '" << cmd << "' did not start!"); LYXERR0("error " << d.errorMessage()); return 10; } +#endif if (!d.waitWhile(SystemcallPrivate::Running, process_events, os::timeout_min() * 60 * 1000)) { @@ -279,16 +295,10 @@ int Systemcall::startscript(Starttype how, string const & what, } -SystemcallPrivate::SystemcallPrivate(std::string const & sf, - std::string const & of, - std::string const & ef) : - process_(new QProcess), - out_index_(0), - err_index_(0), - in_file_(sf), - out_file_(of), - err_file_(ef), - process_events_(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), + in_file_(sf), out_file_(of), err_file_(ef), process_events_(false) { if (!in_file_.empty()) process_->setStandardInputFile(QString::fromLocal8Bit(in_file_.c_str())); @@ -341,18 +351,23 @@ SystemcallPrivate::SystemcallPrivate(std::string const & sf, connect(process_, SIGNAL(readyReadStandardOutput()), SLOT(stdOut())); connect(process_, SIGNAL(readyReadStandardError()), SLOT(stdErr())); +#if QT_VERSION >= 0x050600 + connect(process_, SIGNAL(errorOccurred(QProcess::ProcessError)), SLOT(processError(QProcess::ProcessError))); +#else connect(process_, SIGNAL(error(QProcess::ProcessError)), SLOT(processError(QProcess::ProcessError))); +#endif connect(process_, SIGNAL(started()), this, SLOT(processStarted())); connect(process_, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(processFinished(int, QProcess::ExitStatus))); } -void SystemcallPrivate::startProcess(QString const & cmd, string const & path, bool detached) +void SystemcallPrivate::startProcess(QString const & cmd, string const & path, + string const & lpath, bool detached) { cmd_ = cmd; if (detached) { state = SystemcallPrivate::Running; - if (!QProcess::startDetached(toqstr(latexEnvCmdPrefix(path)) + cmd_)) { + if (!QProcess::startDetached(toqstr(latexEnvCmdPrefix(path, lpath)) + cmd_)) { state = SystemcallPrivate::Error; return; } @@ -360,7 +375,7 @@ void SystemcallPrivate::startProcess(QString const & cmd, string const & path, b delete released; } else if (process_) { state = SystemcallPrivate::Starting; - process_->start(toqstr(latexEnvCmdPrefix(path)) + cmd_); + process_->start(toqstr(latexEnvCmdPrefix(path, lpath)) + cmd_); } } @@ -564,7 +579,7 @@ QString SystemcallPrivate::errorMessage() const break; case QProcess::UnknownError: default: - message = "An unknown error occured."; + message = "An unknown error occurred."; break; } return message; @@ -594,7 +609,9 @@ QString SystemcallPrivate::exitStatusMessage() const int SystemcallPrivate::exitCode() { - if (!process_) + // From Qt's documentation, in regards to QProcess::exitCode(), + // "This value is not valid unless exitStatus() returns NormalExit" + if (!process_ || process_->exitStatus() != QProcess::NormalExit) return -1; return process_->exitCode();