]> git.lyx.org Git - features.git/commitdiff
Fix bug #6208: macro crash.
authorEnrico Forestieri <forenr@lyx.org>
Sun, 15 Nov 2009 23:54:45 +0000 (23:54 +0000)
committerEnrico Forestieri <forenr@lyx.org>
Sun, 15 Nov 2009 23:54:45 +0000 (23:54 +0000)
The fix consists in not updating the macro while it is being edited,
and this is accomplished by the changes in MathData::updateMacros().
However, when clicking away with the mouse I was getting another crash,
which is cured by the changes in MathMacro::notifyCursorLeaves().

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@32037 a592a061-630c-0410-9148-cb99ea01b6c8

src/mathed/MathData.cpp
src/mathed/MathMacro.cpp

index b52c34f5d27089837bd9f18552b79d44deea8b71..7b112e9bebc34c047b144c140081be7ee5a90b82 100644 (file)
@@ -379,11 +379,18 @@ void MathData::drawT(TextPainter & pain, int x, int y) const
 
 void MathData::updateMacros(Cursor * cur, MacroContext const & mc)
 {
+       // If we are editing a macro, we cannot update it immediately,
+       // as no undo steps will be recorded (bug 6208).
+       InsetMath const * inmath = cur ? cur->inset().asInsetMath() : 0;
+       MathMacro const * inmacro = inmath ? inmath->asMacro() : 0;
+       docstring const edited_name = inmacro ? inmacro->name() : docstring();
+
        // go over the array and look for macros
        for (size_t i = 0; i < size(); ++i) {
                MathMacro * macroInset = operator[](i).nucleus()->asMacro();
                if (!macroInset || macroInset->name_[0] == '^'
-                               || macroInset->name_[0] == '_')
+                               || macroInset->name_[0] == '_'
+                               || macroInset->name() == edited_name)
                        continue;
 
                // get macro
index 3da0421aba45b3213be9b1619839e89c9a92850e..29235fa68b44b0c119ea96fd38ae8c226ce9b285 100644 (file)
@@ -633,15 +633,16 @@ bool MathMacro::notifyCursorLeaves(Cursor const & old, Cursor & cur)
                docstring const & unfolded_name = name();
                if (unfolded_name != name_) {
                        // The macro name was changed
-                       cur = old;
-                       bool left = cur.pos() == 0;
-                       cur.recordUndoInset();
-                       cur.popForward();
-                       cur.backspace();
-                       cur.insert(createInsetMath(unfolded_name, cur.buffer()));
-                       if (left)
-                               cur.backwardPos();
-                       cur.updateFlags(Update::Force);
+                       Cursor insetCur = old;
+                       int macroSlice = insetCur.find(this);
+                       LASSERT(macroSlice != -1, /**/);
+                       insetCur.cutOff(macroSlice);
+                       insetCur.recordUndoInset();
+                       insetCur.pop();
+                       insetCur.cell().erase(insetCur.pos());
+                       insetCur.cell().insert(insetCur.pos(),
+                               createInsetMath(unfolded_name, cur.buffer()));
+                       cur.updateFlags(cur.disp_.update() | Update::SinglePar);
                        return true;
                }
        }