commit e5b6be0712a245901ec54aee44da45db77594382
Author: Richard Kimberly Heck <[email protected]>
Date:   Mon Mar 2 23:57:08 2020 -0500

    Fix bug #10316.
    
    By sending the request through the usual dispatch machinery, we
    make sure the cursor is valid when we're done.
---
 src/frontends/qt/TocWidget.cpp |   21 ++++++++++++++++-----
 1 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/src/frontends/qt/TocWidget.cpp b/src/frontends/qt/TocWidget.cpp
index e90405d..4c69aa3 100644
--- a/src/frontends/qt/TocWidget.cpp
+++ b/src/frontends/qt/TocWidget.cpp
@@ -181,7 +181,6 @@ void TocWidget::doDispatch(Cursor & cur, FuncRequest const 
& cmd,
 {
 
        Inset * inset = itemInset();
-       FuncRequest tmpcmd(cmd);
 
        QModelIndex const & index = tocTV->currentIndex();
        TocItem const & item =
@@ -193,15 +192,25 @@ void TocWidget::doDispatch(Cursor & cur, FuncRequest 
const & cmd,
        switch (cmd.action())
        {
        case LFUN_CHANGE_ACCEPT:
-       case LFUN_CHANGE_REJECT:
+       case LFUN_CHANGE_REJECT: {
+               // The action is almost always LYX_UNKNOWN_ACTION, which will
+               // have the effect of moving the cursor to the location of
+               // the change. (See TocItem::action.)
                dispatch(item.action());
-               cur.dispatch(tmpcmd);
+               // If we do not reset the origin, then the request will be sent 
back
+               // here, and we are in an infinite loop. But we need the 
dispatch
+               // machinery to clean up for us, if the cursor is in an inset 
that
+               // will be deleted. See bug #10316.
+               FuncRequest tmpcmd(cmd);
+               tmpcmd.setOrigin(FuncRequest::INTERNAL);
+               dispatch(tmpcmd);
                dr.forceBufferUpdate();
                break;
+       }
 
        case LFUN_SECTION_SELECT:
                dispatch(item.action());
-               cur.dispatch(tmpcmd);
+               cur.dispatch(cmd);
                // necessary to get the selection drawn.
                cur.buffer()->changed(true);
                gui_view_.setFocus();
@@ -222,10 +231,12 @@ void TocWidget::doDispatch(Cursor & cur, FuncRequest 
const & cmd,
                outline(cmd.action());
                break;
 
-       default:
+       default: {
+               FuncRequest tmpcmd(cmd);
                if (inset)
                        inset->dispatch(cur, tmpcmd);
        }
+       }
        cur.endUndoGroup();
 }
 
-- 
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to