From 7365a29fea7076ab9113b31b5f62bdc6791e2f2f Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Sun, 15 Nov 2009 23:54:45 +0000 Subject: [PATCH] Fix bug #6208: macro crash. 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 | 9 ++++++++- src/mathed/MathMacro.cpp | 19 ++++++++++--------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/mathed/MathData.cpp b/src/mathed/MathData.cpp index b52c34f5d2..7b112e9beb 100644 --- a/src/mathed/MathData.cpp +++ b/src/mathed/MathData.cpp @@ -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 diff --git a/src/mathed/MathMacro.cpp b/src/mathed/MathMacro.cpp index 3da0421aba..29235fa68b 100644 --- a/src/mathed/MathMacro.cpp +++ b/src/mathed/MathMacro.cpp @@ -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; } }