Fix crash when copying a macro with instant preview on

The MacroData pointer is updated by MathData::metrics() which is not
called when selecting a math inset with instant preview for math on.
Thus, we have to update it in the copy constructor otherwise a crash
is almost assured when hitting Ctrl+C.
This commit is contained in:
Enrico Forestieri 2015-06-24 23:38:53 +02:00
parent e4fada8c57
commit f3b03699ef
2 changed files with 18 additions and 0 deletions

View File

@ -69,6 +69,8 @@ public:
char const * MathMLtype() const;
///
void setSymbol(latexkeys const * sym) { sym_ = sym; }
///
DocIterator const & pos() { return pos_; }
/// lock while being drawn to avoid recursions
int lock() const { return ++lockCount_; }

View File

@ -203,6 +203,14 @@ MathMacro::MathMacro(MathMacro const & that)
: InsetMathNest(that), d(new Private(*that.d))
{
d->updateChildren(this);
if (d->macro_ && lyxrc.preview == LyXRC::PREVIEW_ON) {
// We need to update d->macro_ by ourselves because in this case
// MathData::metrics() is not called when selecting a math inset
DocIterator const & pos = d->macroBackup_.pos();
d->macro_ = pos.buffer()->getMacro(name(), pos);
if (!d->macro_)
d->macro_ = &d->macroBackup_;
}
}
@ -213,6 +221,14 @@ MathMacro & MathMacro::operator=(MathMacro const & that)
InsetMathNest::operator=(that);
*d = *that.d;
d->updateChildren(this);
if (d->macro_ && lyxrc.preview == LyXRC::PREVIEW_ON) {
// We need to update d->macro_ by ourselves because in this case
// MathData::metrics() is not called when selecting a math inset
DocIterator const & pos = d->macroBackup_.pos();
d->macro_ = pos.buffer()->getMacro(name(), pos);
if (!d->macro_)
d->macro_ = &d->macroBackup_;
}
return *this;
}