From 64e5a8c01660051a8c5831f6b0f8ef4c66866034 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Sun, 14 Jul 2019 23:20:29 +0200 Subject: [PATCH] Introduce BufferView::caretInView() 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 | 11 ++++++++--- src/BufferView.h | 4 ++-- src/frontends/qt4/GuiWorkArea.cpp | 25 ++++++++----------------- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/src/BufferView.cpp b/src/BufferView.cpp index e7e69f63e0..0788036255 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -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; } diff --git a/src/BufferView.h b/src/BufferView.h index 1089781ffd..886d3c8fe7 100644 --- a/src/BufferView.h +++ b/src/BufferView.h @@ -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 diff --git a/src/frontends/qt4/GuiWorkArea.cpp b/src/frontends/qt4/GuiWorkArea.cpp index 046199d87e..e8cb4c48ba 100644 --- a/src/frontends/qt4/GuiWorkArea.cpp +++ b/src/frontends/qt4/GuiWorkArea.cpp @@ -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; -- 2.39.5