]> git.lyx.org Git - lyx.git/commitdiff
Introduce BufferView::caretInView()
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Sun, 14 Jul 2019 21:20:29 +0000 (23:20 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Fri, 18 Sep 2020 07:26:28 +0000 (09:26 +0200)
It is not a good idea to call caretPosAndHeight when the caret is in a
paragraph that is not in cached metrics. This can happen when not
using "cursor follows scrollbar".

This commit refactor things a bit so that testing is done in
BufferView.

(cherry picked from commit e6b54ea4d2e28d55565699ded45da971278b23bf)

src/BufferView.cpp
src/BufferView.h
src/frontends/qt4/GuiWorkArea.cpp

index e7e69f63e0a5eb4543ddb8f2ef4e96f86b459241..07880362552e29f8cc583b093c5c4d73615026f2 100644 (file)
@@ -3060,11 +3060,16 @@ void BufferView::caretPosAndHeight(Point & p, int & h) const
 }
 
 
-bool BufferView::cursorInView(Point const & p, int h) const
+bool BufferView::caretInView() const
 {
-       Cursor const & cur = cursor();
+       if (!paragraphVisible(cursor()))
+               return false;
+       Point p;
+       int h;
+       caretPosAndHeight(p, h);
+
        // does the cursor touch the screen ?
-       if (p.y_ + h < 0 || p.y_ >= workHeight() || !paragraphVisible(cur))
+       if (p.y_ + h < 0 || p.y_ >= workHeight())
                return false;
        return true;
 }
index 1089781ffdb79ab5d0f64ad6e12f1c34accf0253..886d3c8fe7bcb6e4dba90d13561b918a8eaffd26 100644 (file)
@@ -303,8 +303,8 @@ public:
        Point getPos(DocIterator const & dit) const;
        /// is the paragraph of the cursor visible ?
        bool paragraphVisible(DocIterator const & dit) const;
-       /// is the cursor currently visible in the view
-       bool cursorInView(Point const & p, int h) const;
+       /// is the caret currently visible in the view
+       bool caretInView() const;
        /// set the ascent and descent of the caret
        void setCaretAscentDescent(int asc, int des);
        /// get the position and height of the caret
index 046199d87e303a1f8ab8337d249cc0477e715526..e8cb4c48ba45c4ac8cdc20fcc4894d31a276d0b1 100644 (file)
@@ -443,16 +443,11 @@ void GuiWorkArea::startBlinkingCaret()
        if (view().busy())
                return;
 
-       // we cannot update geometry if not ready and we do not need to if
-       // caret is not in view.
-       if (!d->buffer_view_->buffer().undo().activeUndoGroup()) {
-               Point p;
-               int h = 0;
-               d->buffer_view_->caretPosAndHeight(p, h);
-               // Don't start blinking if the cursor isn't on screen.
-               if (!d->buffer_view_->cursorInView(p, h))
-                       return;
-       }
+       // Don't start blinking if the cursor isn't on screen, unless we
+       // are not ready to know whether the cursor is on screen.
+       if (!d->buffer_view_->buffer().undo().activeUndoGroup()
+           && !d->buffer_view_->caretInView())
+               return;
 
        d->showCaret();
 
@@ -588,10 +583,7 @@ void GuiWorkArea::Private::resizeBufferView()
        // Warn our container (GuiView).
        p->busy(true);
 
-       Point point;
-       int h = 0;
-       buffer_view_->caretPosAndHeight(point, h);
-       bool const caret_in_view = buffer_view_->cursorInView(point, h);
+       bool const caret_in_view = buffer_view_->caretInView();
        buffer_view_->resize(p->viewport()->width(), p->viewport()->height());
        if (caret_in_view)
                buffer_view_->scrollToCursor();
@@ -617,14 +609,13 @@ void GuiWorkArea::Private::updateCaretGeometry()
 {
        // we cannot update geometry if not ready and we do not need to if
        // caret is not in view.
-       if (buffer_view_->buffer().undo().activeUndoGroup())
+       if (buffer_view_->buffer().undo().activeUndoGroup()
+           || !buffer_view_->caretInView())
                return;
 
        Point point;
        int h = 0;
        buffer_view_->caretPosAndHeight(point, h);
-       if (!buffer_view_->cursorInView(point, h))
-               return;
 
        // RTL or not RTL
        bool l_shape = false;