> I see. I'll commit your patch if you attach it again (with ChangeLog please).
I invented a Changelog entry and committed this right now. Georg
Index: src/ChangeLog =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/ChangeLog,v retrieving revision 1.2122 diff -u -p -r1.2122 ChangeLog --- src/ChangeLog 15 Feb 2005 13:45:37 -0000 1.2122 +++ src/ChangeLog 15 Feb 2005 16:06:00 -0000 @@ -1,3 +1,9 @@ +2005-02-13 André Pönitz <[EMAIL PROTECTED]> + + * Cursor.[Ch] (fixIfBroken): new method, try to fix a broken cursor + * Cursor.C (dispatch): use fixIfBroken + * lyxfunc.C (getStatus): use fixIfBroken + 2005-02-15 Angus Leeming <[EMAIL PROTECTED]> * lyx_main.C (error_handler): Index: src/cursor.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor.C,v retrieving revision 1.121 diff -u -p -r1.121 cursor.C --- src/cursor.C 8 Feb 2005 13:17:57 -0000 1.121 +++ src/cursor.C 15 Feb 2005 16:06:01 -0000 @@ -199,6 +199,7 @@ void LCursor::dispatch(FuncRequest const if (empty()) return; + fixIfBroken(); FuncRequest cmd = cmd0; LCursor safe = *this; @@ -1138,4 +1139,42 @@ LyXFont LCursor::getFont() const outerFont(sl.pit(), text.paragraphs())); return font; +} + + +void LCursor::fixIfBroken() +{ + // find out last good level + LCursor copy = *this; + size_t newdepth = depth(); + while (!copy.empty()) { + if (copy.idx() > copy.lastidx()) { + lyxerr << "wrong idx " << copy.idx() + << ", max is " << copy.lastidx() + << " at level " << copy.depth() + << ". Trying to correct this." << endl; + newdepth = copy.depth() - 1; + } + else if (copy.pit() > copy.lastpit()) { + lyxerr << "wrong pit " << copy.pit() + << ", max is " << copy.lastpit() + << " at level " << copy.depth() + << ". Trying to correct this." << endl; + newdepth = copy.depth() - 1; + } + else if (copy.pos() > copy.lastpos()) { + lyxerr << "wrong pos " << copy.pos() + << ", max is " << copy.lastpos() + << " at level " << copy.depth() + << ". Trying to correct this." << endl; + newdepth = copy.depth() - 1; + } + copy.pop(); + } + // shrink cursor to a size where everything is valid, possibly + // leaving insets + while (depth() > newdepth) { + pop(); + lyxerr << "correcting cursor to level " << depth() << endl; + } } Index: src/cursor.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor.h,v retrieving revision 1.70 diff -u -p -r1.70 cursor.h --- src/cursor.h 10 Jan 2005 09:28:05 -0000 1.70 +++ src/cursor.h 15 Feb 2005 16:06:01 -0000 @@ -152,6 +152,8 @@ public: void needsUpdate(); /// don't call update() when done void noUpdate(); + /// fix cursor in circumstances that should never happen + void fixIfBroken(); /// output friend std::ostream & operator<<(std::ostream & os, LCursor const & cur); Index: src/lyxfunc.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxfunc.C,v retrieving revision 1.647 diff -u -p -r1.647 lyxfunc.C --- src/lyxfunc.C 15 Feb 2005 13:45:38 -0000 1.647 +++ src/lyxfunc.C 15 Feb 2005 16:06:02 -0000 @@ -146,6 +146,9 @@ namespace { bool getStatus(LCursor cursor, FuncRequest const & cmd, FuncStatus & status) { + // Try to fix cursor in case it is broken. + cursor.fixIfBroken(); + // This is, of course, a mess. Better create a new doc iterator and use // this in Inset::getStatus. This might require an additional // BufferView * arg, though (which should be avoided) @@ -155,30 +158,15 @@ bool getStatus(LCursor cursor, //lyxerr << "\nLCursor::getStatus: cmd: " << cmd << endl << *this << endl; DocIterator::idx_type & idx = cursor.idx(); DocIterator::idx_type const lastidx = cursor.lastidx(); - - if (idx > lastidx) { - lyxerr << "wrong idx " << idx << ", max is " << lastidx - << ". Trying to correct this." << endl; - idx = lastidx; - } + BOOST_ASSERT(idx <= lastidx); DocIterator::pit_type & pit = cursor.pit(); DocIterator::pit_type const lastpit = cursor.lastpit(); - - if (pit > lastpit) { - lyxerr << "wrong par " << pit << ", max is " << lastpit - << ". Trying to correct this." << endl; - pit = lastpit; - } + BOOST_ASSERT(pit <= lastpit); DocIterator::pos_type & pos = cursor.pos(); DocIterator::pos_type const lastpos = cursor.lastpos(); - - if (pos > lastpos) { - lyxerr << "wrong pos " << pos << ", max is " << lastpos - << ". Trying to correct this." << endl; - pos = lastpos; - } + BOOST_ASSERT(pos <= lastpos); // The inset's getStatus() will return 'true' if it made // a definitive decision on whether it want to handle the