commit 264ea28cbd2a4c24dc6b81fa77422898167fa9f4
Author: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date:   Mon Mar 17 11:15:42 2014 +0100

    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.

diff --git a/src/Cursor.cpp b/src/Cursor.cpp
index 89db3a6..d431965 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);
        }

Reply via email to