From 2e633645edf00ed44eed35923c6045ef7038a610 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Wed, 31 Jan 2018 16:26:45 +0100 Subject: [PATCH] Make CursorData::checkNewWordPosition() more robust Before accessing things like new_word_.lastpos(), it is better to make sure that new_word_ points to something that exists. Therefore, the call to fixIfBroken() is moved in first position. Other changes: inTexted() is replaced by a more general test that current inset has not changed; test idx() in addition to pit(). --- src/Cursor.cpp | 50 ++++++++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/Cursor.cpp b/src/Cursor.cpp index 3f5bff854c..83b7378785 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -457,34 +457,32 @@ void CursorData::checkNewWordPosition() { if (!lyxrc.spellcheck_continuously || new_word_.empty()) return ; - if (!inTexted()) - clearNewWordPosition(); + // forget the position of the current new word if + // 1) or the remembered position was "broken" + // 2) or the count of nested insets changed + // 3) the top-level inset is not the same anymore + // 4) the cell index changed + // 5) or the paragraph changed + // 6) or the cursor pos is out of paragraph bound + if (new_word_.fixIfBroken() + || depth() != new_word_.depth() + || &inset() != &new_word_.inset() + || pit() != new_word_.pit() + || idx() != new_word_.idx() + || new_word_.pos() > new_word_.lastpos()) + clearNewWordPosition(); else { - // forget the position of the current new word if - // 1) the paragraph changes or - // 2) the count of nested insets changes or - // 3) the cursor pos is out of paragraph bound - if (pit() != new_word_.pit() || - depth() != new_word_.depth() || - new_word_.pos() > new_word_.lastpos()) { - clearNewWordPosition(); - } else if (new_word_.fixIfBroken()) - // 4) or the remembered position was "broken" - clearNewWordPosition(); - else { - FontSpan nw = locateWord(WHOLE_WORD); - if (!nw.empty()) { - FontSpan ow = new_word_.locateWord(WHOLE_WORD); - if (nw.intersect(ow).empty()) - clearNewWordPosition(); - else - LYXERR(Debug::DEBUG, "new word: " - << " par: " << pit() - << " pos: " << nw.first << ".." << nw.last); - } else { + FontSpan nw = locateWord(WHOLE_WORD); + if (!nw.empty()) { + FontSpan ow = new_word_.locateWord(WHOLE_WORD); + if (nw.intersect(ow).empty()) clearNewWordPosition(); - } - } + else + LYXERR(Debug::DEBUG, "new word: " + << " par: " << pit() + << " pos: " << nw.first << ".." << nw.last); + } else + clearNewWordPosition(); } }