X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fgraphics%2FPreviewLoader.cpp;h=ac14fbb6a904591e9b8a0182bef5b230eb7ae3e6;hb=19b840ae23a888300f9a5c03971351b546cce93d;hp=914d7d00d13b9ba7220871b906f33f194a0b21b0;hpb=211ac35314d661127c407635af880bcf1679ddba;p=lyx.git diff --git a/src/graphics/PreviewLoader.cpp b/src/graphics/PreviewLoader.cpp index 914d7d00d1..ac14fbb6a9 100644 --- a/src/graphics/PreviewLoader.cpp +++ b/src/graphics/PreviewLoader.cpp @@ -25,6 +25,7 @@ #include "output.h" #include "OutputParams.h" #include "TexRow.h" +#include "texstream.h" #include "frontends/Application.h" // hexName @@ -37,12 +38,14 @@ #include "support/ForkedCalls.h" #include "support/lstrings.h" -#include "support/bind.h" #include "support/TempFile.h" -#include +#include #include #include +#include +#include +#include #include @@ -70,35 +73,6 @@ FileName const unique_tex_filename(FileName const & bufferpath) } -lyx::Converter const * setConverter(string const & from) -{ - typedef vector FmtList; - typedef lyx::graphics::Cache GCache; - FmtList const & loadableFormats = GCache::get().loadableFormats(); - FmtList::const_iterator it = loadableFormats.begin(); - FmtList::const_iterator const end = loadableFormats.end(); - - for (; it != end; ++it) { - string const to = *it; - if (from == to) - continue; - - lyx::Converter const * ptr = lyx::theConverters().getConverter(from, to); - if (ptr) - return ptr; - } - - // FIXME THREAD - static bool first = true; - if (first) { - first = false; - LYXERR0("PreviewLoader::startLoading()\n" - << "No converter from \"" << from << "\" format has been defined."); - } - return 0; -} - - void setAscentFractions(vector & ascent_fractions, FileName const & metrics_file) { @@ -186,14 +160,13 @@ typedef map InProgressProcesses; typedef InProgressProcesses::value_type InProgressProcess; -} // namespace anon - +} // namespace namespace lyx { namespace graphics { -class PreviewLoader::Impl : public boost::signals::trackable { +class PreviewLoader::Impl { public: /// Impl(PreviewLoader & p, Buffer const & b); @@ -214,10 +187,12 @@ public: void refreshPreviews(); /// Emit this signal when an image is ready for display. - boost::signal imageReady; + signals2::signal imageReady; Buffer const & buffer() const { return buffer_; } + lyx::Converter const * setConverter(string const & from); + private: /// Called by the ForkedCall process that generated the bitmap files. void finishedGenerating(pid_t, int); @@ -229,7 +204,7 @@ private: /** cache_ allows easy retrieval of already-generated images * using the LaTeX snippet as the identifier. */ - typedef shared_ptr PreviewImagePtr; + typedef std::shared_ptr PreviewImagePtr; /// typedef map Cache; /// @@ -263,6 +238,8 @@ private: /// We don't own this static lyx::Converter const * pconverter_; + + Trackable trackable_; }; @@ -320,7 +297,7 @@ void PreviewLoader::refreshPreviews() } -boost::signals::connection PreviewLoader::connect(slot_type const & slot) const +signals2::connection PreviewLoader::connect(slot const & slot) const { return pimpl_->imageReady.connect(slot); } @@ -401,7 +378,7 @@ void InProgress::stop() const } } -} // namespace anon +} // namespace namespace lyx { @@ -428,6 +405,35 @@ PreviewLoader::Impl::Impl(PreviewLoader & p, Buffer const & b) } +lyx::Converter const * PreviewLoader::Impl::setConverter(string const & from) +{ + typedef vector FmtList; + FmtList const & loadableFormats = graphics::Cache::get().loadableFormats(); + FmtList::const_iterator it = loadableFormats.begin(); + FmtList::const_iterator const end = loadableFormats.end(); + + for (; it != end; ++it) { + string const to = *it; + if (from == to) + continue; + + lyx::Converter const * ptr = lyx::theConverters().getConverter(from, to); + if (ptr) + return ptr; + } + + // Show the error only once. This is thread-safe. + static nullptr_t no_conv = [&]{ + LYXERR0("PreviewLoader::startLoading()\n" + << "No converter from \"" << from + << "\" format has been defined."); + return nullptr; + } (); + + return no_conv; +} + + PreviewLoader::Impl::~Impl() { delete delay_refresh_; @@ -500,7 +506,7 @@ private: string const snippet_; }; -} // namespace anon +} // namespace PreviewLoader::Status PreviewLoader::Impl::status(string const & latex_snippet) const @@ -562,7 +568,7 @@ private: string const & snippet_; }; -} // namespace anon +} // namespace void PreviewLoader::Impl::remove(string const & latex_snippet) @@ -624,8 +630,7 @@ void PreviewLoader::Impl::startLoading(bool wait) return; } - TexRow texrow; - otexstream os(of, texrow); + otexstream os(of); OutputParams runparams(&enc); LaTeXFeatures features(buffer_, buffer_.params(), runparams); @@ -639,6 +644,11 @@ void PreviewLoader::Impl::startLoading(bool wait) } of << "\\batchmode\n"; + // Set \jobname of previews to the document name (see bug 9627) + of << "\\def\\jobname{" + << from_utf8(changeExtension(buffer_.latexName(true), "")) + << "}\n"; + LYXERR(Debug::LATEX, "Format = " << buffer_.params().getDefaultOutputFormat()); string latexparam = ""; bool docformat = !buffer_.params().default_output_format.empty() @@ -698,22 +708,17 @@ void PreviewLoader::Impl::startLoading(bool wait) << " " << quoteName(latexfile.toFilesystemEncoding()) << " --dpi " << font_scaling_factor_; - // FIXME XHTML + // FIXME XHTML // The colors should be customizable. if (!buffer_.isExporting()) { ColorCode const fg = PreviewLoader::foregroundColor(); ColorCode const bg = PreviewLoader::backgroundColor(); - cs << " --fg " << theApp()->hexName(fg) + cs << " --fg " << theApp()->hexName(fg) << " --bg " << theApp()->hexName(bg); } cs << latexparam; - if (buffer_.params().bibtex_command != "default") - cs << " --bibtex=" << quoteName(buffer_.params().bibtex_command); - else if (buffer_.params().encoding().package() == Encoding::japanese) - cs << " --bibtex=" << quoteName(lyxrc.jbibtex_command); - else - cs << " --bibtex=" << quoteName(lyxrc.bibtex_command); + cs << " --bibtex=" << quoteName(buffer_.params().bibtexCommand()); if (buffer_.params().bufferFormat() == "lilypond-book") cs << " --lilypond"; @@ -722,8 +727,7 @@ void PreviewLoader::Impl::startLoading(bool wait) if (wait) { ForkedCall call(buffer_.filePath(), buffer_.layoutPos()); int ret = call.startScript(ForkedProcess::Wait, command); - // FIXME THREAD - static int fake = (2^20) + 1; + static atomic_int fake((2^20) + 1); int pid = fake++; inprogress.pid = pid; inprogress.command = command; @@ -733,9 +737,10 @@ void PreviewLoader::Impl::startLoading(bool wait) } // Initiate the conversion from LaTeX to bitmap images files. - ForkedCall::SignalTypePtr - convert_ptr(new ForkedCall::SignalType); - convert_ptr->connect(bind(&Impl::finishedGenerating, this, _1, _2)); + ForkedCall::sigPtr convert_ptr = make_shared(); + convert_ptr->connect(ForkedProcess::slot([this](pid_t pid, int retval){ + finishedGenerating(pid, retval); + }).track_foreign(trackable_.p())); ForkedCall call(buffer_.filePath()); int ret = call.startScript(command, convert_ptr);