Improve the logic of caret repainting

For some reason the existing code only considered the bottom row that
contained the cursor. There is no need for that, and actually it
caused painting problems in nested insets.

Tweak the logic of repaint_caret_row_ a bit: there is no need for
repainting when there is currently no caret on screen.
This commit is contained in:
Jean-Marc Lasgouttes 2017-09-29 10:29:39 +02:00
parent d6aecbda0f
commit 764a153c69

View File

@ -3070,15 +3070,15 @@ void BufferView::draw(frontend::Painter & pain, bool paint_caret)
int const y = tm.first().second->position(); int const y = tm.first().second->position();
PainterInfo pi(this, pain); PainterInfo pi(this, pain);
CursorSlice const & bottomSlice = d->cursor_.bottom(); /** A repaint of the previous caret row is needed if there is
/** A repaint of the previous cursor row is needed if * caret painted on screen and either
* 1/ the caret will be painted and is is not the same than the * 1/ a new caret has to be painted at a place different from
* already painted one; * the existing one;
* 2/ the caret will not be painted, but there is already one on * 2/ there is no need for a caret anymore.
* screen.
*/ */
d->repaint_caret_row_ = (paint_caret && bottomSlice != d->caret_slice_) d->repaint_caret_row_ = !d->caret_slice_.empty() &&
|| (! paint_caret && !d->caret_slice_.empty()); ((paint_caret && d->cursor_.top() != d->caret_slice_)
|| ! paint_caret);
// Check whether the row where the cursor lives needs to be scrolled. // Check whether the row where the cursor lives needs to be scrolled.
// Update the drawing strategy if needed. // Update the drawing strategy if needed.
@ -3164,7 +3164,7 @@ void BufferView::draw(frontend::Painter & pain, bool paint_caret)
// Remember what has just been done for the next draw() step // Remember what has just been done for the next draw() step
if (paint_caret) if (paint_caret)
d->caret_slice_ = bottomSlice; d->caret_slice_ = d->cursor_.top();
else else
d->caret_slice_ = CursorSlice(); d->caret_slice_ = CursorSlice();
} }