From 5ebc733ff3ec044a93f8ae7a7aaea22ea68224df Mon Sep 17 00:00:00 2001 From: Vincent van Ravesteijn Date: Thu, 5 Nov 2009 12:58:25 +0000 Subject: [PATCH] Fix bug #6237: The boundary has to be set correctly when moving up with a selection. If not, the cursor will remain on the same row when there are two e.g. displayed equations after each other. This will cause an infinite loop when SCREEN_UP is executed. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@31863 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/Cursor.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Cursor.cpp b/src/Cursor.cpp index d14fb45531..d8362e21d9 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -1834,31 +1834,43 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded) operator=(dummy); } } else { - // if there is a selection, we stay out of any inset, and just jump to the right position: + // if there is a selection, we stay out of any inset, + // and just jump to the right position: Cursor old = *this; + int next_row = row; if (up) { if (row > 0) { - top().pos() = min(tm.x2pos(pit(), row - 1, xo), top().lastpos()); + --next_row; + top().pos() + = min(tm.x2pos(pit(), next_row, xo), top().lastpos()); } else if (pit() > 0) { --pit(); TextMetrics & tm = bv_->textMetrics(text()); if (!tm.contains(pit())) tm.newParMetricsUp(); ParagraphMetrics const & pmcur = tm.parMetrics(pit()); - top().pos() = min(tm.x2pos(pit(), pmcur.rows().size() - 1, xo), top().lastpos()); + next_row = pmcur.rows().size() - 1; + top().pos() + = min(tm.x2pos(pit(), next_row, xo), top().lastpos()); } } else { if (row + 1 < int(pm.rows().size())) { - top().pos() = min(tm.x2pos(pit(), row + 1, xo), top().lastpos()); + ++next_row; + top().pos() + = min(tm.x2pos(pit(), next_row, xo), top().lastpos()); } else if (pit() + 1 < int(text()->paragraphs().size())) { ++pit(); TextMetrics & tm = bv_->textMetrics(text()); if (!tm.contains(pit())) tm.newParMetricsDown(); - top().pos() = min(tm.x2pos(pit(), 0, xo), top().lastpos()); + next_row = 0; + top().pos() + = min(tm.x2pos(pit(), next_row, xo), top().lastpos()); } } + boundary(tm.x2pos(pit(), next_row, xo) + == tm.x2pos(pit(), next_row, tm.width())); updateNeeded |= bv().checkDepm(*this, old); } -- 2.39.2