From: Jean-Marc Lasgouttes Date: Fri, 24 Feb 2006 14:41:48 +0000 (+0000) Subject: bug 1918: Positioning cursor in mathinset with the mouse does not work correctly... X-Git-Tag: 1.6.10~13563 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=498a451a769d3a7252f3914b0e9dc9be2a42c1b8;p=features.git bug 1918: Positioning cursor in mathinset with the mouse does not work correctly (and can crash) git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@13275 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/mathed/ChangeLog b/src/mathed/ChangeLog index b6431c8cab..989cd32ecf 100644 --- a/src/mathed/ChangeLog +++ b/src/mathed/ChangeLog @@ -1,3 +1,9 @@ +2006-02-23 Jean-Marc Lasgouttes + + * math_data.C (x2pos): Place cursor correctly in the case of + MathNestInset; this avoids misplaced cursor (and subsequent crash) + when placing the mouse near a symbol inset. + 2006-02-17 Georg Baum * math_xymatrixinset.[Ch]: Readd diff --git a/src/mathed/math_data.C b/src/mathed/math_data.C index 770f5048f5..790034aa1c 100644 --- a/src/mathed/math_data.C +++ b/src/mathed/math_data.C @@ -375,6 +375,7 @@ MathArray::size_type MathArray::x2pos(int targetx, int glue) const const_iterator it = begin(); int lastx = 0; int currx = 0; + // find first position after targetx for (; currx < targetx && it < end(); ++it) { lastx = currx; if ((*it)->getChar() == ' ') @@ -382,19 +383,20 @@ MathArray::size_type MathArray::x2pos(int targetx, int glue) const currx += (*it)->width(); } - if (abs(lastx - targetx) < abs(currx - targetx) && it != begin()) + /** + * If we are not at the beginning of the array, go to the left + * of the inset if one of the following two condition holds: + * - the current inset is editable (so that the cursor tip is + * deeper than us): in this case, we want all intermediate + * cursor slices to be before insets; + * - the mouse is closer to the left side of the inset than to + * the right one. + * See bug 1918 for details. + **/ + if (it != begin() + && ((*boost::prior(it))->asNestInset() + || abs(lastx - targetx) < abs(currx - targetx))) { --it; - // The below code guarantees that in this slice, the cursor will - // never be on the right edge of an inset after a mouse click. -#ifdef WITH_WARNINGS -#warning A better solution has to be found here! - // FIXME: this is too brute! The position left to an inset should - // be reachable with the mouse in general. -#endif - if (it != begin()) { - --it; - if (it < end() && (*it)->getChar()) - ++it; } return it - begin();