From 264ea28cbd2a4c24dc6b81fa77422898167fa9f4 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Mon, 17 Mar 2014 11:15:42 +0100 Subject: [PATCH] Fix bug #8837: LyX hangs on selection The code that checks whether the cursor was at the end of a row in Cursor::upDowninText was not able to set boundary correctly. This causes a hang in because the cursor got stuck on a line and there is an infinite loop BufferView::dispatch when trying to go down. The fix is to avoid using the watered-down TextMetrics::x2pos wrapper around getColumnNearX and use the real thing instead. Eventually, the last user of x2pos (InsetTabular) should be fixed and the method should go away. --- src/Cursor.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/Cursor.cpp b/src/Cursor.cpp index 89db3a6dd0..d431965163 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -2107,17 +2107,13 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded) next_row = 0; } } - top().pos() = min(tm.x2pos(pit(), next_row, xo), top().lastpos()); - int const xpos = tm.x2pos(pit(), next_row, xo); - bool const at_end_row = xpos == tm.x2pos(pit(), next_row, tm.width()); - bool const at_beg_row = xpos == tm.x2pos(pit(), next_row, 0); - - if (at_end_row && at_beg_row) - // make sure the cursor ends up on this row - boundary(false); - else - boundary(at_end_row); + Row const & real_next_row = tm.parMetrics(pit()).rows()[next_row]; + bool bound = false; + pos_type const col = tm.getColumnNearX(pit(), real_next_row, + xo, bound); + top().pos() = real_next_row.pos() + col; + boundary(bound); updateNeeded |= bv().checkDepm(*this, old); }