void GuiWorkArea::startBlinkingCaret()
{
- // do not show the cursor if the view is busy
- if (view().busy())
- return;
-
- // Don't start blinking if the cursor isn't on screen.
- if (!d->buffer_view_->caretInView())
- return;
-
d->showCaret();
// Avoid blinking when debugging PAINTING, since it creates too much noise
}
-void GuiWorkArea::Private::showCaret()
+void GuiWorkArea::Private::showCaret(bool show)
{
- if (caret_visible_)
+ if (caret_visible_ == show)
return;
+ caret_visible_ = show;
- updateCaretGeometry();
- p->viewport()->update();
-}
-
-
-void GuiWorkArea::Private::hideCaret()
-{
- if (!caret_visible_)
+ /**
+ * Do not trigger the painting machinery if either
+ * 1. the view is busy (no updates at all)
+ * 2. The we are not ready because document is being modified (see bug #11763)
+ * 3. The caret is outside of screen anyway.
+ */
+ if (p->view().busy()
+ || buffer_view_->buffer().undo().activeUndoGroup()
+ || !buffer_view_->caretInView())
return;
- caret_visible_ = false;
- //if (!qApp->focusWidget())
- p->viewport()->update();
+ if (caret_visible_)
+ updateCaretGeometry();
+ p->viewport()->update();
}
void dispatch(FuncRequest const & cmd0);
/// recompute the shape and position of the caret
void updateCaretGeometry();
- /// show the caret if it is not visible
- void showCaret();
+ /// show the caret if it is not visible. Same as \c hideCaret when \c show is false.
+ void showCaret(bool show = true);
/// hide the caret if it is visible
- void hideCaret();
+ void hideCaret() { showCaret(false); }
/// Set the range and value of the scrollbar and connect to its valueChanged
/// signal.
void updateScrollbar();