X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBuffer.cpp;h=b646cf6619982519c34ed52c32bc455f61b34445;hb=86994bf75320524ec656fd70950633c83d445a6c;hp=010843e9ec1ae55112c95a30d907f6a6f7450d61;hpb=1d5204315e8c4cfed564854c1ff4de1d46ec4917;p=lyx.git diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 010843e9ec..b646cf6619 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -24,6 +24,7 @@ #include "Chktex.h" #include "Converter.h" #include "Counters.h" +#include "Cursor.h" #include "DispatchResult.h" #include "DocIterator.h" #include "Encoding.h" @@ -98,7 +99,7 @@ #include "support/lyxalgo.h" #include "support/os.h" #include "support/Package.h" -#include "support/Path.h" +#include "support/PathChanger.h" #include "support/Systemcall.h" #include "support/textutils.h" #include "support/types.h" @@ -112,7 +113,6 @@ #include #include #include -#include #include using namespace std; @@ -195,6 +195,9 @@ public: /// is this an unnamed file (New...)? bool unnamed; + /// is this an internal bufffer? + bool internal_buffer; + /// buffer is r/o bool read_only; @@ -207,6 +210,9 @@ public: */ bool file_fully_loaded; + /// Ignore the parent (e.g. when exporting a child standalone)? + bool ignore_parent; + /// mutable TocBackend toc_backend; @@ -276,7 +282,12 @@ public: /// This is here to force the test to be done whenever parent_buffer /// is accessed. - Buffer const * parent() const { + Buffer const * parent() const + { + // ignore_parent temporarily "orphans" a buffer + // (e.g. if a child is compiled standalone) + if (ignore_parent) + return 0; // if parent_buffer is not loaded, then it has been unloaded, // which means that parent_buffer is an invalid pointer. So we // set it to null in that case. @@ -289,7 +300,8 @@ public: } /// - void setParent(Buffer const * pb) { + void setParent(Buffer const * pb) + { if (parent_buffer == pb) // nothing to do return; @@ -314,10 +326,14 @@ public: /// \p from initial position /// \p to points to the end position void updateStatistics(DocIterator & from, DocIterator & to, - bool skipNoOutput = true); + bool skipNoOutput = true); /// statistics accessor functions - int wordCount() const { return word_count_; } - int charCount(bool with_blanks) const { + int wordCount() const + { + return word_count_; + } + int charCount(bool with_blanks) const + { return char_count_ + (with_blanks ? blank_count_ : 0); } @@ -355,11 +371,12 @@ static FileName createBufferTmpDir() Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_, Buffer const * cloned_buffer) : owner_(owner), lyx_clean(true), bak_clean(true), unnamed(false), - read_only(readonly_), filename(file), file_fully_loaded(false), - toc_backend(owner), macro_lock(false), timestamp_(0), checksum_(0), - wa_(0), gui_(0), undo_(*owner), bibinfo_cache_valid_(false), - bibfile_cache_valid_(false), cite_labels_valid_(false), - preview_loader_(0), cloned_buffer_(cloned_buffer), clone_list_(0), + internal_buffer(false), read_only(readonly_), filename(file), + file_fully_loaded(false), ignore_parent(false), toc_backend(owner), + macro_lock(false), timestamp_(0), checksum_(0), wa_(0), gui_(0), + undo_(*owner), bibinfo_cache_valid_(false), bibfile_cache_valid_(false), + cite_labels_valid_(false), preview_loader_(0), + cloned_buffer_(cloned_buffer), clone_list_(0), doing_export(false), parent_buffer(0) { if (!cloned_buffer_) { @@ -379,6 +396,7 @@ Buffer::Impl::Impl(Buffer * owner, FileName const & file, bool readonly_, bibfile_status_ = cloned_buffer_->d->bibfile_status_; cite_labels_valid_ = cloned_buffer_->d->cite_labels_valid_; unnamed = cloned_buffer_->d->unnamed; + internal_buffer = cloned_buffer_->d->internal_buffer; } @@ -481,7 +499,7 @@ Buffer::~Buffer() Buffer * Buffer::cloneFromMaster() const { BufferMap bufmap; - cloned_buffers.push_back(new CloneList()); + cloned_buffers.push_back(new CloneList); CloneList * clones = cloned_buffers.back(); masterBuffer()->cloneWithChildren(bufmap, clones); @@ -537,7 +555,7 @@ void Buffer::cloneWithChildren(BufferMap & bufmap, CloneList * clones) const Buffer * Buffer::cloneBufferOnly() const { - cloned_buffers.push_back(new CloneList()); + cloned_buffers.push_back(new CloneList); CloneList * clones = cloned_buffers.back(); Buffer * buffer_clone = new Buffer(fileName().absFileName(), false, this); clones->insert(buffer_clone); @@ -743,7 +761,10 @@ void Buffer::setReadonly(bool const flag) void Buffer::setFileName(FileName const & fname) { + bool const changed = fname != d->filename; d->filename = fname; + if (changed) + lyxvc().file_found_hook(fname); setReadonly(d->filename.isReadOnly()); saveCheckSum(); updateTitles(); @@ -789,6 +810,7 @@ int Buffer::readHeader(Lexer & lex) params().html_latex_end.clear(); params().html_math_img_scale = 1.0; params().output_sync_macro.erase(); + params().local_layout.clear(); for (int i = 0; i < 4; ++i) { params().user_defined_bullet(i) = ITEMIZE_DEFAULTS[i]; @@ -1384,7 +1406,7 @@ bool Buffer::makeLaTeXFile(FileName const & fname, ofdocstream ofs; try { ofs.reset(encoding); } - catch (iconv_codecvt_facet_exception & e) { + catch (iconv_codecvt_facet_exception const & e) { lyxerr << "Caught iconv exception: " << e.what() << endl; Alert::error(_("Iconv software exception Detected"), bformat(_("Please " "verify that the support software for your encoding (%1$s) is " @@ -1411,7 +1433,7 @@ bool Buffer::makeLaTeXFile(FileName const & fname, os.texrow().reset(); writeLaTeXSource(os, original_path, runparams, output); } - catch (EncodingException & e) { + catch (EncodingException const & e) { odocstringstream ods; ods.put(e.failed_char); ostringstream oss; @@ -1425,7 +1447,7 @@ bool Buffer::makeLaTeXFile(FileName const & fname, e.par_id, e.pos, e.pos + 1)); failed_export = true; } - catch (iconv_codecvt_facet_exception & e) { + catch (iconv_codecvt_facet_exception const & e) { errorList.push_back(ErrorItem(_("iconv conversion failed"), _(e.what()), -1, 0, 0)); failed_export = true; @@ -1454,12 +1476,19 @@ bool Buffer::makeLaTeXFile(FileName const & fname, void Buffer::writeLaTeXSource(otexstream & os, string const & original_path, OutputParams const & runparams_in, - OutputWhat output) const + OutputWhat output) const { // The child documents, if any, shall be already loaded at this point. OutputParams runparams = runparams_in; + // If we are compiling a file standalone, even if this is the + // child of some other buffer, let's cut the link here, so the + // file is really independent and no concurring settings from + // the master (e.g. branch state) interfere (see #8100). + if (!runparams.is_child) + d->ignore_parent = true; + // Classify the unicode characters appearing in math insets Encodings::initUnicodeMath(*this); @@ -1467,12 +1496,13 @@ void Buffer::writeLaTeXSource(otexstream & os, LYXERR(Debug::LATEX, " Validating buffer..."); LaTeXFeatures features(*this, params(), runparams); validate(features); + runparams.use_polyglossia = features.usePolyglossia(); LYXERR(Debug::LATEX, " Buffer validation done."); bool const output_preamble = output == FullSource || output == OnlyPreamble; bool const output_body = - output == FullSource || output == OnlyBody; + output == FullSource || output == OnlyBody; // The starting paragraph of the coming rows is the // first paragraph of the document. (Asger) @@ -1508,9 +1538,8 @@ void Buffer::writeLaTeXSource(otexstream & os, Encoding const * const enc = runparams.encoding; if (enc) { for (size_t n = 0; n < inputpath.size(); ++n) { - docstring const glyph = - docstring(1, inputpath[n]); - if (enc->latexChar(inputpath[n], true) != glyph) { + if (!enc->encodable(inputpath[n])) { + docstring const glyph(1, inputpath[n]); LYXERR0("Uncodable character '" << glyph << "' in input path!"); @@ -1565,15 +1594,18 @@ void Buffer::writeLaTeXSource(otexstream & os, MacroSet parentMacros; listParentMacros(parentMacros, features); - runparams.use_polyglossia = features.usePolyglossia(); // Write the preamble runparams.use_babel = params().writeLaTeX(os, features, d->filename.onlyPath()); runparams.use_japanese = features.isRequired("japanese"); - if (!output_body) + if (!output_body) { + // Restore the parenthood if needed + if (!runparams.is_child) + d->ignore_parent = false; return; + } // make the body. os << "\\begin{document}\n"; @@ -1592,21 +1624,12 @@ void Buffer::writeLaTeXSource(otexstream & os, LYXERR(Debug::INFO, "preamble finished, now the body."); - // if we are doing a real file with body, even if this is the - // child of some other buffer, let's cut the link here. - // This happens for example if only a child document is printed. - Buffer const * save_parent = 0; - if (output_preamble) { - save_parent = d->parent(); - d->setParent(0); - } - // the real stuff latexParagraphs(*this, text(), os, runparams); // Restore the parenthood if needed - if (output_preamble) - d->setParent(save_parent); + if (!runparams.is_child) + d->ignore_parent = false; // add this just in case after all the paragraphs os << endl; @@ -1769,11 +1792,11 @@ void Buffer::writeLyXHTMLSource(odocstream & os, bool const output_preamble = output == FullSource || output == OnlyPreamble; bool const output_body = - output == FullSource || output == OnlyBody; + output == FullSource || output == OnlyBody || output == IncludedFile; if (output_preamble) { os << "\n" - << "\n" + << "\n" // FIXME Language should be set properly. << "\n" << "\n" @@ -1852,11 +1875,14 @@ void Buffer::writeLyXHTMLSource(odocstream & os, } if (output_body) { - os << "\n"; + bool const output_body_tag = (output != IncludedFile); + if (output_body_tag) + os << "\n"; XHTMLStream xs(os); params().documentClass().counters().reset(); xhtmlParagraphs(text(), *this, xs, runparams); - os << "\n"; + if (output_body_tag) + os << "\n"; } if (output_preamble) @@ -1908,7 +1934,11 @@ int Buffer::runChktex() void Buffer::validate(LaTeXFeatures & features) const { - params().validate(features); + // Validate the buffer params, but not for included + // files, since they also use the parent buffer's + // params (# 5941) + if (!features.runparams().is_child) + params().validate(features); for_each(paragraphs().begin(), paragraphs().end(), bind(&Paragraph::validate, _1, ref(features))); @@ -2091,6 +2121,13 @@ void Buffer::addBibTeXInfo(docstring const & key, BibTeXInfo const & bi) const } +void Buffer::makeCitationLabels() const +{ + Buffer const * const master = masterBuffer(); + return d->bibinfo_.makeCitationLabels(*master); +} + + bool Buffer::citeLabelsValid() const { return masterBuffer()->d->cite_labels_valid_; @@ -2223,8 +2260,11 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) switch (func.action()) { case LFUN_BUFFER_TOGGLE_READ_ONLY: - if (lyxvc().inUse()) - lyxvc().toggleReadOnly(); + if (lyxvc().inUse()) { + string log = lyxvc().toggleReadOnly(); + if (!log.empty()) + dr.setMessage(log); + } else setReadonly(!isReadonly()); break; @@ -2345,7 +2385,7 @@ void Buffer::dispatch(FuncRequest const & func, DispatchResult & dr) if (it->lyxCode() == BRANCH_CODE) { InsetBranch & ins = static_cast(*it); if (ins.branch() == oldname) { - undo().recordUndo(it); + undo().recordUndo(CursorData(it)); ins.rename(newname); success = true; continue; @@ -2665,7 +2705,13 @@ bool Buffer::isUnnamed() const /// retrieving fileName() nor for checking if it is unnamed or not. bool Buffer::isInternal() const { - return fileName().extension() == "internal"; + return d->internal_buffer; +} + + +void Buffer::setInternal(bool flag) +{ + d->internal_buffer = flag; } @@ -2699,7 +2745,11 @@ string Buffer::absFileName() const string Buffer::filePath() const { - return d->filename.onlyPath().absFileName() + "/"; + int last = d->filename.onlyPath().absFileName().length() - 1; + + return d->filename.onlyPath().absFileName()[last] == '/' + ? d->filename.onlyPath().absFileName() + : d->filename.onlyPath().absFileName() + "/"; } @@ -2861,7 +2911,7 @@ MacroData const * Buffer::Impl::getBufferMacro(docstring const & name, // try previous macro if there is one if (it == nameIt->second.begin()) break; - it--; + --it; } } } @@ -3275,7 +3325,7 @@ void Buffer::changeRefsIfUnique(docstring const & from, docstring const & to, void Buffer::getSourceCode(odocstream & os, string const format, pit_type par_begin, pit_type par_end, - OutputWhat output) const + OutputWhat output, bool master) const { OutputParams runparams(¶ms().encoding()); runparams.nice = true; @@ -3298,14 +3348,14 @@ void Buffer::getSourceCode(odocstream & os, string const format, convert(par_end - 1)) << "\n\n"; } - TexRow texrow; - texrow.reset(); - texrow.newline(); - texrow.newline(); // output paragraphs - if (params().isDocBook()) - docbookParagraphs(text(), *this, os, runparams); - else if (runparams.flavor == OutputParams::HTML) { + if (runparams.flavor == OutputParams::LYX) { + Paragraph const & par = text().paragraphs()[par_begin]; + ostringstream ods; + depth_type dt = par.getDepth(); + par.write(ods, params(), dt); + os << from_utf8(ods.str()); + } else if (runparams.flavor == OutputParams::HTML) { XHTMLStream xs(os); setMathFlavor(runparams); xhtmlParagraphs(text(), *this, xs, runparams); @@ -3315,10 +3365,34 @@ void Buffer::getSourceCode(odocstream & os, string const format, // Probably should have some routine with a signature like them. writePlaintextParagraph(*this, text().paragraphs()[par_begin], os, runparams, dummy); + } else if (params().isDocBook()) { + docbookParagraphs(text(), *this, os, runparams); } else { + // If we are previewing a paragraph, even if this is the + // child of some other buffer, let's cut the link here, + // so that no concurring settings from the master + // (e.g. branch state) interfere (see #8101). + if (!master) + d->ignore_parent = true; + // We need to validate the Buffer params' features here + // in order to know if we should output polyglossia + // macros (instead of babel macros) + LaTeXFeatures features(*this, params(), runparams); + params().validate(features); + runparams.use_polyglossia = features.usePolyglossia(); + TexRow texrow; + texrow.reset(); + texrow.newline(); + texrow.newline(); // latex or literate otexstream ots(os, texrow); + + // the real stuff latexParagraphs(*this, text(), ots, runparams); + + // Restore the parenthood + if (!master) + d->ignore_parent = false; } } else { os << "% "; @@ -3329,16 +3403,32 @@ void Buffer::getSourceCode(odocstream & os, string const format, else if (output == OnlyBody) os << _("Preview body"); os << "\n\n"; - d->texrow.reset(); - d->texrow.newline(); - d->texrow.newline(); - if (params().isDocBook()) - writeDocBookSource(os, absFileName(), runparams, output); - else if (runparams.flavor == OutputParams::HTML) + if (runparams.flavor == OutputParams::LYX) { + ostringstream ods; + if (output == FullSource) + write(ods); + else if (output == OnlyPreamble) + params().writeFile(ods); + else if (output == OnlyBody) + text().write(ods); + os << from_utf8(ods.str()); + } else if (runparams.flavor == OutputParams::HTML) { writeLyXHTMLSource(os, runparams, output); - else { + } else if (runparams.flavor == OutputParams::TEXT) { + if (output == OnlyPreamble) { + os << "% "<< _("Plain text does not have a preamble."); + } else + writePlaintextFile(*this, os, runparams); + } else if (params().isDocBook()) { + writeDocBookSource(os, absFileName(), runparams, output); + } else { // latex or literate + d->texrow.reset(); + d->texrow.newline(); + d->texrow.newline(); otexstream ots(os, d->texrow); + if (master) + runparams.is_child = true; writeLaTeXSource(ots, string(), runparams, output); } } @@ -3548,26 +3638,19 @@ bool Buffer::autoSave() const buf->d->bak_clean = true; FileName const fname = getAutosaveFileName(); - if (d->cloned_buffer_) { - // If this buffer is cloned, we assume that - // we are running in a separate thread already. - FileName const tmp_ret = FileName::tempName("lyxauto"); - if (!tmp_ret.empty()) { - writeFile(tmp_ret); - // assume successful write of tmp_ret - if (tmp_ret.moveTo(fname)) - return true; - } - // failed to write/rename tmp_ret so try writing direct - return writeFile(fname); - } else { - /// This function is deprecated as the frontend needs to take care - /// of cloning the buffer and autosaving it in another thread. It - /// is still here to allow (QT_VERSION < 0x040400). - AutoSaveBuffer autosave(*this, fname); - autosave.start(); - return true; + LASSERT(d->cloned_buffer_, return false); + + // If this buffer is cloned, we assume that + // we are running in a separate thread already. + FileName const tmp_ret = FileName::tempName("lyxauto"); + if (!tmp_ret.empty()) { + writeFile(tmp_ret); + // assume successful write of tmp_ret + if (tmp_ret.moveTo(fname)) + return true; } + // failed to write/rename tmp_ret so try writing direct + return writeFile(fname); } @@ -3673,6 +3756,7 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir runparams.includeall = includeall; vector backs = params().backends(); Converters converters = theConverters(); + bool need_nice_file = false; if (find(backs.begin(), backs.end(), format) == backs.end()) { // Get shortest path to format converters.buildGraph(); @@ -3695,7 +3779,14 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir } return ExportNoPathToFormat; } - runparams.flavor = converters.getFlavor(path); + runparams.flavor = converters.getFlavor(path, this); + Graph::EdgePath::const_iterator it = path.begin(); + Graph::EdgePath::const_iterator en = path.end(); + for (; it != en; ++it) + if (theConverters().get(*it).nice) { + need_nice_file = true; + break; + } } else { backend_format = format; @@ -3735,7 +3826,7 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir makeDocBookFile(FileName(filename), runparams); } // LaTeX backend - else if (backend_format == format) { + else if (backend_format == format || need_nice_file) { runparams.nice = true; bool const success = makeLaTeXFile(FileName(filename), string(), runparams); if (d->cloned_buffer_) @@ -3749,7 +3840,8 @@ Buffer::ExportStatus Buffer::doExport(string const & target, bool put_in_tempdir return ExportTexPathHasSpaces; } else { runparams.nice = false; - bool const success = makeLaTeXFile(FileName(filename), string(), runparams); + bool const success = makeLaTeXFile( + FileName(filename), filePath(), runparams); if (d->cloned_buffer_) d->cloned_buffer_->d->errorLists["Export"] = d->errorLists["Export"]; if (!success) @@ -3942,6 +4034,7 @@ Buffer::ReadStatus Buffer::loadEmergency() "file."), from_utf8(d->filename.absFileName()))); } markDirty(); + lyxvc().file_found_hook(d->filename); str = _("Document was successfully recovered."); } else str = _("Document was NOT successfully recovered."); @@ -4005,6 +4098,7 @@ Buffer::ReadStatus Buffer::loadAutosave() from_utf8(d->filename.absFileName()))); } markDirty(); + lyxvc().file_found_hook(d->filename); return ReadSuccess; } return ReadAutosaveFailure; @@ -4162,7 +4256,7 @@ void Buffer::updateBuffer(UpdateScope scope, UpdateType utype) const d->bibinfo_cache_valid_ = true; d->cite_labels_valid_ = true; - cbuf.tocBackend().update(); + cbuf.tocBackend().update(true); if (scope == UpdateMaster) cbuf.structureChanged(); } @@ -4247,9 +4341,11 @@ void Buffer::Impl::setLabel(ParIterator & it, UpdateType utype) const Counters & counters = textclass.counters(); if (par.params().startOfAppendix()) { - // FIXME: only the counter corresponding to toplevel - // sectioning should be reset - counters.reset(); + // We want to reset the counter corresponding to toplevel sectioning + Layout const & lay = textclass.getTOCLayout(); + docstring const cnt = lay.counter; + if (!cnt.empty()) + counters.reset(cnt); counters.appendix(true); } par.params().appendix(counters.appendix()); @@ -4268,17 +4364,6 @@ void Buffer::Impl::setLabel(ParIterator & it, UpdateType utype) const } switch(layout.labeltype) { - case LABEL_COUNTER: - if (layout.toclevel <= bp.secnumdepth - && (layout.latextype != LATEX_ENVIRONMENT - || it.text()->isFirstInSequence(it.pit()))) { - if (counters.hasCounter(layout.counter)) - counters.step(layout.counter, utype); - par.params().labelString(par.expandLabel(layout, bp)); - } else - par.params().labelString(docstring()); - break; - case LABEL_ITEMIZE: { // At some point of time we should do something more // clever here, like: @@ -4358,13 +4443,27 @@ void Buffer::Impl::setLabel(ParIterator & it, UpdateType utype) const par.params().labelString(docstring()); break; + case LABEL_ABOVE: + case LABEL_CENTERED: + case LABEL_STATIC: { + docstring const & lcounter = layout.counter; + if (!lcounter.empty()) { + if (layout.toclevel <= bp.secnumdepth + && (layout.latextype != LATEX_ENVIRONMENT + || it.text()->isFirstInSequence(it.pit()))) { + if (counters.hasCounter(lcounter)) + counters.step(lcounter, utype); + par.params().labelString(par.expandLabel(layout, bp)); + } else + par.params().labelString(docstring()); + } else + par.params().labelString(par.expandLabel(layout, bp)); + break; + } + case LABEL_MANUAL: - case LABEL_TOP_ENVIRONMENT: - case LABEL_CENTERED_TOP_ENVIRONMENT: - case LABEL_STATIC: case LABEL_BIBLIO: par.params().labelString(par.expandLabel(layout, bp)); - break; } } @@ -4381,7 +4480,17 @@ void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const pit_type const lastpit = parit.lastpit(); for ( ; parit.pit() <= lastpit ; ++parit.pit()) { // reduce depth if necessary - parit->params().depth(min(parit->params().depth(), maxdepth)); + if (parit->params().depth() > maxdepth) { + /** FIXME: this function is const, but + * nevertheless it modifies the buffer. To be + * cleaner, one should modify the buffer in + * another function, which is actually + * non-const. This would however be costly in + * terms of code duplication. + */ + const_cast(this)->undo().recordUndo(CursorData(parit)); + parit->params().depth(maxdepth); + } maxdepth = parit->getMaxDepthAfter(); if (utype == OutputUpdate) { @@ -4516,7 +4625,7 @@ int Buffer::charCount(bool with_blanks) const } -Buffer::ReadStatus Buffer::reload() +Buffer::ReadStatus Buffer::reload(bool clearUndo) { setBusy(true); // c.f. bug http://www.lyx.org/trac/ticket/6587 @@ -4534,7 +4643,8 @@ Buffer::ReadStatus Buffer::reload() updateTitles(); markClean(); message(bformat(_("Document %1$s reloaded."), disp_fn)); - d->undo_.clear(); + if (clearUndo) + d->undo_.clear(); } else { message(bformat(_("Could not reload document %1$s."), disp_fn)); } @@ -4567,6 +4677,7 @@ bool Buffer::saveAs(FileName const & fn) // we need to check that the locations of child buffers // are still valid. checkChildBuffers(); + checkMasterBuffer(); return true; } else { // save failed @@ -4615,4 +4726,25 @@ void Buffer::checkChildBuffers() d->position_to_children.clear(); } + +// If a child has been saved under a different name/path, it might have been +// orphaned. Therefore the master needs to be reset (bug 8161). +void Buffer::checkMasterBuffer() +{ + Buffer const * const master = masterBuffer(); + if (master == this) + return; + + // necessary to re-register the child (bug 5873) + // FIXME: clean up updateMacros (here, only + // child registering is needed). + master->updateMacros(); + // (re)set master as master buffer, but only + // if we are a real child + if (master->isChild(this)) + setParent(master); + else + setParent(0); +} + } // namespace lyx