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.
This commit is contained in:
Jean-Marc Lasgouttes 2014-03-17 11:15:42 +01:00
parent a27333144d
commit 264ea28cbd

View File

@ -2107,17 +2107,13 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
next_row = 0; next_row = 0;
} }
} }
top().pos() = min(tm.x2pos(pit(), next_row, xo), top().lastpos());
int const xpos = tm.x2pos(pit(), next_row, xo); Row const & real_next_row = tm.parMetrics(pit()).rows()[next_row];
bool const at_end_row = xpos == tm.x2pos(pit(), next_row, tm.width()); bool bound = false;
bool const at_beg_row = xpos == tm.x2pos(pit(), next_row, 0); pos_type const col = tm.getColumnNearX(pit(), real_next_row,
xo, bound);
if (at_end_row && at_beg_row) top().pos() = real_next_row.pos() + col;
// make sure the cursor ends up on this row boundary(bound);
boundary(false);
else
boundary(at_end_row);
updateNeeded |= bv().checkDepm(*this, old); updateNeeded |= bv().checkDepm(*this, old);
} }