]> git.lyx.org Git - lyx.git/commitdiff
* fix bug 4055, overdue patch from Stefan Schimanski:
authorJürgen Spitzmüller <spitz@lyx.org>
Mon, 17 Dec 2007 18:13:02 +0000 (18:13 +0000)
committerJürgen Spitzmüller <spitz@lyx.org>
Mon, 17 Dec 2007 18:13:02 +0000 (18:13 +0000)
"The idea of the beforeDispX/Y_ variables in the Cursor is to hold the position
of the cursor on screen before the lyxfunc is dispatched. But to get this the
metrics must be valid. It's updated in Cursor::dispatch before the dispatch
loop.
After inserting/deleting stuff (like when deleting the selected text before
inserting the alpha) the metrics are invalid. But the handler for the alpha
calls Cursor::dispatch after the deletion and hence the crash with your second
patch.

Here is a patch fixing that:

The beforeDispatchXY variable do not belong into the Cursor::dispatch because
Cursor::dispatch is often called "manually" by many handlers to some followup
action. So this logic must go somewhere else where it is sure that is not
updated after the metrics got invalidated."

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@22193 a592a061-630c-0410-9148-cb99ea01b6c8

src/Cursor.cpp
src/Cursor.h
src/LyXFunc.cpp
src/LyXFunc.h
src/Text3.cpp

index a1a078df0a5cb342b82ba3f0c3defa65243300e3..4552983b556dcae30fd7a5b7ed5d4976ca304b63 100644 (file)
@@ -296,7 +296,6 @@ void Cursor::dispatch(FuncRequest const & cmd0)
        Cursor safe = *this;
        
        // store some values to be used inside of the handlers
-       getPos(beforeDispX_, beforeDispY_);
        beforeDispatchCursor_ = *this;
        for (; depth(); pop()) {
                LYXERR(Debug::DEBUG, "Cursor::dispatch: cmd: "
@@ -1074,8 +1073,8 @@ bool Cursor::upDownInMath(bool up)
        int xo = 0;
        int yo = 0;
        getPos(xo, yo);
-       xo = beforeDispX_;
-
+       xo = theLyXFunc().cursorBeforeDispatchX();
+       
        // check if we had something else in mind, if not, this is the future
        // target
        if (x_target_ == -1)
@@ -1124,8 +1123,9 @@ bool Cursor::upDownInMath(bool up)
                                int x;
                                int y;
                                getPos(x, y);
-                               if ((!up && y <= beforeDispY_) ||
-                                               (up && y >= beforeDispY_))
+                               int oy = theLyXFunc().cursorBeforeDispatchY();
+                               if ((!up && y <= oy) ||
+                                               (up && y >= oy))
                                        operator=(old);
                                else
                                        return true;
@@ -1144,8 +1144,9 @@ bool Cursor::upDownInMath(bool up)
                                int x;
                                int y;
                                getPos(x, y);
-                               if ((!up && y <= beforeDispY_) ||
-                                               (up && y >= beforeDispY_))
+                               int oy = theLyXFunc().cursorBeforeDispatchY();
+                               if ((!up && y <= oy) ||
+                                               (up && y >= oy))
                                        operator=(old);
                                else
                                        return true;
@@ -1167,8 +1168,9 @@ bool Cursor::upDownInMath(bool up)
                //lyxerr << "updown: popBackward succeeded" << endl;
                int xnew;
                int ynew;
+               int yold = theLyXFunc().cursorBeforeDispatchY();
                getPos(xnew, ynew);
-               if (up ? ynew < beforeDispY_ : ynew > beforeDispY_)
+               if (up ? ynew < yold : ynew > yold)
                        return true;
        }
        
@@ -1186,8 +1188,8 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
        int xo = 0;
        int yo = 0;
        getPos(xo, yo);
-       xo = beforeDispX_;
-       
+       xo = theLyXFunc().cursorBeforeDispatchX();
+
        // update the targetX - this is here before the "return false"
        // to set a new target which can be used by InsetTexts above
        // if we cannot move up/down inside this inset anymore
index ba269f806d1ca2162a2aaad148c15a671a7bbd0a..d75891b7ef4bc1dcfa47c0d5f27bf9d52181ad2e 100644 (file)
@@ -254,10 +254,6 @@ private:
        // of a big inset spanning a whole row and computing coordinates for
        // displaying the cursor.
        bool logicalpos_;
-       /// x position before dispatch started
-       int beforeDispX_;
-       /// y position before dispatch started
-       int beforeDispY_;
        /// position before dispatch started
        DocIterator beforeDispatchCursor_;
 
index 4e1f808c7401c2e67dc558d97cef70253e327f04..d4536dbc7065328a164e4777258619e426e7fc17 100644 (file)
@@ -1764,6 +1764,8 @@ void LyXFunc::dispatch(FuncRequest const & cmd)
 
                        // Let the current Cursor dispatch its own actions.
                        BOOST_ASSERT(lyx_view_->view());
+                       view()->cursor().getPos(cursorPosBeforeDispatchX_,
+                                               cursorPosBeforeDispatchY_);
                        view()->cursor().dispatch(cmd);
                        updateFlags = view()->cursor().result().update();
                        if (!view()->cursor().result().dispatched())
index 5914c53c662c1a2e0b3bbb01c2862057bc9c7d5e..3a0dd617dbc0f8ae776140e40dba1975b190a669 100644 (file)
@@ -91,6 +91,15 @@ public:
        Buffer * loadAndViewFile(support::FileName const &  name, ///< File to load.
                bool tolastfiles = true);  ///< append to the "Open recent" menu?
 
+       /// cursor x position before dispatch started
+       int cursorBeforeDispatchX() const {
+               return cursorPosBeforeDispatchX_;
+       }
+       /// cursor y position before dispatch started
+       int cursorBeforeDispatchY() const {
+               return cursorPosBeforeDispatchY_;
+       }
+
 private:
        ///
        BufferView * view() const;
@@ -108,6 +117,10 @@ private:
        ///
        KeyModifier meta_fake_bit;
 
+       /// cursor position before dispatch started
+       int cursorPosBeforeDispatchX_;
+       int cursorPosBeforeDispatchY_;
+
        /// Error status, only Dispatch can change this flag
        mutable bool errorstat;
 
index bd0e67eec59bbd56c03fd0143bb10f16aa13775d..da8b11a834065b89ceb746130bd4e86d9cf95a7d 100644 (file)
@@ -1450,12 +1450,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_MATH_MATRIX:
        case LFUN_MATH_DELIM:
        case LFUN_MATH_BIGDELIM: {
-               if (cur.selection())
-                       cur.clearSelection();
-               // FIXME: instead of the above, this one
-               // should be used (but it asserts with Bidi enabled)
-               // cf. http://bugzilla.lyx.org/show_bug.cgi?id=4055
-               // cap::replaceSelection(cur);
+               cap::replaceSelection(cur);
                cur.insert(new InsetMathHull(hullSimple));
                checkAndActivateInset(cur, true);
                BOOST_ASSERT(cur.inMathed());