mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-24 13:48:59 +00:00
Do not run updateMacros if the buffer has not changed
Each buffer now has an id which is increased when it is marked dirty (or when one of its relatives is marked dirty). This can be a big win since updateMacros is very expensive. (cherry picked from commit999fb37ebb
) (cherry picked from commitfe1a3b57df
)
This commit is contained in:
parent
63165a95d5
commit
e2cf6731c0
@ -253,6 +253,11 @@ public:
|
||||
///
|
||||
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_;
|
||||
@ -808,6 +813,20 @@ Undo const & Buffer::undo() const
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
@ -3322,6 +3341,9 @@ void Buffer::markDirty()
|
||||
|
||||
for (auto & depit : d->dep_clean)
|
||||
depit.second = false;
|
||||
|
||||
// Update the buffer and its relatives' ids.
|
||||
updateId();
|
||||
}
|
||||
|
||||
|
||||
@ -3916,6 +3938,11 @@ void Buffer::updateMacros() const
|
||||
if (d->macro_lock)
|
||||
return;
|
||||
|
||||
// early exit if the buffer has not changed since last time
|
||||
if (d->gui_ && 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
|
||||
|
@ -660,6 +660,12 @@ public:
|
||||
///
|
||||
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;
|
||||
///
|
||||
|
@ -512,9 +512,11 @@ void Undo::Private::doUndoRedoAction(CursorData & cur, UndoElementStack & stack,
|
||||
|
||||
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();
|
||||
|
@ -54,6 +54,9 @@ What's new
|
||||
|
||||
- fix crash when using Save As... with previews enabled (bug 13091).
|
||||
|
||||
- Speedup interactive use by avoiding expensive math macros bookkeeping
|
||||
when possible.
|
||||
|
||||
|
||||
* DOCUMENTATION AND LOCALIZATION
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user