]> git.lyx.org Git - features.git/commitdiff
Fix crash when selecting text with changes
authorScott Kostyshak <skostysh@lyx.org>
Fri, 27 Jul 2018 19:28:22 +0000 (15:28 -0400)
committerScott Kostyshak <skostysh@lyx.org>
Sat, 22 Dec 2018 19:57:40 +0000 (14:57 -0500)
When selecting text, in some cases a DocIterator could be forwarded
to a (non-existant) paragraph after the end. The critical part of
this fix is to break the loop at the correct place. The following
are additional improvements:

- increase readability by defining a bool named "in_last_par"
- use cur.selectionEnd().pit() instead of cur.selectionEnd().paragraph().id()
- use it.lastpos() instead of it.paragraph().size()

This commit fixes a regression introduced by 23de5e5e, and reported
at #11204.

Thanks to Jürgen and JMarc.

(cherry picked from commit d12798759aeb7bae77bec63098fd81f8cc9e554b)

src/Text3.cpp

index e75fad05488ac4f20b8f8cf39d048f2d995b9ad2..b5f9e33f47cd8e99391255d0bf4f7549337b65d3 100644 (file)
@@ -3207,17 +3207,20 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                        if (!cur.buffer()->areChangesPresent())
                                break;
 
-                       for (DocIterator it = cur.selectionBegin(); it < cur.selectionEnd(); it.forwardPar()) {
+                       for (DocIterator it = cur.selectionBegin(); ; it.forwardPar()) {
                                pos_type const beg = it.pos();
                                pos_type end;
-                               if (it.paragraph().id() == cur.selectionEnd().paragraph().id())
+                               bool const in_last_par = (it.pit() == cur.selectionEnd().pit());
+                               if (in_last_par)
                                        end = cur.selectionEnd().pos();
                                else
-                                       end = it.paragraph().size();
+                                       end = it.lastpos();
                                if (beg != end && it.paragraph().isChanged(beg, end)) {
                                        enable = true;
                                        break;
                                }
+                               if (in_last_par)
+                                       break;
                        }
                }
                break;