> 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

Reply via email to