Make sure that math macros are updated at export time.

The math macros system is quite complex. Macros are updated during
metrics calculation, so a missing update is very likely to cause a
crash. This commit tries to assure that they are updated at export
time, which also happens when the table of contents is updated.
Moreover, in order to circumvent a possible missing update, when
a math macro is detected we try to avoid using the sym_ member
of the MacroData class, as it may contain bogus values.
This commit is contained in:
Enrico Forestieri 2016-09-13 07:53:48 +02:00
parent 99eeb29e58
commit 8f86ee74cd
2 changed files with 11 additions and 5 deletions

View File

@ -495,7 +495,9 @@ void BufferView::processUpdateFlags(Update::flags flags)
// updateMetrics() does not update paragraph position // updateMetrics() does not update paragraph position
// This is done at draw() time. So we need a redraw! // This is done at draw() time. So we need a redraw!
buffer_.changed(false); // We pass true so that metrics are computed for the sake
// of having MacroData updated.
buffer_.changed(true);
if (needsFitCursor()) { if (needsFitCursor()) {
// The cursor is off screen so ensure it is visible. // The cursor is off screen so ensure it is visible.
@ -2181,7 +2183,9 @@ void BufferView::updateHoveredInset() const
// This event (moving without mouse click) is not passed further. // This event (moving without mouse click) is not passed further.
// This should be changed if it is further utilized. // This should be changed if it is further utilized.
buffer_.changed(false); // We pass true so that metrics are computed for the sake
// of having MacroData updated.
buffer_.changed(true);
} }
} }

View File

@ -614,7 +614,8 @@ void MathMacro::draw(PainterInfo & pi, int x, int y) const
drawMarkers2(pi, expx, expy); drawMarkers2(pi, expx, expy);
} else { } else {
bool drawBox = lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_INLINE_BOX; bool drawBox = lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_INLINE_BOX;
bool upshape = d->macro_ && d->macro_->symbol() bool user_macro = mathedWordList().find(name()) == mathedWordList().end();
bool upshape = user_macro ? false : d->macro_ && d->macro_->symbol()
&& d->macro_->symbol()->extra == "textmode"; && d->macro_->symbol()->extra == "textmode";
Changer dummy = pi.base.font.changeShape(upshape ? UP_SHAPE Changer dummy = pi.base.font.changeShape(upshape ? UP_SHAPE
: pi.base.font.shape()); : pi.base.font.shape());
@ -929,9 +930,10 @@ bool MathMacro::folded() const
void MathMacro::write(WriteStream & os) const void MathMacro::write(WriteStream & os) const
{ {
bool const textmode_macro = d->macro_ && d->macro_->symbol() bool user_macro = mathedWordList().find(name()) == mathedWordList().end();
bool textmode_macro = user_macro ? false : d->macro_ && d->macro_->symbol()
&& d->macro_->symbol()->extra == "textmode"; && d->macro_->symbol()->extra == "textmode";
bool const needs_mathmode = d->macro_ && (!d->macro_->symbol() bool needs_mathmode = user_macro ? bool(d->macro_) : d->macro_ && (!d->macro_->symbol()
|| d->macro_->symbol()->extra != "textmode"); || d->macro_->symbol()->extra != "textmode");
MathEnsurer ensurer(os, needs_mathmode, true, textmode_macro); MathEnsurer ensurer(os, needs_mathmode, true, textmode_macro);