///
Undo undo_;
+ /// This is increased every time the buffer or one of its relatives is marked dirty
+ int id_ = 0;
+ /// The buffer id at last updateMacros invokation
+ int update_macros_id_ = -1;
+
/// A cache for the bibfiles (including bibfiles of loaded child
/// documents), needed for appropriate update of natbib labels.
mutable docstring_list bibfiles_cache_;
}
+int Buffer::id() const
+{
+ return d->id_;
+}
+
+
+void Buffer::updateId()
+{
+ ++d->id_;
+ for(Buffer * b : allRelatives())
+ ++(b->d->id_);
+}
+
+
void Buffer::setChild(DocIterator const & dit, Buffer * child)
{
d->children_positions[child] = dit;
for (auto & depit : d->dep_clean)
depit.second = false;
+
+ // Update the buffer and its relatives' ids.
+ updateId();
}
if (d->macro_lock)
return;
+ // early exit if the buffer has not changed since last time
+ if (d->update_macros_id_ == d->id_)
+ return;
+ d->update_macros_id_ = d->id_;
+
LYXERR(Debug::MACROS, "updateMacro of " << d->filename.onlyFileName());
// start with empty table
///
Undo const & undo() const;
+ /// poor man versioning of the buffer (and its relatives).
+ int id() const;
+ /// change the id of this buffer and its relatives (indicating
+ /// something has changed). This is currently used by updateMacros().
+ void updateId();
+
/// This function is called when the buffer is changed.
void changed(bool update_metrics) const;
///
if (!undo.cur_before.empty())
cur = undo.cur_before;
- if (undo.lyx_clean)
+ if (undo.lyx_clean) {
buffer_.markClean();
- else
+ // since we have changed the buffer, update its id.
+ buffer_.updateId();
+ } else
buffer_.markDirty();
// Now that we're done with undo, we pop it off the stack.
stack.pop();